MATLAB课程设计报告课题:语音信号采集与处理目录一、实践目的 (3)二、实践原理: (3)三、课题要求: (3)四、MATLAB仿真 (4)1、频谱分析: (4)2、调制与解调: (5)3、信号变化: (8)快放: (8)慢放: (8)倒放: (8)回声: (8)男女变声: (9)4、信号加噪 (10)5、用窗函数法设计FIR滤波器 (11)FIR低通滤波器: (12)FIR高通滤波器: (13)FIR带通滤波: (14)一、实践目的本次课程设计的课题为《基于MATLAB的语音信号采集与处理》,学会运用MATLAB的信号处理功能,采集语音信号,并对语音信号进行滤波及变换处理,观察其时域和频域特性,加深对信号处理理论的理解,并为今后熟练使用MATLAB进行系统的分析仿真和设计奠定基础。
此次实习课程主要是为了进一步熟悉对matlab软件的使用,以及学会利用matlab对声音信号这种实际问题进行处理,将理论应用于实际,加深对它的理解。
二、实践原理:利用MATLAB对语音信号进行分析和处理,采集语音信号后,利用MATLAB软件平台进行频谱分析;并对所采集的语音信号加入干扰噪声,对加入噪声的信号进行频谱分析,设计合适的滤波器滤除噪声,恢复原信号。
语音信号的“短时谱”对于非平稳信号, 它是非周期的, 频谱随时间连续变化, 因此由傅里叶变换得到的频谱无法获知其在各个时刻的频谱特性。
如果利用加窗的方法从语音流中取出其中一个短断, 再进行傅里叶变换, 就可以得到该语音的短时谱。
三、课题要求:○1利用windows 自带的录音机或者其它录音软件,录制几段语音信号(要有几种不同的声音,要有男声、女声)。
○2对录制的语音信号进行频谱分析,确定该段语音的主要频率范围,由此频率范围判断该段语音信号的特点(低沉or 尖锐)。
○3利用采样定理,对该段语音信号进行采样,观察不同采样频率(过采样、欠采样、临界采样)对信号的影响。
○4对采集到的语音信号进行调制与解调,观测调制与解调前后信号的变化。
○5实现语音信号的快放、慢放、倒放、回声、男女变声。
○6对语音信号加噪,然后进行滤波,分析不同的滤波方式对信号的影响。
○7利用MATLAB GUI 制作语音信号采集与分析演示系统。
四、MATLAB仿真1、频谱分析:用WINDOWS下的录音机,用单声道录制一段音乐或声音,时间在5S内。
然后MATLAB 软件平台下,利用函数WAVREAD对语音信号进行采样,记住采样频率和采样点数。
对语音信号进行快速傅立叶变换,在一个窗口同时画出信号的时域波形图和频谱图,分析语音信号的频谱特点程序:fs =22050;Nbits =16;[x,fs,Nbits] =wavread('D:\matlab\22hexian.wav') ; %读声音文件n=length(x);t=0:1/fs:(length(x)-1)/fs; %求出语音信号的长度y1=fft(x,n) ; %傅里叶变换y2=fftshift(y1); %对频谱图进行平移f=0:fs/n:fs*(n-1)/n; %得出频点subplot(2,1,1);plot(t/2,x) %做原始语音信号的时域图形title('原始信号时域波形图');subplot(2,1,2);plot(f,abs(y2));title('原始信号频谱图')仿真波形:○1门铃:○2和弦:○3男女声:2、调制与解调:首先画出语音信号的时域波形,然后对语音信号进行频谱分析。
在Matlab 中可以利用函数fft 对信号行快速傅里叶变换,得到信号的频谱特性,从而加深对频谱特性的理解。
程序:clear;dt=1/44100;fs=44100;[f1,fs,nbits]=wavread('D:\1huan.wav');figure(1);subplot(1,1,1);N=length(f1);t=0:1/fs:(N-1)/fs;plot(t,f1);title('信息信号的时域波形');fy1=fft(f1);w1=0:fs/(N-1):fs;figure(2);subplot(1,1,1);plot(w1,abs(fy1));title('信息信号的频谱');f2=cos(22000*pi*t);figure(3);subplot(1,1,1);fy2 = fft(f2);N2=length(f2);w2=fs/N*[0:N-1];plot(w2,abs(abs(fy2)));title('载波信号的频谱');f1=f1(:,1);f3=f1'.*f2;figure(4);subplot(1,1,1);fy3 = fft(f3);plot(w1,abs(abs(fy3)));title('已调信号的频谱');sound(f3,fs,nbits);f4=f3.*f2;figure(5);subplot(1,1,1);fy4=fft(f4);plot(w1,abs(abs(fy4)));title('解调信号的频谱');sound(f4,fs,nbits);fp1=0;fs1=5000;As1=100;wp1=2*pi*fp1/fs;ws1=2*pi*fs1/fs;BF1=ws1-wp1;wc1=(wp1+ws1)/2;M1=ceil((As1-7.95)/(2.286*BF1))+1; N1=M1+1;beta1=0.1102*(As1-8.7);Window=(kaiser(N1,beta1));b1=fir1(M1,wc1/pi,Window);figure(6);subplot(1,1,1);freqz(b1,1,512);title('FIR低通滤波器的频率响应');f4_low = filter(b1,1, f4);plot(t,f4_low);title('滤波后的解调信号时域波形');sound(f4_low,fs,nbits);f5=fft(f4_low);figure(7);subplot(1,1,1);plot(w1,abs(f5));title('滤波后的解调信号频谱'); 仿真波形:3、信号变化:快放:[x,fs,nbits]=wavread('D:\1huan.wav')w=2;M=w*fs;wavplay(x,M);慢放:[x,fs,nbits]=wavread('D:\1huan.wav')w=0.8M=w*fs;wavplay(x,M);倒放:[x,fs,Nbits]=wavread('D:\1huan.wav');y0=flipud(x);sound(y0,fs);回声:程序:[x,fs,bits]=wavread('D:\3yang.wav',[1 40000]);%读取语音信号n1=0:2000;b=x(:,1); %产生单声道信号N=3;yy2=filter(1,[1,zeros(1,80000/(N+1)),0.7],[b',zeros(1,40000)]);figure(3)subplot(2,1,1);plot(yy2); %三次回声滤波器时域波形title('三次回声滤波器时域波形');YY2=fft(yy2); %对三次回声信号做FFT变换subplot(2,1,2);plot(n1(1:1000),YY2(1:1000)); %三次回声滤波器频谱图title('三次回声滤波器频谱图');figure(4)subplot(2,1,1);plot(abs(YY2)); %经傅里叶变换之后的信号的幅值title('幅值');subplot(2,1,2);plot(angle(YY2)); %经傅里叶变换之后的信号的相位title('相位');sound(2*yy2,fs,bits);%经三次回声滤波器后的语音信号,乘以2是为了加强信号仿真波形:男女变声:Voice调用函数:function Y=voice(x,f) %更改采样率使基频改变f>1降低;f<1升高f=round(f*1000);d=resample(x,f,1000); %时长整合使语音文件恢复原来时长W=400;Wov=W/2;Kmax=W*2;Wsim=Wov;xdecim=8;kdecim=2; X=d';F=f/1000;Ss =W-Wov;xpts = size(X,2);ypts = round(xpts / F);Y = zeros(1, ypts);xfwin = (1:Wov)/(Wov+1);ovix = (1-Wov):0; newix = 1:(W-Wov);simix = (1:xdecim:Wsim) - Wsim;padX = [zeros(1, Wsim), X, zeros(1,Kmax+W-Wov)];Y(1:Wsim) = X(1:Wsim); lastxpos = 0; km = 0;for ypos = Wsim:Ss:(ypts-W)xpos = round(F * ypos);kmpred = km + (xpos - lastxpos);lastxpos = xpos;if (kmpred <= Kmax)km = kmpred;elseysim = Y(ypos + simix);rxy = zeros(1, Kmax+1);rxx = zeros(1, Kmax+1);Kmin = 0;for k = Kmin:kdecim:Kmaxxsim = padX(Wsim + xpos + k + simix);rxx(k+1) = norm(xsim);rxy(k+1) = (ysim * xsim');endRxy = (rxx ~= 0).*rxy./(rxx+(rxx==0));km = min(find(Rxy == max(Rxy))-1);endxabs = xpos+km;Y(ypos+ovix) = ((1-xfwin).*Y(ypos+ovix)) + (xfwin.*padX(Wsim+xabs+ovix));Y(ypos+newix) = padX(Wsim+xabs+newix);endend变声程序:[y,fs,nbits]=wavread('3yang.wav'); %读取声音文件x=y(:,1); %读入的y矩阵有两列,取第1列sound(voice(x,1.4),fs,nbits); %调整voice()第2个参数转换音调,>1降调,<1升调4、信号加噪程序:fs=22050; %语音信号采样频率为22050x1=wavread('3yang.wav'); %读取语音信号数据赋值给x1f=fs*(0:511)/1024; %将0到511,步长为1的序列的值与fs相乘并除以1024的值赋给ft=0:1/fs:(length(x1)-1)/fs; %将0到x1的长度减1后的值除以fs的值,且步长为1/fs的值,的序列的值,赋予tAu=0.05; %噪声幅值d=[Au*cos(2*pi*2000*t)]'; %干扰信号构建命令函数,构建了一个余弦函数x2=x1(:,1)+d; %取原始语音信号的单声部信号然后和噪声信号相加wavwrite(x2,22050,'jiazaoyang');%生成wav文件sound(x2,22050); %播放语音信号y1=fft(x1,1024); %对信号做1024点的FFT变换y2=fft(x2,1024);figure(1); %创建图形窗subplot(2,1,1);plot(t,x1); %做原始语音信号的时域波形title('加噪前的信号');xlabel('time n'); %x轴的名字是timeylabel('fuzhi n'); %y轴的名字是fuzhisubplot(2,1,2); %创建两行一列绘图区间的第1个绘图区间plot(t,x2)title('加噪后的信号');xlabel('time n');ylabel('fuzhi n');figure(2)subplot(2,1,1);plot(f,abs(y1(1:512)));title('原始语音信号频谱');xlabel('Hz');ylabel('fuzhi');subplot(2,1,2);plot(f,abs(y2(1:512)));title('加噪后的信号频谱');xlabel('Hz');ylabel('fuzhi');仿真波形:5、用窗函数法设计FIR滤波器根据过渡带宽及阻带衰减要求,选择窗函数的类型并估计窗口长度N(或阶数M=N-1),窗函数类型可根据最小阻带衰减As独立选择,因为窗口长度N对最小阻带衰减As没有影响,在确定窗函数类型以后,可根据过渡带宽小于给定指标确定所拟用的窗函数的窗口长度N,设待求滤波器的过渡带宽为Δw,它与窗口长度N近似成反比,窗函数类型确定后,其计算公式也确定了,不过这些公式是近似的,得出的窗口长度还要在计算中逐步修正,原则是在保证阻带衰减满足要求的情况下,尽量选择较小的N,在N和窗函数类型确定后,即可调用MATLAB中的窗函数求出窗函数wd(n)。