语音信号处理及滤波
摘要
语音信号处理是研究用数字信号处理技术和语音学知识对语音信号进行处理的新兴学科,是目前发展最为迅速的学科之一。通过语音传递信息是人类最重要,最有效,最常用和最方便的交换信息手段,所以对其的研究更显得尤为重要。Matlab语言是一种数据分析和处理功能十分强大的计算机应用软件,它可以将声音文件变换成离散的数据文件,然后用起强大的矩阵运算能力处理数据。这为我们的本次设计提供了强大并良好的环境。本设计要求自己录制一段自己的语音后,在 MATLAB 软件中采集语音信号、回放语音信号并画出语音信号的时域波和频谱图。
本设计针对现在大部分语音处理软件内容繁多、操作不便等问题,采用MATLAB7.0综合运用GUI界面设计、各种函数调用等来实现语音信号的变频、变幅、傅里叶变换及滤波,程序界面简练,操作简便,具有一定的实际应用意义。
目录
3.3时域信号的FFT分析 ................................................................................................................................................... 2 FFT即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。在MATLAB的信号处理工具箱中函数FFT和IFFT用于快速傅立叶变换和逆变换。函数FFT用于序列快速傅立叶变换,其调用格式为y=fft(x),其中,x是序列,y是序列的FFT,x可以为一向量或矩阵,若x为一向量,y是x的FFT且和x相同长度;若x为一矩阵,则y是对矩阵的每一列向量进行FFT。如果x长度是2的幂次方,函数fft执行高速基-2FFT算法,否则fft执行一种混合基的离散傅立叶变换算法,计算速度较慢。函数FFT的另一种调用格式为y=fft(x,N),式中,x,y意义同前,N为正整数。函数执行N点的FFT,若x为向量且长度小于N,则函数将x补零至长度N;若向量x的长度大于N,则函数截短x使之长度为N;若x 为矩阵,按相同方法对x进行处理。 ............................................................................. 2 3.4数字滤波器设计原理 .................................................................................................................................................... 2
一:绪论
语音是语言的声学表现,是人类交流信息最自然、最有效、最方便的手段。随着社会文化的进步和科学技术的发展,人类开始进入了信息化时代,用现代手段研究语音处理技术,使人们能更加有效地产生、传输、存储、和获取语音信息,这对于促进社会的发展具有十分重要的意义,因此,语音信号处理正越来越受到人们的关注和广泛的研究。
二:课程设计内容与要求
本次课程设计要求利用MATLAB对语音信号进行数字信号处理和分析,要求采集语音信号后,在MATLAB软件平台进行频谱分析;并对所采集的语音信号加入干扰噪声,对加入噪声的信号进行频谱分析,设计合适的滤波器滤除噪声,恢复原信号。
三:课程设计的原理
3.1语音的录入与打开
在MATLAB中,[y,fs,bits]=wavread('Blip',[N1 N2]);用于读取语音,采样值放在向量y中,fs表示采样频率(Hz),bits表示采样位数。[N1 N2]表示读取从N1点到N2点的值(若只有一个N的点则表示读取前N点的采样值)。
sound(x,fs,bits); 用于对声音的回放。向量y则就代表了一个信号(也即一个复杂的“函数表达式”)也就是说可以像处理一个信号表达式一样处理这个声音信号。
3.2采样位数和采样频率
1
采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。
采样位数和采样率对于音频接口来说是最为重要的两个指标,也是选择音频接口的两个重要标准。无论采样频率如何,理论上来说采样的位数决定了音频数据最大的力度范围。每增加一个采样位数相当于力度范围增加了6dB。采样位数越多则捕捉到的信号越精确。对于采样率来说你可以想象它类似于一个照相机,44.1kHz意味着音频流进入计算机时计算机每秒会对其拍照达441000次。显然采样率越高,计算机摄取的图片越多,对于原始音频的还原也越加精确。
3.3时域信号的FFT分析
FFT即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。在MATLAB的信号处理工具箱中函数FFT和IFFT用于快速傅立叶变换和逆变换。函数FFT用于序列快速傅立叶变换,其调用格式为y=fft(x),其中,x是序列,y是序列的FFT,x可以为一向量或矩阵,若x为一向量,y是x的FFT且和x相同长度;若x为一矩阵,则y是对矩阵的每一列向量进行FFT。如果x长度是2的幂次方,函数fft执行高速基-2FFT算法,否则fft执行一种混合基的离散傅立叶变换算法,计算速度较慢。函数FFT的另一种调用格式为y=fft(x,N),式中,x,y意义同前,N为正整数。函数执行N点的FFT,若x为向量且长度小于N,则函数将x补零至长度N;若向量x的长度大于N,则函数截短x使之长度为N;若x 为矩阵,按相同方法对x进行处理。
3.4数字滤波器设计原理
2
数字滤波器的作用是利用离散时间系统的特性对输入信号波形(或频谱)进行加工处理,或者说利用数字方法按预定的要求对信号进行变换。
数字滤波器可以理解为是一个计算程序或算法,将代表输入信号的数字时间序列转化为代表输出信号的数字时间序列,并在转化过程中,使信号按预定的形式变化。数字滤波器有多种分类,根据数字滤波器冲激响应的时域特征,可将数字滤波器分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器。从性能上来说,IIR滤波器传输函数的极点可位于单位圆内的任何地方,因此可用较低的阶数获得高的选择性,所用的存贮单元少,所以经济而效率高。但是这个高效率是以相位的非线性为代价的。选择性越好,则相位非线性越严重。相反,FIR滤波器却可以得到严格的线性相位,然而由于FIR滤波器传输函数的极点固定在原点,所以只能用较高的阶数达到高的选择性;对于同样的滤波器设计指标,FIR滤波器所要求的阶数可以比IIR滤波器高5~10倍,结果,成本较高,信号延时也较大;如果按相同的选择性和相同的线性要求来说,则IIR滤波器就必须加全通网络进行相位较正,同样要大增加滤波器的节数和复杂性。
整体来看,IIR滤波器达到同样效果阶数少,延迟小,但是有稳定性问题,非线性相位;FIR滤波器没有稳定性问题,线性相位,但阶数多,延迟大。
四:课程设计的具体实现
4.1语音信号的采集及时频分析
将电脑D:\\hjjj.wav这一声音文件导入MATLAB软件中,并使用MATLAB绘出采样后的语音信号的时域波形和频谱图。
3
%原语音信号程序
Fs=22050;
[x,FS,bits]=wavread(' D:\\wjy.wav');
sound[x,FS,bits];
x=x(:,1);
figure(1);
subplot(2,1,1);
plot(x);
title('语音信号时域波形图');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
y=fft(x,3260);
f=(Fs/1630)*[1:1630];
4
subplot(2,1,2);
plot(f(1:1630),abs(y(1:1630)));
title('语音信号频谱图');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
运行程序得到语音信号时域和频谱图形所示。
4.2语音信号加噪与频谱分析
把噪声信号zs=0.05*cos(2*pi*10000*t/22050)添加到语音信号中,得 到加入噪声后信号波形与频谱。
%加入噪声信号的程序
zt=0:length(x)-1;
zs=0.05*cos(2*pi*10000*zt/22050);
zs0=0.05*cos(2*pi*10000*zt/22050000);
figure(2);
5
subplot(2,1,1);
plot(zs0);
title('噪声信号波形');
xlabel('时间(t)');
ylabel('幅值(dB)');
zs1=fft(zs,1200);
subplot(2,1,2);
6
plot(f(1:600),abs(zs1(1:600)));
title('噪声信号频谱');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
x1=x+zs';
y1=fft(x1,1200);
figure(3);
subplot(2,1,1);
plot(x1);
title('加入噪声后的信号波形');
xlabel('时间(t)');
ylabel('幅值(dB)');
subplot(2,1,2);
7
plot(f(1:600),abs(y1(1:600)));
title('加入噪声后的信号频谱');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
噪声信号及加入噪声信号的时域及幅频图如图所示。
8
4.3语音信号的滤波及频谱分析
设计巴特沃思低通滤波器。将语音信号和噪音信号叠加可以得到含噪声信号,分析其频谱特性之后用巴特沃思低通滤波器进行语音信号的数字处理——滤波。
%巴特沃思低通滤波程序
[x,fs,bits]=wavread(' D:\\wjy.wav');
fp=3000;
fs=3500;
9
Fs=22050;
rp=1;
rs=10;
wp=2*pi*fp/Fs;
ws=2*pi*fs/Fs;
Fs1=1;
wap=2*tan(wp/2);
was=2*tan(ws/2);
[N,wc]=buttord(wap,was,rp,rs,'s'); [B,A]=butter(N,wc,'s');
[Bz,Az]=bilinear(B,A,Fs1);
figure(4);
[h,w]=freqz(Bz,Az,512,Fs1*22050);
10
plot(w,abs(h));
title('巴特沃斯低通滤波器');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
grid on;
yd=filter(Bz,Az,x1);
figure(5);
subplot(2,1,1);
plot(yd);
title('滤波后信号波形');
xlabel('时间(t)');
ylabel('幅值(dB)');
ydd=fft(yd,1200);
11
subplot(2,1,2);
plot(f(1:600),abs(zs1(1:600)));
title('滤波后信号频谱');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
sound(yd,FS,bits);
巴特沃斯低通滤波器图
12
得到滤波后的波形与频谱:
4.4调试分析过程
在整个学习的过程中,遇到的问题很多。首先,在采集语音信号时,一时很茫然,不知道该怎么样把语音调用到matlab中去。通过网上参考和阅读书籍,[x,FS,bits]=wavread('D:\\hjjj.wav')这个程序可以实现。其次,在显示图像的问题上卡住了,同学间相互探讨就得以解决。出现问题最多的环节是在滤波器设计这一环节。滤波器有很多种:巴特沃斯低通滤波器、巴特沃斯高通滤波器、巴特沃斯带通滤波器等等。最后逐一调试,发现巴特沃斯低通滤波器出来的滤波效果最好,最后决定使用巴特沃斯低通滤波器。
4.5结果分析
13
完整的源程序如下:
Fs=22050;
[x,FS,bits]=wavread(' D:\\wjy.wav');
x=x(:,1);
figure(1);
subplot(2,1,1);
plot(x);
title('语音信号时域波形图');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
y=fft(x,3260);
f=(Fs/1630)*[1:1630];
subplot(2,1,2);
14
plot(f(1:1630),abs(y(1:1630)));
title('语音信号频谱图');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
%产生噪声信号并加到语音信号
zt=0:length(x)-1;
zs=0.05*cos(2*pi*10000*zt/22050);
zs0=0.05*cos(2*pi*10000*zt/22050000);
figure(2);
subplot(2,1,1);
plot(zs0);
title('噪声信号波形');
xlabel('时间(t)');
15
ylabel('幅值(dB)');
zs1=fft(zs,1200);
subplot(2,1,2);
plot(f(1:600),abs(zs1(1:600))); title('噪声信号频谱');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
x1=x+zs';
y1=fft(x1,1200);
figure(3);
subplot(2,1,1);
plot(x1);
title('加入噪声后的信号波形');
16
xlabel('时间(t)');
ylabel('幅值(dB)');
subplot(2,1,2);
plot(f(1:600),abs(y1(1:600)));
title('加入噪声后的信号频谱');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
%低通
[x,fs,bits]=wavread(' D:\\wjy.wav');
fp=3000;
fs=3500;
Fs=22050;
rp=1;
17
rs=10;
wp=2*pi*fp/Fs;
ws=2*pi*fs/Fs;
Fs1=1;
wap=2*tan(wp/2);
was=2*tan(ws/2);
[N,wc]=buttord(wap,was,rp,rs,'s'); [B,A]=butter(N,wc,'s');
[Bz,Az]=bilinear(B,A,Fs1);
figure(4);
[h,w]=freqz(Bz,Az,512,Fs1*22050);
plot(w,abs(h));
title('巴特沃斯低通滤波器');
18
xlabel('频率(HZ)');
ylabel('耗损(dB)');
grid on;
yd=filter(Bz,Az,x1);
figure(5);
subplot(2,1,1);
plot(yd);
title('滤波后信号波形');
xlabel('时间(t)');
ylabel('幅值(dB)');
ydd=fft(yd,1200);
subplot(2,1,2);
plot(f(1:600),abs(zs1(1:600))); 19
title('滤波后信号频谱');
xlabel('频率(HZ)');
ylabel('耗损(dB)');
sound(yd,FS,bits);
原语音信号与加入噪声及滤波后的频谱分析图如下:
在课设过程中,通过巴特沃斯低通 、高通 、带通滤波器比对,在低通滤波器状态下滤波效果是最好的。
五:心得体会
这次课程设计实现了语音信号的基本处理的功能,经过测试运行,本设计圆满的完成了对语音信号的读取和打开;较好的完成了对语音信号的频谱分析,通过fft变换,得出了
20
语音信号的频谱图;在滤波这一块,课题主要是从数字滤波器入手来设计滤波器,基本实现了滤波,完成了各种滤波器效果比较与课题的要求十分相符。通过这次的语音信号的数字滤波处理课程设计,使我进一步了解了语音信号的产生、采样及频谱分析的方法。以及其中产生信号和绘制信号的基本命令和一些基础编程语言。让我感受到只有在了解课本知识的前提下,才能更好的应用这个工具,并且熟练的应用MATLAB,很好的加深我对课程的理解,激发了我的思维。这次设计也使我了解了MATLAB的使用方法,学会分析滤波器的优劣和性能,提高了分析和动手实践能力。进一步加强了我对MATLAB的学习与研究,对我今后的学习将会起到很大的帮助。 在之前数字信号与处理的实验课中,已经使用过MATLAB,对其有了一些基础的了解和认识。以前总觉得MATLAB好难学,编程不会编,调试运行时老是报错,看到就觉得头晕。但通过这次的数字信号课程设计对MATLAB的使用,让我对MATLAB产生了很大的兴趣。由于刚开始对设计思路并不是很清晰而且对MATLAB的使用方法并不是很熟悉,以至于整个过程花了我不少时间,可当做完时才发现做数字滤波器并进行分析并不是很难很难,主要是在参数设置上时花了不少时间。 通过这次课程设计让我体会到在实际的操作过程中,要把理论中所学的知识灵活地运用起来,会在调试中会遇到各种各样的问题,而耐心就是我们最好的帮手,遇事不能急、不能慌,慢慢分析并解决问题才是王道。这次课程设计提高了我解决问题的能力,使我学会了在设计中独立解决问题,也包括怎样去查找问题。似乎所有的事都得自己亲手去操作才会在脑海中留下深刻的印象。这次课程设计让我可以熟练的操作MATLAB软件,也了解了各种数字滤波器的功能的应用,也加深了对MATLAB认识和理解。
六:参考文献
[1]丁玉美.数字信号处理(第二版)[M].西安:西安电子科技大学出版社,2001
[2]陈怀琛.数字信号处理及其MATLAB实现[M].北京:电子工业出版社,2001.
21
因篇幅问题不能全部显示,请点此查看更多更全内容