本文第一部分先解释AR谱,但并不会给出太多的细节,第二部分介绍几种常见的语音中的特征。有些在之前的博文中已经用过。诸如过零率。

第三部分给出实际操作的过程及识别的效果。本文的目标是通过对DSP採集的声音信号提取特征,识别卡车和飞机。

转载请注明出处: xiahouzuoxin.github.io

关于AR谱

AR模型全称Auto-Regression Model,是通过參数计算信号功率谱的一种方法。在Matlab中计算AR谱非常easy:如果有一个1024个点的车辆信号x。

y = pyulear(x, 256, 128);

ARspectrum

AR谱的计算有2个重要的參数:系数阶数、FFT反变换的点数。AR谱是一种递推模型,即用前p个时刻的时域值预计当前第n时刻的值:

当中u(n)是噪声输入。系数阶数就是上式中的p。

牵扯到FFT,是由于功率谱的计算中能够使用FFT进行高速计算,因此就有离散FFT在单位圆上抽样点数的问题,功率谱的计算公式是:

上式中转化后有a0=1。将FFT计算扩充到N点后有a(p+1)...a(N-1)=0,FFT点数就是指的这里用于FFT计算的长度N。

AR谱是一个什么样的概念呢,首先我对功率谱的理解就是:不同频率处的能量值的大小,这个大小并不一定是真实的能量值,但不同频率的能量谱值的相对大小关系却接近真实值,因此不同频率处功率谱值的相对关系比其真实的谱值更重要。

比方,车辆在远处的时候能量相对较小,在近处的时候能量较大,但对于平稳的信号,尽管能量值不同。但都具有类似的谱包络,因此我们更关注的是谱在不同频率上的分布大小,就像概率一样。看在哪个频率值(或段)的功率谱大。

通过观察AR谱,我们能清晰的知道:基本的能量都集中在什么频率段,从而对信号进行分析主要关注这些频率段即可了。

AR谱的细节參见胡广书编著《数字信号处理》一书,其C实现參考我的Github项目,关于AR的基本理论參见之前的博文“现代数字信号处理——AR模型

音频信号特征提取

1 短时平均能量(Short Time Energy, STE)

当中N表示一帧的长度。

短时平均能量可用于推断静音帧。静音帧的短时能量小,这比直接通x(n)的最高幅值进行推断稳定性要高。对于静音帧,应该在兴许的处理之前去除。通常,语音比音乐含有很多其他的静音(人说话没有音乐那样着腔带调),因此,语音的平均能量的变化要比音乐中大非常多。

2 短时过零率(Short Time Zero-Corssing Rate, ZCR)

短时过零率是在一个音频帧内。离散採样信号值由负到正或由正到负的变换次数。

%20ZCR=\frac{1}{N}\sum_{m=0}^{N-1}|sgn[x_n(m+1)]-sgn[x_n(m)]|" data-bd-imgshare-binded="1" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" alt="" />

从某种程序上讲,过零率表达了信号的跳变速度,是频率的一种简单度量。

过零率与平均能量结合能用于语音端点检測。在博文自适应含噪信号过零率算法中也曾尝试改进过零率用于震动信号的识别。

3 子带能量比(Sub-band energy ratio, SER)

子带能量用于描写叙述主要能量的频域分布特征,其过程就是将频域等间隔划分成B个子带。在AR谱图上,对每一个子带范围进行积分就可求出子带能量Ei,则子带能量比就是

不同音频信号的能量分布不同,通过子带能量能区分能量的主要分布频带。子带能量比是一个非常好參数。用于识别频率能量分布不同的目标。

当然类似的思想也能够用到FFT频谱图上。

4 谱频率重心(Spectrum Centroid, SC)

将AR谱的幅值看做权值w,则谱频率重心的计算是:

%20SC=\frac{w_k*f_k}{\sum{w_k}},k=1,...N/2" data-bd-imgshare-binded="1" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" alt="" />

谱频率重心是通过谱峰统计的中心,并不会(当然也可能等于)等于AR谱主峰相应的频率。

