目 录
1.课程设计目的………………………………………………………………(4)
2.课程设计基本要求……………………………………………...………….(4)
3.课程设计内容………………………………………..……………………..(4)
4.课程设计实现……………………………………………………..…..……………(4)
(1)语音信号的采集……………………………………………………..(4)
(2)语音信号的时频分析………………………………………………..(5)
(3)语音信号加噪与频谱分析…………………………………………..(5)
(4)设计 FIR 和 IIR 数字滤波器………………………………………..(8)
(5)用滤波器对加噪语音信号进行滤波……………………………….
(6)比较滤波前后语音信号的波形及频谱…………………
(7)回放语音信号……………………………………….
5、心得体会……………………………………………..……………………..(11)
6、参考文献…………………………………….……………………………..(11)
基于 MATLAB 的有噪声的语音信号分析与处理设计
1.课程设计目的
综合运用数字信号处理的理论知识对语音信号进行时频分析和滤波器设计,
通过理论推导得出相应结论,再利用 MATLAB 作为编程工具进行计算机实现,从
而加深对所学知识的理解,建立概念。
2.课程设计基本要求
1 ) 学会 MATLAB 的使用,掌握 MATLAB 的程序设计方法。
2 ) 掌握在 Windows 环境下语音信号采集的方法。
3 ) 掌握数字信号处理的基本概念、基本理论和基本方法。
4 ) 掌握 MATLAB 设计 FIR 和 IIR 数字滤波器的方法。
5 ) 学会用 MATLAB 对信号进行分析和处理。
3.课程设计内容
1)选择一个语音信号作为分析对象,或录制一段语音信号;
2)对语音信号进行采样,画出采样后语音信号的时域波形和频谱图;
3)利用 MATLAB 中的随机函数产生噪声加入到语音信号中,使语音信号被污
染,然后进行频谱分析;
4)设计 FIR 和 IIR 数字滤波器,并对被噪声污染的语音信号进行滤波,画出
滤波前后信号的时域波形和频谱,并对滤波前后的信号进行比较,分析信
号的变化;
5)回放语音信号。
4.课程设计实现
(1)语音信号的采集
利用PC 机上的声卡和WINDOWS 操作系统可以进行数字信号的采集。将话筒
输入计算机的语音输入插口上,启动录音机。按下录音按钮,接着对话筒说话“语
音信号处理”,说完后停止录音,屏幕左侧将显示所录声音的长度。点击放音按钮,
可以实现所录音的重现。以文件名“speech”保存入g :\ MATLAB \ work 中。
可以看到,文件存储器的后缀默认为. wav ,这是WINDOWS 操作系统规定的声音文
件存的标准。
(2)语音信号的时频分析
Matlab软件平台下,利用wavread函数对语音信号进行采样,记住采样频率
和采样点数
Wavread 函数调用格式
y=wavread(file)%读取 file 所规定的 wav 文件,返回采样值放在向量 y
中。
[y,fs,nbits]=wavread(file) %采样值放在向量 y 中,fs 表示采样频率
(hz),nbits 表示采样位数。
y=wavread(file,N)%读取钱 N 点的采样值放在向量 y 中。
y=wavread(file,[N1,N2])%读取从 N1 到 N2 点的采样值放在向量 y 中。
对语音信号 speech.wav 进行采样其程序如下:
[y,fs,nbits]=wavered ('speech');
%把语音信号进行加载入 Matlab
仿真软件平台中
fs =
nbits =
8000
16
首先画出语音信号的时域波形,然后对语音信号进行频谱分析。在 matlab
中利用 fft 对信号进行快速傅里叶变换,得到信号的频谱特性。
其程序如下:
[y,fs,nbits]=wavread ('speech');
sound(y,fs,nbits); %回放语音信号
n = length (y) ;
Y=fft(y,n);
subplot(2,1,1);plot(y);title('原始信号波形');
subplot(2,1,2);plot(abs(Y));title('原始信号频谱')
%求出语音信号的长度
%傅里叶变换
程序结果如下图:
(3)语音信号加噪与频谱分析
利用MATLAB中的随机函数(rand或randn)产生噪声加入到语音信号中,模仿
语音信号被污染,并对其频谱分析。
其程序如下:
%求出语音信号的长度
[y,fs,nbits]=wavread ('speech');
n = length (y) ;
noise=0.01*randn(n,2); %随机函数产生噪声
s=y+noise;
%语音信号加入噪声
sound(s);
subplot(2,1,1);
plot(s);title('加噪语音信号的时域波形');
S=fft(s);
subplot(2,1,2);
plot(abs(S));title('加噪语音信号的频域波形')
%傅里叶变换
程序结果如下图:
(4) 设计 FIR 和 IIR 数字滤波器
根据语音信号的特点给出有关滤波器的新能指标:
1 低通滤波器的性能指标
fp=1000Hz,fc=1200Hz,As=50db ,Ap=1dB
2 高通滤波器的性能指标
fp=3500Hz,fc=4000Hz,As=50dB,Ap=1dB;
3 带通滤波器的性能指标
fp1=1200Hz,fp2=3000hZ,fc1=1000Hz,fc2=3200Hz,
As=50dB,Ap=1dB
在 Matlab 中,可以利用函数 fir1 设计 FIR 滤波器,利用函数 butter,cheby1
和 ellip 设计 IIR 滤波器,利用 Matlab 中的函数 freqz 画出各步步器的频率响应。
分析如下:函数 fir1 默认的设计滤波器的方法为窗函数法,其中可选的窗函
数有 Rectangular Barlrtt Hamming Hann Blackman 窗,其相应的都有实现函数。
函数 butter,cheby1 和 ellip 设计 IIR 滤波器时都是默认的双线性变换法,所
以在设计滤波器时只需要代入相应的实现函数即可。
IIR 低通:
Ft=8000;
Fp=1000;
Fs=1200;
wp=2*pi*Fp/Ft;
ws=2*pi*Fs/Ft;
fp=2*Ft*tan(wp/2);
fs=2*Fs*tan(wp/2);
[n11,wn11]=buttord(wp,ws,1,50,'s'); %求低通滤波器的阶数和截止频率
[b11,a11]=butter(n11,wn11,'s');
[num11,den11]=bilinear(b11,a11,0.5); %利用双线性变换实现频率响应 S 域到 Z 域
的变换
[h,w]=freqz(num11,den11); %根据参数求出频率响应
plot(w*8000*0.5/pi,abs(h));
legend('用 butter 设计');
grid
%求 S 域的频率响应的参数
IIR 带通:
Fp1=1200;
Fp2=3000;
Fs1=1000;
Fs2=3200;
Ft=8000;
wp1=tan(pi*Fp1/Ft); %带通到低通滤波器的转换
wp2=tan(pi*Fp2/Ft);
ws1=tan(pi*Fs1/Ft);
ws2=tan(pi*Fs2/Ft);
w=wp1*wp2/ws2;
bw=wp2-wp1;
wp=1;
ws=(wp1*wp2-w.^2)/(bw*w);
[n12,wn12]=buttord(wp,ws,1,50,'s'); %求低通滤波器阶数和截止频率
[b12,a12]=butter(n12,wn12,'s'); %求 S 域的频率响应参数
[num2,den2]=lp2bp(b12,a12,sqrt(wp1*wp2),bw);%将 S 域低通参数转为带通的
[num12,den12]=bilinear(num2,den2,0.5);%利用双线性变换实现频率响应 S 域到 Z
域的转换
[h,w]=freqz(num12,den12);%根据参数求出频率响应
plot(w*8000*0.5/pi,abs(h));
axis([0 4000 0 1.5]);
legend('用 butter 设计');
grid;
IIR 高通:
Ft=8000;
Fp=4000;
Fs=3500;
wp1=tan(pi*Fp/Ft);%高通到低通滤波器参数转换
ws1=tan(pi*Fs/Ft);
wp=1;
ws=wp1*wp/ws1;
[n13,wn13]=cheb1ord(wp,ws,1,50,'s'); %求模拟的低通滤波器阶数和截止频率
[b13,a13]=cheby1(n13,1,wn13,'s'); %求 S 域的频率响应的参数
[num,den]=lp2hp(b13,a13,wn13);%将 S 域低通参数转为高通的
[num13,den13]=bilinear(num,den,0.5); %利用双线性变换实现频率响应 S 域到 Z 域
转换
[h,w]=freqz(num13,den13);
plot(w*21000*0.5/pi,abs(h));
title('IIR 高通滤波器');
legend('用 cheby1 设计');
axis([0 12000 0 1.5]);
grid;
FIR 低通
用窗函数设计低通滤波器的程序如下:
Ft=8000;
Fp=1000;
Fs=1200;
wp=2*Fp/Ft;
ws=2*Fs/Ft;
rp=1;
rs=50;
p=1-10.^(-rp/20); %通带阻带波纹
s=10.^(-rs/20);
fpts=[wp ws];
mag=[1 0];
dev=[p s];
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev);%由 kaiserord 求滤波器的阶数和截
止频率
b21=fir1(n21,wn21,Kaiser(n21+1,beta)); %由 fir1 设计滤波器
[h,w]=freqz(b21,1);
plot(w/pi,abs(h));
title('FIR 低通滤波器');
grid;
%得到频率响应