
——基于MATLAB的声音信号频谱分析
1.课程设计目的
综合运用数学信号处理的理论知识进行语音信号的频谱分析,通过理论推导得出相应结论,再利用MATLAB作为编程工具进行计算机实现,从而加深对所学知识的理解,建立概念。
2.理解设计基本要求
1)熟悉离散信号和系统的时域特性。
2)熟悉线性卷积和相关的计算编程方法。
3)掌握序列傅里叶变换的计算机实现方法,利用序列傅里叶变换对离散信号、系统和系统的响应进行频域分析。
4)学会MATLAB的使用,掌握MATLAB的程序设计方法。
5)利用MATLAB对wav文件进行频谱分析。
6)分别用不同的滤波器对加噪语音信号进行滤波,选择最佳滤波器。
3.课程设计内容
选择一个wav文件作为分析的对象,或录制一段语音信号,对其进行频谱分析,分别对加噪前后的语音信号进行频谱分析,再通过不同滤波器根据信号的频谱特点重构语音信号,选出最佳滤波方案。
4.课程设计实现步骤
(1)语音信号的获取
选择一个wav文件作为分析的对象,可以利用Windows下的录音机或其他软件,录制一段自己的话音,在MATLAB中,[y,fs,bits]=wavread('Blip',[N1 N2]);用于读取语音,采样值放在向量y中,fs表示采样频率(Hz),bits表示采样位数。[N1 N2]表示读取的值从N1点到N2点的值。
sound(y); 用于对声音的回放。向量y则就代表了一个信号,也即一个复杂的“函数表达式”,也可以说像处理一个信号的表达式一样处理这个声音信号。
下面是语音信号在MATLAB中的语言程序,它实现了语音的读入与打开,并绘出了语音信号时域波形,然后对语音信号进行频谱分析。在MATLAB中,可以利用函数fft对信号进行快速傅里叶变化,得到信号的频谱特性。
在频谱特性中分析最大值的位置(可能有几个),它代表的频率和时域的采样时间有关,相邻的两点之间的距离为。其中,N是离散傅里叶变换用的点数,是采样的时间,前面在读取 wav文件时得到了采样频率。
既然知道了该声波的频谱,按频率就可以反演它的时域值,利用以上分析的主要峰值来重构声波。由于没有考虑相位和其他的频谱分量,所以波形和原来的波形相差甚大,但大体的频率是没有错的。
fs=25600; %语音信号采样频率为25600
[x,fs,bits]=wavread('C:\\Documents and Settings\\Administrator\桌面\语音\音频.wav');
sound(x,fs,bits); %播放语音信号
y1=fft(x,4096); %对信号做2048点FFT变换
f=fs*(0:2047)/4096;
figure(1)
magy1=abs(y1);
angy1=angle(y1);
subplot(3,1,1),plot(x);title('原始信号波形')
subplot(3,1,2),plot(magy1);title('原始信号幅值')
subplot(3,1,3),plot(angy1);title('原始信号相位')
figure(2)
freqz(x) %绘制原始语音信号的频率响应图
title('频率响应图')
figure(3)
plot(f,abs(y1(1:2048)));
title('原始语音信号频谱')
xlabel('Hz');
ylabel('fudu');
axis([0 4500 0 400])
(2)wav语音信号加噪声
在MATLAB软件平台下,给原始的语音信号叠加上噪声,噪声类型分为如下几种:(1)单频噪色(正弦干扰);(2)高斯随机噪声。绘出加噪声后的语音信号时域和频谱图,在视觉上与原始语音信号图形对比,也可通过Windows播放软件从听觉上进行对比,分析并体会含噪语音信号频谱和时域波形的改变。本实验采用正弦干扰。
clc;
clear;
fs=22050; %语音信号采样频率为22050
[x,fs,bits]=wavread('C:\\Documents and Settings\\Administrator\桌面\语音\音频.wav'); %读取语音信号的数据,赋给变量x
y1=fft(x,4096); %对信号做4096点FFT变换
f=fs*(0:511)/4096;
t=(0:length(x)-1)/22050;
x1=[0.05*sin(2*pi*10000*t)]';
x2=x+x1;
sound(x2,fs,bits);
figure(1)
subplot(2,1,1)
plot(x) %做原始语音信号的时域图形
title('原语音信号时域图')
subplot(2,1,2)
plot(x2) %做原始语音信号的时域图形
title('加高斯噪声后语音信号时域图')
xlabel('time n');
ylabel('fudu');
y2=fft(x2,4096);
figure(2)
subplot(2,1,1)
plot(abs(y1))
title('原始语音信号频谱');
xlabel('Hz');
ylabel('fudu');
subplot(2,1,2)
plot(abs(y2))
title('加噪语音信号频谱');
xlabel('Hz');
ylabel('fudu');
axis([0 4500 0 300]);
wavwrite(x2,fs,'C:\\Documents and Settings\\Administrator\桌面\语音\加噪.wav');
(3)巴特沃斯低通滤波
对加入高斯随机噪声和正弦噪声的语音信号进行滤波。用双线性变换法设计了巴特沃斯数字低通IIR滤波器对两加噪语音信号进行滤波,并绘制了巴特沃斯低通滤波器的幅度图和两加噪语音信号滤波前后的时域图和频谱图。
clear all;
fb = 1000;
fc = 1200;
fs = 22050;
wp=0.1*pi;
ws=0.4*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);
[bd,ad]=bilinear(b,a,Fs); %用双线性变换法实现模拟滤波器到数字滤波器的转换
[h,w]=freqz(bd,ad);
figure(1)
subplot(111);
plot(w*fs/(2*pi),abs(h))
grid;
title('滤波器的性能分析');
pause;
figure(2)
[x,fs,bits]=wavread('C:\\Documents and Settings\\Administrator\桌面\语音\加噪.wav');
n=length(x);
f=fs*(0:(n/2-1))/n;
X=fft(x);
z=filter(bd,ad,x);
subplot(211);
plot(x);
title('原始信号的波形');
subplot(212);
plot(z);
title('滤波后信号的波形');
pause;
figure(3)
sound(z,fs,bits);
subplot(211);
plot(f,abs(X(1:n/2)));
title('原始信号的频谱');
xlabel('Hz');
Z=fft(z);
subplot(212);
plot(f,abs(Z(1:n/2)));
title('滤波后的信号频谱');
xlabel('Hz');
wavwrite(z,fs,'C:\\Documents and Settings\\Administrator\桌面\语音\巴滤.wav');
(4)汉明窗的FIR低通滤波
使用窗函数法,选用海明窗设计了数字FIR低通滤波器对加了正弦噪声的语音信号进行滤波,并绘制了滤波器滤波后的语音信号时域图和频谱图。
%FIR滤波
fs=22050;
[x,fs,bits]=wavread('C:\\Documents and Settings\\Administrator\桌面\语音\加噪.wav');
wp=0.25*pi;
ws=0.3*pi;
wdelta=ws-wp;
N=ceil(6.6*pi/wdelta); %取整
t=0:(size(x)-1);
wn=(0.2+0.3)*pi/2;
b=fir1(N,wn/pi,hamming(N+1)); %选择窗函数,并归一化截止频率
f1=fftfilt(b,x);
figure(1)
freqz(b,1,512)
[h1,w1]=freqz(b,1);
plot(w1*fs/(2*pi),20*log10(abs(h1)));
figure(2)
subplot(2,1,1)
plot(t,x)
title('滤波前的时域波形');
subplot(2,1,2)
plot(t,f1);
title('滤波后的时域波形');
sound(f1); %播放滤波后的语音信号
F0=fft(f1,1024);
f=fs*(0:511)/1024;
figure(3)
y2=fft(x,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');
wavwrite(f1,fs,'C:\\Documents and Settings\\Administrator\桌面\语音\F滤.wav');
5.课程设计心得体会
本设计采用了高效快捷的开发工具——MATLAB,实现了语音信号的采集,对语音信号加噪声及设计滤波器滤除噪声的一系列工作。从频率响应图中可以看出:巴特沃斯滤波器具有单调下降的幅频特性,通带内是平滑的。海明窗设计的FIR滤波器的频率特性几乎在任何频带上都比巴特沃斯滤波器的频率特性好,过渡带也比较小,只是海明窗设计的滤波器下降斜度较小对语言的过渡失真进行了补偿。
我们小组初步完成了设计任务,由于个人能力有限以及团队合作不够默契等诸多问题,还存在许多不足的地方,比如滤波器的设计种类还比较单一,没有做更多的滤波效果比较等。在以后的工作和学习中会更加努力来完善设计任务。
参考文献
[1]周辉,董正宏,数字信号处理及MATLAB实现,北京希望出版社,2006
[2]王树勋.数字信号处理处理基础及试验.北京:机械工业出版社,1992
[3]井上伸雄.数字信号处理的应用.北京:科学出版社,1991
[4]郑君里,杨为理.信号与系统(第二版),高等教育出版社,1981
