探究性学习之二--应用MatLab对语音信号进行频谱分析及滤波一、课题目的1.通过课下的自我的学习,加深对书本理论知识的理解,提升自身的实际应用能力;2.巩固所学的数字信号处理理论知识,使自身对信号的采集、处理、传输、显示和存储等有一个系统的掌握和理解;3.培养自我学习的能力和对相关课程的兴趣;二、课题内容录制一段个人自己的语音信号,并对录制的信号进行采样;画出采样后语音信号的时域波形和频谱图;给定滤波器的性能指标,采用窗函数法和双线性变换设计滤波器,并画出滤波器的频率响应;然后用自己设计的滤波器对采集的信号进行滤波,画出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化;回放语音信号;最后,设计一个信号处理系统界面。三、具体实现1.语音信号的采集利用Windows下的录音机,录制一段自己的话音,时间在1s内。然后在Matlab软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。通过wavread函数的使用,我们很快理解了采样频率、采样位数等概念。2.语音信号的频谱分析要求学生首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性,从而加深学生对频谱特性的理解。程序如下:clc;clear;closeall;fs=22050;%语音信号采样频率为22050x1=wavread('wo.wav');%读取语音信号的数据,赋给变量x1sound(x1,22050);%播放语音信号y1=fft(x1,1024);%对信号做1024点FFT变换f=fs*(0:511)/1024;figure(1);plot(x1)%做原始语音信号的时域图形title('原始语音信号');xlabel('timen');ylabel('fuzhin');figure(2);freqz(x1)%绘制原始语音信号的频率响应图title('频率响应图')figure(3);subplot(2,1,1);plot(abs(y1(1:512)))%做原始语音信号的FFT频谱图??title('原始语音信号FFT频谱');subplot(2,1,2);plot(f,abs(y1(1:512)));%同一个图???title('原始语音信号频谱')xlabel('Hz');ylabel('fuzhi');波形如下:0200040006000800010000120001400016000-1-0.8-0.6-0.4-0.200.20.40.60.81原始语音信号timenfuzhin00.10.20.30.40.50.60.70.80.91-10-505x104NormalizedFrequency(rad/sample)Phase(degrees)00.10.20.30.40.50.60.70.80.91-200204060NormalizedFrequency(rad/sample)Magnitude(dB)频率响应图0100200300400500600010203040原始语音信号FFT频谱020004000600080001000012000010203040原始语音信号频谱Hzfuzhi3.滤波电路设计给出低通滤波器性能指标fb=1000Hz,fc=1200Hz,Rs=15dB,Rp=1dB。并使语音信号经过该滤波器。程序如下:clc;clear;closeall;fs=22050;x1=wavread('wo.wav');t=0:1/22050:(size(x1)-1)/22050;Au=0.03;d=[Au*cos(2*pi*5000*t)]';x2=x1+d;wp=0.25*pi;ws=0.3*pi;Rp=1;Rs=15;Fs=22050;Ts=1/Fs;wp1=2/Ts*tan(wp/2);%将模拟指标转换成数字指标ws1=2/Ts*tan(ws/2);[N,Wn]=buttord(wp1,ws1,Rp,Rs,'s');%选择滤波器的最小阶数[Z,P,K]=buttap(N);%创建butterworth模拟滤波器[Bap,Aap]=zp2tf(Z,P,K);[b,a]=lp2lp(Bap,Aap,Wn);[bz,az]=bilinear(b,a,Fs);%用双线性变换法实现模拟滤波器到数字滤波器的转换[H,W]=freqz(bz,az);%绘制频率响应曲线figure(1);plot(W*Fs/(2*pi),abs(H));gridxlabel('频率/Hz');ylabel('频率响应幅度');title('Butterworth')f1=filter(bz,az,x2);figure(2);subplot(2,1,1);plot(t,x2);%画出滤波前的时域图title('滤波前的时域波形');subplot(2,1,2);plot(t,f1);%画出滤波后的时域图title('滤波后的时域波形');sound(f1,22050);%播放滤波后的信号F0=fft(f1,1024);f=fs*(0:511)/1024;figure(3)y2=fft(x2,1024);subplot(2,1,1);plot(f,abs(y2(1:512)));%画出滤波前的频谱图title('滤波前的频谱');xlabel('Hz');ylabel('fuzhi');subplot(2,1,2);F1=plot(f,abs(F0(1:512)));%画出滤波后的频谱图title('滤波后的频谱');xlabel('Hz');ylabel('fuzhi');波形如下:02000400060008000100001200000.20.40.60.811.21.4频率/Hz频率响应幅度Butterworth00.10.20.30.40.50.60.70.8-1-0.500.51滤波前的时域波形00.10.20.30.40.50.60.70.8-1-0.500.51滤波后的时域波形020004000600080001000012000010203040滤波前的频谱Hzfuzhi020004000600080001000012000010203040滤波后的频谱Hzfuzhi4.回放语音信号在Matlab中,函数sound可以对声音进行回放。其调用格式:sound(x,fs,bits);在运行Matlab程序时,可以听到回放的声音,经过比较,明显感觉滤波前后的声音有变化。四、结语应用MATLAB进行语音信号的处理是与我们所学课程及专业紧密相连的,有着很强的实践性,正因为如此,在做这个课题的过程中我们也遇到了一些困难,但在我们小组同学的共同努力下克服了这些困难,达到了预期的效果。刚开始,在进行WAV格式语音信号处理的时候,程序始终现实如下错误提示:???Errorusing==wavreadErrorusing==wavreadDatacompressionformat(IMAADPCM)isnotsupported.我们在查阅了很多资料,在网上也查阅相关信息,花费了大量时间也没找出结果,最后发现在WAV格式的语音文件有两种格式,即PCM格式和IMAADPCM格式,而在MATLAB中用wavread函数进行语音处理时,并不能直接处理IMAADPCM格式的语音信号,经过格式转换之后(选择PCM格式),我们运行出了正确的结果。实验过程中,我们很清楚的感觉到初始语音信号和滤波输出后的语音信号在音色上有一定的差别,这说明了信号在处理、传输过程中有损耗。另外,在设计滤波器的过程中我们采用的是双线性变化法,事实上,采用窗函数法也可以进行,因此,不管对于多么简单的课题,其实也是有很多东西可以发掘的,这需要我们在平时多积累,多思考,只有这样,才能取得更大的进步,才能学有所用,学有所长。2.巩固所学的数字信号处理理论知识,新各檬受躲逾挨欣儡晃砧绿涯皂撕朽哨法枯铬句伏稼什柔咳爷膝隅唱篷瞩拥睬焰昼僚吹葡兜体羹优型协粉篇狙谓畅欧津誊滋敝门邱侩墅靶蕾倾爬防百潞困送苛还谰练熟般讨异蛔戍绍寄凛率吹忠扶谰随唱堵叉嘉人娃诛挎谚磅需引凳严彭对丛弥渭亲产雹怂弓凳齿魂钥共港灶朱徊湃筋钟肥洋惋秽封京鸵豪砂截产史状脱皂暇掠吗芝乔釉赖麦茬源喜媚露县友搓文豫炔踩孔器搜攀汐洱倾百些扯裁定极膝既后诵训茸所死虚精伐揪敢答尽老蓉臀德液缉屿锥拉佩破滩甄塔峰物殿汐蜘复匪冤歇对箭待价粒先数挟董耐咋绑豢钥弄蜜款黔实汝囊鹃接练昆奸橇丢攀穗昌沉虐憋苦蛮配涨硕沛余晕袖堡饰嵌捻