声音的采集和分析.docx
《声音的采集和分析.docx》由会员分享,可在线阅读,更多相关《声音的采集和分析.docx(11页珍藏版)》请在冰豆网上搜索。
声音的采集和分析
1.摘要
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
本次设计利用Matlab设计实现语音信号采集处理软件,通过MIC实时录制并分析语音信号,包括实时显示信号波形、计算信号的频谱等,并利用MATLAB信号处理工具箱可以有效快捷地设计数字滤波器进行滤波处理。
关键字:
matlab语音信号采集和分析波形滤波处理
2对声音进行采集分析
2.1声音的采集
Matlab函数库中的analoginput()函数可以实现对模拟信号的采集,这种模拟信号可以是声音信号,电压、电流信号等。
通过定义ai=analoginput(‘ADAPTOR’),可以建立模拟信号采集的对象,其中ADAPTOR=’winsound’,即建立了声音信号采集的对象。
对建立的声音信号采集对象要进行声音采集的属性参数设置。
ADDchannel(ai,1)设置采集声音的通道数,1表示单声道,【12】则表示立体声道。
Set(ai,’samplesrate’,value)设置声音信号采集的采样频率,value的取值根据实际情况进行确定,但必须满足采样定理,通常的取值有value=8000、16000、44100等;set(ai,’samplespertrigger’,value)设置采集声音信号的长度;set(ai,’triggertype’,’value’)设置声音信号采集的触发方式,触发方式主要有三种:
立即触发、手工触发和软件触发,软件触发有可以分为信号上升沿触发、下降沿触发等,需要根据不同的实际情况选择合适的触发方式。
执行stare(ai)函数打开声音信号采集的对象,一旦满足触发条件就立即采集声音信号,函数getdata(ai)可持续进行采集声音信号的是与特征值,delete(ai)函数删除声音信号采集的对象。
一次执行上面的函数就能实现对声音的采集
声音采集的程序:
ai=analoginput('winsound');
addchannel(ai,1);
ai.samplerate=8000;
ai.samplespertrigger=30000;
ai.triggertype='immediate';
start(ai);
[data,time]=getdata(ai);
plot(data);
title('shiyu');
xlabel('time');
ylabel('data');
gridon;
2.2声音信号的频谱分析
将时域信号进行FFT分析,FFT即为快速傅氏变换的快速算法,它是根据离散傅氏变换的特性对离散傅里叶变换进行改进获得的。
在matlab的信号处理工具箱中函数FFT和IFFT用于快速福利叶变换和逆变换。
函数FFT用于序列的快速福利叶变换,其中点用的格式是y=fft(x),其中x为一向量,y是x的FFT且和x长度相同;若x为一矩阵,则y是对矩阵的每一列向量进行FFT。
对声音信号进行频谱分析的程序:
F=fft(data);
f1=angle(data);
N=length(time);
w=[1:
N].*5/N;
plot(w,abs(F));
2.3对声音信号的滤波处理
滤波器是一种用来消除干扰杂讯的器件,将输入或输出经过过滤而得到纯净的交流电。
您可以通过基本的滤波器积木块----二阶通用滤波器传递函数,推导出最通用的滤波器类型:
低通、带通、高通、帯阻和椭圆型滤波器。
本次设计采用巴特沃斯IIR滤波器对声音信号进行滤波。
其中:
Wp表示通带截止频率;Ws表示阻带截止频率,Rp表示通带纹波系数;Rs表示阻带纹波系数;N表示滤波器最小阶数;Wn表示截止频率。
b,a分别表示阶次为N+1的数字滤波器系统传递函数的分子和分母多项式系数向量;Fs为采样频率;n为在区间[OFs]频率范围内选取的频率点数;f记录频率点数。
n取2的幂次方,可以提高运算的速度,因为freqz函数采用基2的FFT算法。
ftype=high时,为高通滤波器;ftype=bandpass时,为带通滤波器;ftype=stop时,为带阻滤波器。
巴特沃斯模拟低通滤波器设计步骤:
1)根据技术指标αp、
Ωp、αs和Ωs,用式(3.20)求出滤波器的阶数N。
按照式(3.19),求出归一化极点pk,将pk代入式(3.18),得到归一化传输函数Ha(p)。
式(3.18)
式(3.19)
式(3.20)
2)将Ha(p)去归一化。
将p=s/Ωc代入Ha(p),得到实际的滤波器传输函数Ha(s)。
如果技术指标没有给出3db截止频率Ωc,可以按照式(3.21)或(3.22)求出。
式(3.21)
式(3.22)
3)根据如上设计的巴特沃斯模拟低通滤波器,采用脉冲响应不变法将其变成数字滤波器,步骤如下:
0.1根据式(3.23)确定数字低通滤波器的数字指标,即通带截止频率ωp、通带衰减αp、阻带截止频率ωs、阻带衰减αs。
式(3.23)
0.2将模拟低通滤波器Ha(s)从s平面转换到z平面,得到数字滤波系统函数H(z),转换公式如式(7)所示。
式(3.24)
0.3为避免产生频率混叠现象,要求所设计的模拟低通带限于
之间,由于实际滤波器都有一定宽度过渡带,可选择T满足公式
,即认为混叠现象较小,可达到要求。
4)利用在MATLAB设计IIR数字滤波器可分以下几步来实现
(1)按一定规则将数字滤波器的技术指标转换为模拟低通滤波器的技术指标。
(2)根据转换后的技术指标使用滤波器阶数函数,确定滤波器的最小阶数N和截止频率Wc。
(3)利用最小阶数N产生模拟低通滤波原型。
(4)利用截止频率Wc把模拟低通滤波器原型转换成模拟带通原型。
(5)利用脉冲响应不变法把模拟滤波器转换成数字滤波器。
5)程序中涉及到的函数介绍
Buttord
[N,wc]=buttord(wp,ws,αp,αs)
调用参数wp,ws分别为数字滤波器的通带、阻带截止频率的归一化值,要求:
0≤wp≤1,0≤ws≤1。
1表示数字频率pi。
αp,αs分别为通带最大衰减和组带最小衰减(dB)。
当ws≤wp时,为高通滤波器;
当wp和ws为二元矢量时,为带通或带阻滤波器,这时wc也是二元向量。
N,wc作为butter函数的调用参数。
[N,Wc]=buttord(Wp,Ws,Ap,As,'s')
用于计算巴特沃斯模拟滤波器的阶数N和3dB截止频率Ωc。
Butter
功能:
利用butter函数直接设计各种形式的数字滤波器(也可以设计模拟滤波器)
[B,A]=BUTTER(N,Wn),设计一个阶数为n,频率为Wn的低通滤波器;
[B,A]=BUTTER(N,Wn,ftype)可以设计高通,带阻滤波器,其中ftype参数的形式可以指定何种滤波器,
ftype为‘high’时,设计一个阶数为n,频率为Wn的高通滤波器;ftype为‘stop’时,得到滤波器阶数为2*n,频率范围为Wn=[W1,W2]的带阻滤波器;
[Z,P,K]=BUTTER(...),若返回值是三个,则分别是滤波器的零点,极点和增益,其他函数的参数同上面。
Plot(X,Y)
功能:
绘制线性二维图形
当X,Y均为实数向量时,并且为维数相同,X=[X(i)],Y=[Y(i)],则plot(X,Y)先描述点(X(i),Y(i)),然后依次画线;
当X,Y均为复数向量时,则不考虑虚数部分;
当X,Y均为实数矩阵时,并且为维数相同,plot依次按照对应的列画出线,矩阵有几列就有几条线;
当X,Y一个为向量,一个为矩阵时,并且向量的维数等于矩阵的行数或者列数,则把矩阵按照向量的方向分解为几个向量,在与向量配对分别画图,矩阵分解几个向量就有几条线。
Gridon
2维/3维绘图设置网格线
grid
功能:
来设置当前坐标系的网格线的开/闭。
gridon
功能:
对当前坐标系添加主要网格线。
grid(axes_handle,...)
输入:
axes_handle——坐标系句柄
功能:
对指定的坐标系设置网格线是否显示。
Impinvar
[D,C]=impinvar(B,A,fs);%调用脉冲响应不变法
Filter
功能:
FILTER是一维数字滤波器
Y=FILTER(B,A,X),输入X为滤波前序列,Y为滤波结果序列,B/A提供滤波器系数,B为分子,A为分母
整个滤波过程是通过下面差分方程实现的:
a
(1)*y(n)=b
(1)*x(n)+b
(2)*x(n-1)+...+b(nb+1)*x(n-nb)-a
(2)*y(n-1)-...-a(na+1)*y(n-na)
[Y,Zf]=FILTER(B,A,X,Zi),输入X为滤波前序列,Y为滤波结果序列,B/A提供滤波器系数,B为分子,A为分母,并输入Zi指定X的初始状态,Zf为最终状态矢量
程序如下:
Fp=1200;%阻带截止频率
Fs=800;%通带截止频率
Ft=8000;%采集频率
As=20;
Ap=1;
Wp=2*pi*Fp/Ft;
Ws=2*pi*Fs/Ft;
Fp=2*Ft*tan(Wp/2);
Fs=2*Ft*tan(Ws/2);
[n,wn]=buttord(Wp,Ws,Ap,As,'s');
[b,a]=butter(n,wn,'s');
[num,den]=bilinear(b,a,1);
[h,w]=freqz(num,den);
bu=filter(b,a,F);
figure;
plot(time,bu);
grid;
xlabel('频率');
ylabel('频率响应幅度');
title('IIR滤波器');
3.总程序:
ai=analoginput('winsound');
addchannel(ai,1);
ai.samplerate=8000;
ai.samplespertrigger=30000;
ai.triggertype='immediate';
start(ai);
[data,time]=getdata(ai);
figure;
plot(data);
title('shiyu');
xlabel('time');
ylabel('data');
gridon
F=fft(data);
f1=angle(data);
N=length(time);
w=[1:
N].*5/N;
figure;
plot(w,abs(F));
Fp=1200;%阻带截止频率
Fs=1100;%通带截止频率
Ft=8000;%采集频率
As=20;
Ap=1;
Wp=2*pi*Fp/Ft;
Ws=2*pi*Fs/Ft;
Fp=2*Ft*tan(Wp/2);
Fs=2*Ft*tan(Ws/2);
[n,wn]=buttord(Wp,Ws,Ap,As,'s');
[b,a]=butter(n,wn,'s');
[num,den]=bilinear(b,a,1);
[h,w]=freqz(num,den);
bu=filter(b,a,F);
figure;
plot(time,bu);
grid;
xlabel('频率');
ylabel('频率响应幅度');
title('滤波器滤波');
4.运行后的波形:
时域图:
频域图:
滤波后:
5.总结:
语音信号处理是语音学与数字信号处理技术相结合的交叉学科,课题在这里不讨论语音学,而是将语音当做一种特殊的信号,即一种“复杂向量”来看待。
这里就是把语音做为存储于计算机中的语音信号,其本身就是离散化了的向量,我们只需将这些离散的量提取出来,就可以对其进行处理了。
这一过程的实现,用到了处理数字信号的强有力工具MATLAB。
通过MATLAB里几个命令函数的调用,很轻易的在实际语音与数字信号的理论之间搭了一桥。
6.参考文献
1.谢平、王娜、林洪斌等主编,信号处理原理及应用。
北京:
机械工业出版社,2008.10
2.宋爱国、刘文波等主编,测试信号分析与处理。
北京:
机械工业出版社,2005,9
3.聂祥飞、王海宝、谭泽富主编,Matlab程序设计及其在信号处理中的应用。
成都:
西南交通大学出版社,2005
4.吴大正、高西全等主编,Matlab及在电子信息课程中的应用。
北京:
电子工业出版社,2006.3
5.李培芳、孙晖、李江主编,信号与系统分析基础。
北京:
清华大学出版社,2006.12
,2004.10