语音信号处理与滤波.docx
《语音信号处理与滤波.docx》由会员分享,可在线阅读,更多相关《语音信号处理与滤波.docx(12页珍藏版)》请在冰豆网上搜索。
语音信号处理与滤波
目录
一、课程设计目的…………………………………………………………………2
二、课程设计要求…………………………………………………………………2
三、详细设计过程…………………………………………………………………3
四、调试分析………………………………………………………………………9
五、分析结果………………………………………………………………………9
六、心得体会………………………………………………………………………10
七、参考文献………………………………………………………………………10
八、程序……………………………………………………………………………11
九、附录……………………………………………………………………………12
一、课程设计目的
综合运用数字信号处理的理论知识进行频谱分析和滤波器设计,通过理论推导得出相应结论,再利用MATLAB作为编程工具进行计算机实现,从而加深对所学知识的理解。
采用Matlab进行数字信号处理课程设计,实践证明,使我们加深了对课堂抽象概念的理解,巩固了课堂上所学的理论知识,并能很好地理解与掌握数字信号处理中的基本概念、基本原理、基本分析方法。
在课程设计中,让我们录制自己的声音,设计滤波器对声音进行处理,大大激发了我们的学习兴趣,使我们很快地掌握编程方法和解决实际问题的技巧
Matlab是MathWorks公司于1982年推出的一套高性能的数值计算和可视化数学软件,被誉为“巨人肩上的工具”。
Matlab的含义是矩阵实验室(MATRIXLABORATORY)。
经过十几年的完善和扩充,它已发展成为线性代数课程的标准工具。
它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便的、界面友好的用户环境。
在这个环境下,对所要求解的问题,用户只需要简单地列出数学表达式,其结果便以数值或图形方式显示出来。
Matlab的首创者是在数值线性代数领域颇有影响的CleveMoler博士,他也是生产经营MATLAB产品的美国Mathworks公司的创始人之一。
MATLAB是一种科学计算软件,专门以矩阵的形式处理数据。
MATLAB将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,从而使其广泛地应用于科学计算、控制系统、信息处理、数字图形处理等领域的分仿真和设计工作中,而且利用MATLAB产品的开发式结构,用户可以非常容易地对MATLAB进行扩充。
二、课程设计基本要求
(1)熟悉离散信号和系统的时域特性。
(2)掌握序列快速傅里叶变换FFT方法。
(3)学会MATLAB的使用,掌握MATLAB的程序设计方法。
(4)利用MATLAB对语音信号进行频谱分析。
(5)掌握MATLAB设计FIR和IIR数字滤波器的方法。
三、详细设计过程
1、问题描述:
录制一段自己的语音信号,取不同的数据点对语音信号进行频谱分析;对所有数据进行插值和抽取处理,改变抽样率再对信号进行频谱分析;设计FIR和IIR数字滤波器,并对被抽样后的语音信号进行滤波,分析滤波后信号的时域和频域特征,回放语音信号。
2、详细操作步骤和部分运行结果
(1)采集语音信号:
利用Windows下的录音机,录制一段自己的话音,时间控制在1s左右;然后在MATLAB软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。
通过使用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中。
采集语音的程序代码:
[x1,fs,nbits]=wavread(‘e:
\yy.wav’);
sound(x1,fs,bits);
y=fft(x1,1024);
subplot(2,1,1);plot(x1);title(‘原始采样后时域信号’);
原始语音采样后的的时域信号波形图:
(2)对语音信号进行频谱分析:
在MATLAB中,利用函数fft对信号进行快速傅里叶变换,得到信号的频谱特性。
首先画出语音信号的时域波形,然后对语音信号进行频谱分析。
程序代码:
[x1,fs,bits]=wavread(‘D:
\yy.wav’);
y1=fft(x1,1024);
f=fs*(0:
511)/1024;
figure
(1)
subplot(2,1,1);plot(f,abs(1:
512)));title(’原始语音信号频谱’);
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2);plot(abs(y1(1:
1024)));title(‘原始语音信号FFT频谱’);
xlabel('点数N');
ylabel('幅值');
原始语音信号的频率响应图:
原始语音信号频谱和FFT转换后的频谱图
(3)设计数字滤波器和画出频率响应:
根据语音信号的特点给出有关滤波器的性能指标:
1低通滤波器性能指标:
fp=1000Hz,fc=1200Hz,As=100dB,Ap=1dB;
2高通滤波器性能指标:
fc=4800Hz,fp=5000Hz,As=100dB,Ap=1dB;
3带通滤波器性能指标:
fp1=1200Hz,fp2=3000Hz,fc1=1000Hz,fc2=3200Hz,As=100dB,Ap=1dB。
首先用窗函数法(矩形窗(Rectangularwindow)、三角窗(Triangularwindow)、汉宁窗(Hanningwindow)、海明窗(Hammingwindow)、布拉克曼窗(Blackmanwindow)、切比雪夫窗(Chebyshevwindow)、巴特里特窗(Bartlettwindow)及凯塞窗(Kaiserwindow)。
)设计上面要求的三种滤波器。
在MATLAB中,利用函数fir1设计FIR滤波器;然后再用双线性变换法设计上面要求的三种滤波器,利用函数butte、cheby1和ellip设计IIR滤波器;最后,利用MATLAB中的函数freqz画出各种滤波器的频率响应。
(4)低通滤波器的设计过程
用窗函数法设计低通滤波器:
程序代码:
fp=1000;fc=1200;As=100;Ap=1;fs=22050;
wc=2*fc/fs;wp=2*fp/fs;
N=ceil((As-7.95)/(14.36*(wc-wp)/2))+1;
beta=0.1102*(As-8.7);
Win=Kaiser(N+1,beta);
b=fir1(N,wc,Win);
freqz(b,1,512,fs);
运行结果如下图:
用双线性变换法设计的低通滤波器:
程序代码:
fp=1000;fc=1200;As=100;Ap=1;fs=22050;
wc=2*fc/fs;wp=2*fp/fs;
[n,wn]=ellipord(wp,wc,Ap,As);
[b,a]=ellip(n,Ap,As,wn);
freqz(b,a,512,fs);
程序运行结果如下图:
(8)用滤波器对信号进行滤波
比较两种滤波器性能,然后用性能好的滤波器对采集的信号进行滤波。
在MATLAB中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。
(9)比较滤波前后语音信号的波形及频谱,在同一个窗体中画出滤波前后的波形图:
FIR低通滤波器滤波前后的波形图:
(10)回放语音信号
在MATLAB中,函数sound可以对声音进行回放。
其调用格式为
sound(x,fs,bits),可以感觉滤波前后的声音有变化。
四、调试分析
1、用窗函数法设计低通滤波器中,语句N=ceil(As-7.95)/(14.36*(wc-wp)/2))+1;出错,将其改为N=ceil((As-7.95)/(14.36*(wc-wp)/2))+1;即可。
五、结果分析
1、题目要求最大衰减Ap=1dB,fp=1000Hz,由图可看出基本符合,而最小衰减As=100dB,fc=1200Hz,基本符合。
2、滤波前后的频谱分析:
由于所取的采样点数比较大,滤波前后的频谱比较相近,但仔细对比仍然可以看出下图的结果滤掉了高频的成分。
3、题目要求最大衰减Ap=1dB,fp=5000Hz,由图可看出,基本符合,而最小衰减As=100dB,fc=4800Hz,也基本符合。
4、滤波前后的频谱分析:
由图明显可以看出,此滤波器将低频成分滤掉了。
5、题目要求最大衰减Ap=1dB时,fp1=1000Hz,fp2=3200Hz,由图可看出,基本符合,而最小衰减As=100dB时,fc1=1000Hz,fc2=3200Hz,基本符合。
6、滤波前后的频谱分析:
该滤波器将低频成分和高频成分都滤掉了,只剩下通带里的频率。
7、选用凯泽窗设计方法,滤波器的幅度和相位响应满足设计的指标但滤波器长度(N=708)太长,实现起来很困难,主要原因是滤波器的指标太苛刻,因此,一向不用窗函数法设计这种类型的滤波器。
在双线性变换法的设计中选用椭圆函数设计,滤波器的幅度和相位均满足设计的要求。
六、心得体会
通过一学期的数字信号处理的学习,在这次做课程设计的过程中,真的发现自己没学到啥东西,所以导致做的过程中困难重重,拿着课本只好重头看,通过网上查资料,同学之间的相互合作,最终我们还是战胜了困难,顺利完成了此次的课程设计。
我深深的体会到了知识的重要性,不管是为了应付考试还是怎么样也好,对于自身的帮助还是很大的,整整两天坐在电脑面前的功夫没有白费,我还是收获了很多,对于Matlab软件的使用也更加熟悉了。
一年之计在于春,而我们一学期的学习就在于这次课程设计了,我觉得这才是真正学到知识的,也锻炼了自己的动手实践能力,耐心和毅力。
学会团结,才能把事情做得更好。
七、参考文献
[1]丁美玉,高西全数字信号处理2版。
西安:
西安电子科技大学出版社,2001
[2]怀琛数字信号处理教程——MATLAB释疑与实现。
北京:
电子工业出版社,2004
[3]王宏MATLAB6.5及其在信号处理中的应用。
北京:
清华大学出版社,2004
[4]刘顺兰,吴杰数字信号处理。
西安:
西安电子科技大学出版社,2003
八、源程序代码:
%读入原始声音
[x,fs,Nbits]=wavread('09020135.wav');
sound(x,fs);
n=length(x);%求出语音信号的长度
y1=fft(x,n);%傅里叶变换
y2=fftshift(abs(y1));%对频谱图进行平移
w=linspace(-fs/2,fs/2,length(y2));
subplot(2,3,1);
plot(x);%做原始语音信号的时域图形
title('原始语音信号');
xlabel('timen');
ylabel('fuzhin');
subplot(2,3,4);
plot(w,y2);%做原始语音信号的FFT频谱图
title('原始语音信号FFT频谱');
%加噪声
noise=0.04*randn(n,2);%随机函数产生噪声
sound(noise,fs);
s=x+noise;%语音信号加入噪声
sound(s,fs);%加噪声的声音
k=1:
1:
n;%定义k值,噪声与原始语音长度一致
wavwrite(s,fs,'2.wav');
S=fft(s);%对叠加信号进行频谱变换
S=fftshift(abs(S));
subplot(2,3,2);
plot(k,s)
title('噪声信号时域图');%绘制噪声信号的时域波形图
subplot(2,3,5);
plot(w,abs(S));
title('噪声信号的频谱图');
%用双线性变换法设计巴特沃思低通滤波器
Ft=6000;
Fp=1000;
Fs=1200;
wp=2*pi*Fp/Ft;;%¨
wp=0.25*pi;%通带截止频率
ws=0.3*pi;%阻带截止频率
Rp=1;%通带最大衰减
Rs=15;%阻带最小衰减
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);%绘制频率响应曲线
%用双线性变换法设计巴特沃思低通滤波器滤波
f1=filter(bz,az,s);
sound(f1,fs);%滤波后的声音
F0=fft(f1,n);
F1=fftshift(abs(F0));
wavwrite(f1,fs,'3.wav');%将滤波后的数据保存为.wav文件
subplot(2,3,3);
plot(k,f1);%画出滤波后的时域图
title('滤波后的时域波形');
subplot(2,3,6);
plot(w,F1);%画出滤波后的频谱图
title('滤波后的频谱');
xlabel('Hz');
ylabel('fuzhi');
九、附录