5 带宽(Band Width, BW)

带宽指信号谱值下降到中心频率谱值的0.707处的高低频率差BW=fH-fL。

基于支持向量机的识别

卡车和飞机的主频位置可能存在不同。所以使用声音信号AR谱的最高峰值相应的频率Fmax作为一个特征维度;另外使用谱频率重心和子带能量比分别作为特征的另两个维度。因此,最后组合特征为{Fmax,SC,SER}。

值得注意的是。本文使用的谱频率重心不是简单的对全部频域进行统计计算,而是:

  1. 先对频谱org_psd进行从高到低排序,排序后的psd以及相应的频率索引为idx

  2. 选择部分具有高的谱值(这些谱值的和占整个频域谱值和的0.707)进行频谱重心计算,这样能避免一些高频噪声的影响。

识别使用支持向量机(SVM)模型。关于支持向量机,对于没太多基础的能够參考July的博文支持向量机通俗导论(理解SVM的三层境地),有一点基础的能够看看林智仁老师的讲义,这里使用的工具箱就是林智仁的LibSVM,能够从软件主页http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html 中下载到。

实际操作通过自己设计的DSP+FPGA控制AD7606採集声音信号。将声音信号上传到PC的matlab上进行训练,提取特征。非常重要的一点是:使用分类算法(比方这里的LibSVM支持向量机或其他的如神经网络等)进行分类的前提是数据本身可分。例如以下为卡车和飞机的特征可视化结果。从图中能够看出,两类样本使用上面构造的特征可分。因此才干够接着做识别的工作。

特征

使用LibSVM训练。核函数使用RBF。效果一般比其他的要好一些。这里大部分參数默认(主要有gamma和C參数)。要使用LibSVM获得好的效果,请參考我的还有一篇博文“LibSVM笔记系列(2)——怎样提升LibSVM分类效果”。主要是一些关于怎样搜索获得最佳參数的方法。

实验总共数据1400组,卡车和飞机各选200组用于训练(代码为实际代码的一部分。由于其他原因,临时无法公开代码)。

n_trian = 200;

label_car = zeros(length(car_feat),1);
label_plane = ones(length(plane_feat),1); instance = [car_feat(idx,1:n_trian) plane_feat(idx,1:n_trian)]; % idx表示第idx维的特征
instance = instance';
label = [label_car(1:n_trian); label_plane(1:n_trian)];
model = svmtrain(label, instance, '-s 0 -t 2'); % SVM训练结果为model模型,这个模型将用于以下的预測

其余的1000组用于測试。

tests = [car_feat(idx,(n_trian+1):end) plane_feat(idx,(n_trian+1):end)];
test_label = [label_car((n_trian+1):end); label_plane((n_trian+1):end)];
tests = tests';
pd_label = svmpredict(test_label, tests, model);
fprintf('\n识别正确率%.4f\n', length(pd_label(test_label==pd_label))/length(test_label));

最后的预測结果例如以下:

识别结果

预測正确率达到86.50%。能使用到到实际当中。

