基于Matlab的语音信号滤波器的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安欧亚学院
信息工程学院
2015/ 2016学年第一学期
课程设计报告
课程名称数字信号处理
班级学号统本电信1301(15、16、23)学生姓名李滢、陈领、刘嘉颖
指导教师张秀芳
设计任务书
成绩评定表
备注:以上总分为该组的平均分,根据成员分工具体分数如下。
目录
一.课程设计名称 (1)
二.内容摘要 (1)
三.设计内容及要求 (1)
四.设计原理 (1)
五.实现方法(包括MA TLAB算法原理等) (1)
六.完整的设计仿真过程(应含有设计流程框图、所设计的滤波器的技术指标以及设计源程序关键部分) (2)
1、设计流程框图 (2)
2、滤波器的技术指标 (3)
3、设计源程序 (3)
七.仿真结果输出及结论 (11)
八.仿真调试中出现的错误、原因及排除方法 (11)
九.设计体会,总结本次设计,指出设计的核心及应用价值,提出改进意见和展望 (11)
十.列出参考文献 (11)
一.课程设计名称
基于Matlab的语音信号滤波器的设计与实现
二.内容摘要
本文论述了利用MATLAB的图形处理功能、符号运算功能和数值计算功能,完成对语音信号分析处理和仿真实现。
并且以窗函数滤波法设计数字低通滤波器,利用MATLAB分析该语音信号的时域波形及频域波形,完成滤波前后的比较分析。
关键字:MATLAB语音信号数字低通滤波器
三.设计内容及要求
1、语音信号的采集
利用Windows下的录音机,录制一段自己的话音,时间在1 s内。
然后在Matlab软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。
通过wavread函数的使用,我们很快理解了采样频率、采样位数等概念。
这里我直接采用了一段现成的.wav格式的语音信号。
2、语音信号的频谱分析
首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性。
给原始的语音信号加上一个高频余弦噪声,频率为5kHz。
画出加噪后的语音信号时域和频谱图,与原始信号对比,可以很明显的看出区别。
3、设计数字滤波器和画出频率响应
4、用滤波器对信号进行滤波
5、比较滤波前后语音信号的波形及频谱
6、回放和存储语音信号
四.设计原理
本设计主要是对语音信号的时频进行分析,并对语音信号加噪后设计滤波器对其进行滤波处理,对话音信号加噪声前后的频谱进行比较分析,对合成语音信号滤波前后进行频谱的分析比较。
首先用PC机WINDOWS下的录音机录制一段语音信号,并保存入MATLAB软件的根目录下,再运行MATLAB仿真软件把录制好的语音信号用wavread函数加载入MATLAB仿真软件的工作环境中,输入命令对语音信号进行时域,频谱变换。
对该段合成的语音信号,用命令在MATLAB中设计一个恰当的滤波器对其进行滤波处理,此处用低通滤波器对其进行滤波,滤波后用命令可以绘制出其频谱图,回放语音信号。
对原始语音信号、合成的语音信号和经过滤波器处理的语音信号进行频谱的比较分析。
五.实现方法(包括MATLAB算法原理等)
六.完整的设计仿真过程(应含有设计流程框图、所设计的滤波器的技术指标以及设计源程序关键部分)
1、设计流程框图
图6.1设计流程框图
2、滤波器的技术指标
低通滤波器性能指标fp=1000; fs=1200; As=100;
高通滤波器性能指标 As2=100;fp2=4000;fs2=2000;
带通滤波器性能指标 As=100;fp=[1200,3000];fs=[1000,3200];
3、设计源程序
首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性。
fs =44100;
Nbits =16;
[x,fs,Nbits] =wavread('Bigbang - Fantastic Baby - 铃声版.wav');
%读声音文件sound(x,fs,Nbits);
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('原始信号频谱图')
0246810121416
-1-0.500.5
1原始信号时域波形图
00.51 1.52 2.53 3.54 4.5x 10
4
5
1015
4
原始信号频谱图
图6.2原始信号时域波形图及频谱图
给原始的语音信号加上一个高频余弦噪声,频率为5kHz 。
画出加噪后的语音信号时域和频谱图,与原始信号对比,可以很明显的看出区别。
fs=44100; %语音信号采样频率为44100 x1=wavread('Bigbang - Fantastic Baby - 铃声版.wav');
%读取语音信号数据赋值给x1 f=fs*(0:511)/1024;
%将0到511,步长为1的序列的值与fs 相乘并除以1024的值赋给f
t=0:1/fs:(length(x1)-1)/fs;
%将0到x1的长度减1后的值除以fs 的值且步长为1/fs 的值的序列的值赋予t
Au=0.05; %噪声幅值 d=[Au*cos(2*pi*2000*t)]'; %干扰信号构建命令函数,构建了一个余弦函数
x2=x1(:,1)+d; %取原始语音信号的单声部信号然后和噪声信号相加 wavwrite(x2,44100,'jiazaoyang'); %生成wav 文件 sound(x2,44100); %播放语音信号 y1=fft(x1,1024); %对信号做1024点的FFT 变换 y2=fft(x2,1024);
figure(1); %创建图形窗 subplot(2,1,1)
plot(t,x1); %做原始语音信号的时域波形 title('加噪前的信号'); ylabel('fuzhi n'); xlabel('time n');
subplot(2,1,2); %创建两行一列绘图区间的第1个绘图区间 plot(t,x2)
title('加噪后的信号');
5
10
15
20
25
30
35
-1-0.500.5
1加噪前的信号
f u z h i n
time n
5
10
15
20
25
30
35
-2-101
2加噪后的信号
time n
f u z h i n
图6.3加噪前的信号及加噪后的信号
窗函数法设计滤波器: xlabel('time n'); ylabel('fuzhi n'); figure(2)
subplot(2,1,1);
plot(f,abs(y1(1:512))); title('原始语音信号频谱');
0.5
1
1.5
2
2.5x 10
4
0246
8原始语音信号频谱
图6.4原始语音信号频谱
[x1,Fs,bits]=wavread('Bigbang - Fantastic Baby - 铃声版.wav'); derta_Fs=Fs/length(x1);
%设置频谱的间隔,分辨率,这里保证了x 轴的点数必须和y 轴点数一致 fs=Fs; fp1=1000; fs1=1200; 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); %wc1/pi 为归一化,窗函数法设计函数 figure(2);
freqz(b1,1,512);
%[H,w]=freqz(B,A,N),(1)中B 和A 分别为离散系统的系统函数分子、分母多项式的系数向量,返回量H 则包含了离散系统频响在?0~pi 范围内N 个频率等分点的值(其中N 为正整数),w 则包含了范围内N 个频率等分点。
调用默认的N 时,其值是512。
title('FIR 低通滤波器的频率响应');
0.1
0.2
0.30.40.50.60.70.80.9
1
-8000
-6000-4000-2000
Normalized Frequency (⨯π rad/sample)
P h a s e (d e g r e e s )
00.10.2
0.30.40.50.60.70.80.91
-200
-100
100
Normalized Frequency (⨯π rad/sample)
M a g n i t u d e (d B )
FIR 低通滤波器的频率响应
图6.5
x1_low=filter(b1,1,x1);
%对信号进行低通滤波?,Y?=?filter(B,A,X)?,输入X 为滤波前序列,Y 为
滤波结果序列,B/A?提供滤波器系数,B 为分子,?A 为分母?
sound(x1_low,Fs,bits); figure(3);
subplot(2,1,1); plot(x1_low);
title('信号经过FIR 低通滤波器(时域)'); subplot(2,1,2);
plot([-Fs/2:derta_Fs:Fs/2-derta_Fs],abs(fftshift(fft(x1_low)))); title('信号经过FIR 低通滤波器(频域)');
024********x 10
5
-2-101
2信号经过FIR 低通滤波器(时域)
-2.5
-2-1.5-1-0.500.51 1.52 2.5x 10
4
05
1015
4
信号经过FIR 低通滤波器(频域)
图6.6
xlabel('hz'); ylabel('fuzhi'); subplot(2,1,2);
plot(f,abs(y2(1:512))); title('加噪后的信号频谱');
0.5
1
1.5
2
2.5x 10
4
05
1015
20加噪后的信号频谱
Hz
f u z h i
图6.7加噪后的信号频谱
xlabel('Hz');
ylabel('fuzhi');
[x1,Fs,bits]=wavread('Bigbang - Fantastic Baby - 铃声版.wav'); derta_Fs=Fs/length(x1);
%设置频谱的间隔,分辨率?,这里保证了x 轴的点数必须和y 轴点数一致 fs=Fs; As3=100;
fp3=[1200,3000];fs3=[1000,3200]; wp3=2*pi*fp3/fs; ws3=2*pi*fs3/fs; BF3=wp3(1)-ws3(1); wc3=wp3+BF3/2;
M3=ceil((As3-7.95)/(2.286*BF3))+1; %按凯泽窗计算滤波器阶数
N3=M3+1;
beta3=0.1102*(As3-8.7);
Window=(kaiser(N3,beta3)); %求凯泽窗窗函数 b3=fir1(M3,wc3/pi,'bandpass',Window); %带通滤波器? figure(6);
freqz(b3,1,512); %数字滤波器频率响应? title('FIR 带通滤波器的频率响应');
0.1
0.2
0.30.40.50.60.70.80.9
1
-15000
-10000-50000
5000
Normalized Frequency (⨯π rad/sample)
P h a s e (d e g r e e s )
00.10.2
0.30.40.50.60.70.80.91
-200
-100
100
Normalized Frequency (⨯π rad/sample)
M a g n i t u d e (d B )
FIR 带通滤波器的频率响应
图6.8
x1_daitong=filter(b3,1,x1); %对信号进行带通滤波
sound(x1_daitong,Fs,bits); figure(7); subplot(211); plot(x1_daitong);
title('信号经过FIR 带通滤波器(时域)'); subplot(212);
plot([-Fs/2:derta_Fs:Fs/2-derta_Fs],abs(fftshift(fft(x1_daitong))));
title('信号经过FIR 带通滤波器(频域)');
2
4
6
8
10
12
14x 10
5
-1-0.500.5
1信号经过FIR 带通滤波器(时域)
-2.5
-2-1.5-1-0.500.51 1.52 2.5x 10
4
02000
4000
6000信号经过FIR 带通滤波器(频域)
图6.9
[x1,Fs,bits]=wavread('Bigbang - Fantastic Baby - 铃声版.wav'); derta_Fs=Fs/length(x1);
%设置频谱的间隔,分辨率?,这里保证了x 轴的点数必须和y 轴点数一致 fs=Fs; As2=100; fp2=4000; fs2=2000;
wp2=2*pi*fp2/fs; ws2=2*pi*fs2/fs; BF2=wp2-ws2;
wc2=(wp2+ws2)/2;
M2=ceil((As2-7.95)/(2.286*BF2))+1; %按凯泽窗计算滤波器阶数 N2=M2+1;
beta2=0.1102*(As2-8.7);
Window=(kaiser(N2,beta2)); %求凯泽窗窗函数 b2=fir1(M2,wc2/pi,Window); figure(4);
freqz(b2,1,512); %数字滤波器频率响应? title('FIR 高通滤波器的频率响应');
00.10.2
0.30.40.50.60.70.80.91
-3000
-2000
-1000
Normalized Frequency (⨯π rad/sample)
P h a s e (d e g r e e s )
-200
-100
0100
Normalized Frequency (⨯π rad/sample)
M a g n i t u d e (d B )
FIR 高通滤波器的频率响应
图6.10
x1_high=filter(b2,1,x1); %对信号进行高通滤波 sound(x1_high,Fs,bits); figure(5); subplot(211); plot(x1_high);
title('信号经过FIR 高通滤波器(时域)'); subplot(212);
plot([-Fs/2:derta_Fs:Fs/2-derta_Fs],abs(fftshift(fft(x1_high)))); title('信号经过FIR 高通滤波器(频域)');
024681012
14x 10
5
-2-1012信号经过FIR 高通滤波器(时域)
-2.5
-2-1.5
-1-0.500.51 1.52 2.5x 10
4
05
10154
信号经过FIR 高通滤波器(频域)
图6.11
七.仿真结果输出及结论
与原噪音信号对比,区别:
通过对比分析可知,滤波后的输出波形和原始语音加噪声信号的图形发生了一些变化。
滤波后的输出波形明显在对应时间幅度比原语音加噪声信号的要小,而且滤波的效果也与滤波器的选择有关,可以看出滤波器的性能差异以及参数的调节会对滤波器产生一定的影响,并且通过回放可以发现滤波前后的声音有变化.低通滤波后,已很接近原来的声音,人耳几乎辨别不出。
从频谱图中我们还可以看出声音的能量信号主要集中在低频部分,说明高频语音信号被滤出,滤波器达到既定要求。
八.仿真调试中出现的错误、原因及排除方法
??? Error using ==> wavread
Error using ==> wavread
Data compression format (IMA ADPCM) is not supported.
解决办法:wave格式的音频分为PCM和IMA ADPCM两种格式,Matlab中用waveread函数做音频处理时,只能对PCM格式的.wav音频进行处理,因此需要将要处理的格式事先转换成PCM格式的.wav音频。
可采用Adensoft Audio MP3 Converter音频转换工具进行转换。
九.设计体会,总结本次设计,指出设计的核心及应用价值,提出改进意见和展望
正所谓“纸上得来终觉浅,觉知此事要躬行。
”学习任何知识,仅从理论上去求知,而不去实践、探索是不够的。
通过为期一周的数字信号处理实训,我对MATLAB这个仿真软件有了更进一步的认识和了解。
在这一周时间里,我通过自己摸索,查阅资料,并且在指导老师田老师的指导下完成了:语音信号的采集及分析;设计数字低通滤波器;实现对语音信号的处理分析;并最终将课程设计报告总结完毕。
在整个设计过程中我懂得了许多东西,也培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对今后的学习工作和生活有非常大的帮助,并且提高了自己的动手实践操作能力,使自己充分体会到了在设计过程中的成功喜悦。
虽然这个设计做的不怎么好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益。
在没有做课程设计以前,觉得课程设计只是对知识的单纯总结,但是通过这次课程设计发现自己的看法有点太片面,课程设计不仅是对前面所学知识的一种检验,也是对自己能力的一种提高,通过这次课程设计使自己明白了原来的那点知识是非常欠缺的,要学习的东西还很多,通过这次课程设计,明白学习是一个长期积累的过程,在以后的工作和生活中都应该不断的学习,努力提高自己的知识和综合素质。
希望以后像这样的课程设计在多一点。
十.列出参考文献
1.姚东.MATLAB及在电子信息课程中的应用[M].第二版.北京:北京电子工业出版社,2000
2.张智星.MATLAB程序设计与应用.北京:清华大学出版社,
2002
3.陈怀琛.MATLAB及其在理工课程中的应用指南.西安:西安电子科技大学出版社,1999.10
4.肖伟、刘忠.MATLAB程序设计与应用[M].北京:清华大学出版社2005
5.程佩青.数字信号处理教程(第三版).清华大学出版社.2007.2。