基于AR谱特征的声目标识别的更多相关文章

  1. Mol Cell Proteomics. | Prediction of LC-MS/MS properties of peptides from sequence by deep learning (通过深度学习技术根据肽段序列预测其LC-MS/MS谱特征) (解读人:梅占龙)

    通过深度学习技术根据肽段序列预测其LC-MS/MS谱特征 解读人:梅占龙  质谱平台 文献名:Prediction of LC-MS/MS properties of peptides from se ...

  2. 基于点线特征的Kinect2实时环境重建(Tracking and Mapping)

    前言 个人理解错误的地方还请不吝赐教,转载请标明出处,内容如有改动更新,请看原博:http://www.cnblogs.com/hitcm/ 如有任何问题,feel free to contact m ...

  3. Javascript基于对象三大特征 -- 冒充对象

    Javascript基于对象三大特征 基本概述 JavaScript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance ) ...

  4. 基于XML文档的声明式事务配置

    <!-- 配置事务切面 --> <aop:config> <aop:pointcut expression="execution(* com.atguigu.t ...

  5. Burger King使用RayOnSpark进行基于实时情景特征的快餐食品推荐

    作者:Luyang Wang, Kai Huang, Jiao Wang, Shengsheng Huang, Jason Dai 基于深度学习的推荐模型已广泛应用于各种电商平台中,为用户提供推荐.目 ...

  6. 基于IG的特征评分方法

    本文简单介绍了熵.信息增益的概念,以及如何使用信息增益对监督学习的训练样本进行评估,评估每个字段的信息量. 1.熵的介绍       在信息论里面,熵是对不确定性的测量.通俗来讲,熵就是衡量随机变量随 ...

  7. 译:Local Spectral Graph Convolution for Point Set Feature Learning-用于点集特征学习的局部谱图卷积

    标题:Local Spectral Graph Convolution for Point Set Feature Learning 作者:Chu Wang, Babak Samari, Kaleem ...

  8. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  9. Kaggle "Microsoft Malware Classification Challenge"——就是沙箱恶意文件识别,有 Opcode n-gram特征 ASM文件图像纹理特征 还有基于图聚类方法

    使用图聚类方法:Malware Classification using Graph Clustering 见 https://github.com/rahulp0491/Malware-Classi ...

随机推荐

  1. OAuth - 第三方登录的原理

    第三方登录的原理 所谓第三方登录,实质就是 OAuth 授权.用户想要登录 A 网站,A 网站让用户提供第三方网站的数据,证明自己的身份.获取第三方网站的身份数据,就需要 OAuth 授权. 举例来说 ...

  2. [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)

    最近有个任务:利用 RNN 进行句子补全,即给定一个不完整的句子,预测其后续的字词.本文使用了 Seq2Seq 模型,输入为5个中文字词,输出为一个中文字词. 目录 关于RNN 语料预处理 搭建数据集 ...

  3. 笔试算法题(30):从已排序数组中确定数字出现的次数 & 最大公共子串和最大公共序列(LCS)

    出题:在已经排序的数组中,找出给定数字出现的次数: 分析: 解法1:由于数组已经排序,所以可以考虑使用二分查找确定给定数字A的第一个出现的位置m和最后一个出现的位置n,最后m-n+1就是A出现的次数: ...

  4. 小甲鱼python疑难点

    1.python生成器 2.while 1: num = input('请输入一个整数(输入Q结束程序):') if num != 'Q': num = int(num) print('十进制 -&g ...

  5. virtualenvwrapper.sh: There was a problem running the initialization hooks. If Python could not import the module virtualenvwrapper.hook_loader, check that virtualenvwrapper.........(解决办法)

    Linux(ubuntu)上python2与python3共存环境下,安装virtualenvwrapper后, 其环境变量被自动设置为VIRTUALENVWRAPPER_PYTHON=/usr/bi ...

  6. 语法,if,while循环,for循环

    目录 一.语法 二.while循环 三.for循环 一.语法 if: if判断其实是在模拟人做判断.就是说如果这样干什么,如果那样干什么.对于ATM系统而言,则需要判断你的账号密码的正确性. if 条 ...

  7. 74-A/D指标,Accumulation/Distribution,积累/派发线,离散指标.(2015.7.1)

    A/D指标,Accumulation/Distribution 积累/派发线,离散指标 观井映天 2015.7.1

  8. [转] angular2-highcharts用法详解

    1. 使用npm安装angular2-highcharts npm install angular2-highcharts --save 2.主模块中引入 app.module.ts import { ...

  9. 用C# ASP.net将数据库中的数据表导出到Excel中

    需要用到组件GridView和一个button即可. 给GridView添加一个数据源, 选择你想要的数据库中的表的字段,添加成功后GridView中就显示数据. 再添加一个button,双击控件添加 ...

  10. 第五章、 Linux 常用網路指令

    http://linux.vbird.org/linux_server/0140networkcommand.php     第五章. Linux 常用網路指令 切換解析度為 800x600 最近更新 ...