语音信号处理实验指导.docx
《语音信号处理实验指导.docx》由会员分享,可在线阅读,更多相关《语音信号处理实验指导.docx(33页珍藏版)》请在冰豆网上搜索。
语音信号处理实验指导
基本实验
实验一
数字信号处理综合实验
一、实验目的
目的:
综合运用数字信号处理的理论知识进行信号的采样,重构,频谱分析和滤波器的设计,通过理论推导得出相应结论,再利用Matlab作为编程工具进行计算机实现,从而加深对所学知识的理解,建立概念。
二、基本要求
1.掌握数字信号处理的基本概念、基本理论和基本方法;
2.学会MATLAB的使用,掌握MATLAB的程序设计方法;
3.掌握用MATLAB设计简单实验验证采样定理的方法;
4.掌握在Windows环境下语音信号采集的方法;
5.学会用MATLAB对信号进行频谱分析;
6.掌握MATLAB设计FIR和IIR数字滤波器的方法;
三、实验内容
(1)Matlab产生离散信号的方法,作图的方法,以及基本运算操作
(2)对连续正弦信号以不同的采样频率作采样
(3)对采样前后信号进行傅立叶变换,并画频谱图
(4)分析采样前后频谱的有变化,验证采样定理。
掌握画频谱图的方法,深刻理解采样频率,信号频率,采样点数,频率分辨率等概念
四、主要实验仪器及材料
微型计算机、Matlab。
五、实验步骤
1.设计一简单正弦信号,通过改变采样率观察采样前后的信号变化。
例如:
假设有一振幅为1,频率为10Hz,相位为0.3的模拟信号,即
,用0.01s的采样间隔(采样频率为100Hz)来表示原始信号(注意:
实际上模拟信号不能用离散值表示,此处为了在计算机上表示,用采样率非常高的离散信号表示模拟信号)。
分别以5Hz,10Hz(每秒采样10次,即采样间隔为0.1s),20Hz,40Hz,80Hz,200Hz对原始信号进行采样,画出采样前后的信号,并画出其频谱图,对比前后的变化,验证采样定理。
(1)可以用t=0:
1/fs:
9/f;取9个周期,通过改变采样率,自动改变采样点数。
(2)也可以通过设置dt1(采样间隔),已知采样点数n1,t1=n1*dt1,
如图所示,采样率为40Hz时的原始信号,采样过程和采样后的信号时域图和频谱图,可见,当采样率大于原始信号频率的两倍时,采样前后信号频率基本不发生变化,信号不失真。
图2-1采样的过程
图2-2原始信号和采样后信号的频谱
2.设计数字滤波器和画出频率响应
根据分析所得的原始信号的频谱和噪声信号频谱特点,给出有关滤波器的性能指标。
首先用窗函数法或者最优化法设计高通,低通,带通,带阻滤波器,在MATLAB中,可以利用函数fir1,firls设计FIR滤波器;
然后在用双线性变换法或脉冲响应法设计上面几种滤波器,在MATLAB中,可以利用函数butte、cheby1和ellip设计IIR滤波器;
最后,利用MATLAB中的函数freqz画出各滤波器的频率响应。
具体方法参加附件3种滤波器设计的步骤和实例。
如,根据以上语音信号的特点给出有关IIR滤波器的性能指标:
1)低通滤波器性能指标,fp=4500,fc=6500,Rs=100,Rp=1。
(fp:
通带截至频率;fc:
阻带截至频率;Rs:
通带波纹;Rp:
阻带波纹)
2)带阻滤波器性能指标,fp1=4800Hz,fp2=5200Hz,fc1=4600Hz,fc2=5400Hz,Rs=30dB,Rp=1dB。
([fp1fp2]:
阻带截至频率;[fc1fc2]:
通带截至频率)
程序如下:
%椭圆带阻滤波器
figure,
wp=[48005200]*2/fs;ws=[46005400]*2/fs;%通带和阻带边界频率
Rp=1;Rs=30;Nn=128;%通带波纹和阻带衰减以及绘制频率特性的数据点数
[NN,Wn]=ellipord(wp,ws,Rp,Rs);%求取数字滤波器的最小阶数和归一化截至频率
[b,a]=ellip(NN,Rp,Rs,Wn,'stop');%设计滤波器
freqz(b,a,512,fs);title('椭圆带阻滤波器');
图2-10椭圆带阻滤波器的频率响应
%双线性变换法设计的椭圆低通滤波器:
figure,
fp=4500;fc=6500;Rs=100;Rp=1;fs=22050;
wc=2*fc/fs;wp=2*fp/fs;
[n,wn]=ellipord(wp,wc,Rp,Rs);
[b,a]=ellip(n,Rp,Rs,wn);
freqz(b,a,512,fs);
若设计FIR滤波器,要阻止5000Hz的高频信号通过,即设计如下滤波器特性,
%最优化设计法设计带阻滤波器
figure,
n=100;%滤波器阶数
f=[04600*2/fs4800*2/fs5400*2/fs5600*2/fs1];%频率向量
a=[110011];%振幅向量
b=firls(n,f,a);%采用firls设计滤波器
[h,w1]=freqz(b);%计算其频率响应
plot(w1/pi,abs(h));%绘制滤波器的幅频响应
title('最优化法设计的带阻滤波器');
图2-11最优化法设计的带阻滤波器的幅频响应
3.用滤波器对信号进行滤波
比较各种滤波器的性能,然后用性能好的各滤波器分别对采集的信号进行滤波。
比较滤波前后语音信号的波形及频谱,要求在一个窗口同时画出滤波前后的波形及频谱。
在MATLAB中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。
xx=filter(b,a,y);%对信号y滤波
XX=fftshift(fft(xx));%求经过滤波后信号的傅立叶变换
图2-12对带噪声信号滤波
4、图形用户界面的设计
为使编制的程序操作方便,有兴趣的同学,可以利用Matlab进行图形用户界面的设计。
在所设计的系统界面上可以选择滤波器的类型,输入滤波器的参数,显示滤波器的频率响应,选择信号等。
七、实验报告要求
1.按照实验指导书的格式简述实验目的,基本要求,实验内容以及实验原理。
2.详细写明每一个实验的具体步骤,如何实现,在具体编程中遇到的问题以及如何解决。
3.按照实验要求编程,给出详细程序实现代码,以及程序结果(图,表格等)。
4.在每一步中,分析各种不同的情况所得出的结果,并进行对比,得出结论。
5.在本次实验报告的最后,总结本次实验的主要内容,以及所掌握的内容。
实验二语音信号处理
语音信号处理综合运用了数字信号处理的理论知识,对信号进行计算及频谱分析,设计滤波器,并对含噪信号进行滤波。
具体分为以下步骤:
(1)语音信号的采集:
利用Windows下的录音机,录制一段话音。
然后在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中。
降采样:
利用windows下的录音机录制的音频采样率是固定的fs(=22050),可以选择以下函数实现对语音信号的降采样。
y=x((1:
N:
length(x)));%对原始信号每隔N个点取一位,即采样率变为原来的1/N
y=resample(yn,L,M);%采样率变为原来的L/M倍
y=downsample(yn,N);%%采样率变为原来的1/N倍
改变采样率为原来的1/2倍,1/4倍,1/20倍,1/50倍,1/100倍等,分别画出降采样前后的信号波形和频谱图,分析采样前后信号的变化。
图2-3采样率为原来的1/2时的信号波形频谱图
图2-4采样率为原来的1/10时信号波形频谱图
在MATLAB中,函数sound可以对声音进行回放。
其调用格式:
sound(x,fs,bits);
通过调用此函数,感觉采样前后声音的变化。
(2)重构原信号:
降采样后,信号的采样率和采样点数同时变化。
如采样率变为原来的1/2,即对原始信号每隔一个点采样。
如果要恢复原始信号,即信号长度和采样率须变为原来同样大小。
所以,必须对降采样后信号进行插值重构。
具体过程参见附件1中例子。
对采样后的真实语音信号进行插值重构,滤波,恢复原始信号。
画出插值前后信号的波形以及频谱图,并将重构后信号与原始信号进行比较。
如,对采样率降为原来1/5的降采样后信号插值重构,结果如下图所示。
图2-5采样率为原来的1/5时的波形频谱图
图2-6插值后的信号波形频谱图
图2-7低通滤波器的频率响应图
图2-8滤波后的波形频谱图
调用sound函数感受插值后的声音,发现会有高频的噪声。
经过低通滤波器之后,高频噪声被滤出。
但是,因为之前的原始信号经过了降采样,所以插值后的效果一定不如原始声音。
也可用用wavwrite函数将经过处理的语音信号保存下来,调用格式为如wavwrite(y,fs,bits,'sound.wav'),其中,y为所要保存的语音信号,fs为其采样率,bits为采样位数,'sound.wav'是保存的语音信号的文件名。
(2)对原始信号加入噪声:
对原始语音信号加入
s=sin(2*pi*f*Ts*n)
的噪声,采样后可知Fs=16000,选择f=2500,播放加入噪声信号的语音信号,并绘制噪声信号和含噪语音信号;
设计频率已知的噪声信号或者用自然噪声信号加在原始语音信号上,构建带噪声信号。
如对原始信号加上频率为5000的正弦波噪声信号,程序如下:
[x,fs,bits]=wavread('sound1.wav');%读取原始语音信号
X=abs(fftshift(fft(x)));%原始信号频谱
c1=0.01*sin(2*pi*5000*k/fs);%构建频率为5000Hz的正弦波噪声信号
yn=x+c1';%构建带噪声信号
Yn=abs(fftshift(fft(yn)));%求带噪声信号频谱
subplot(321);plot(x);title('原始信号波形');
subplot(322);plot((-N/2:
N/2-1)/length(k)*fs,X);title('原始信号频谱');
subplot(323);plot(yn);title('带噪声信号波形');
subplot(324);plot((-N/2:
N/2-1)/length(k)*fs,Yn);title('带噪声信号频谱');
运行程序,结果如图2-9所示。
从频谱图可以看出,原始信号频谱段集中在0~5000Hz之间,主要频率集中在0Hz附近的低频部分。
加上噪声信号后,在5000Hz处有个幅值非常大的的高频成份,即以上所加的高频正弦波噪声信号。
图2-9加噪声前后信号的波形频谱图
(3)频谱分析:
分别对原始语音信号,噪声信号和含噪声的语音信号进行频谱分析,并绘出各频谱图;
首先画出语音信号的时域波形;然后对语音信号进行频谱分析,在MATLAB中,可以利用函数fft对信号进行快速付立叶变换,得到信号的频谱特性;从而加深对频谱特性的理解。
[x,fs,bits]=wavread('e:
\sound1.wav',[10245120]);%读取[10245120]段
%语音信号数据;如果不指定所读取读取语音信号数据的长度,则读取整段语音信号
X=fft(x,4096);%fftshift(fft(x))
N=length(x);
k=0:
N-1;
subplot(221);plot(k,x);title('原始信号波形');
subplot(222);plot((-N/2:
N/2-1)/N*fs,abs(X));title('原始信号频谱');
(4)设计滤波器:
计算滤波器的性能指标,设计滤波器,绘制滤波器的特性曲线;
(5)滤波器滤波:
用自己设计的滤波器对采集的信号进行滤波,得出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化,并回放语音信号,感觉滤波前后的声音有变化。
实验三电话拨号音的合成与识别
双音多频DTMF(DualToneMulti-Frequency)信号,是用两个特定的单音频率信号的组合来代表数字或功能。
在DTMF电话机中有16个按键,其中10个数字键0—9,6个功能键*、#、A、B、C、D。
其中12个按键是我们比较熟悉的按键,另外由第4列确定的按键作为保留,作为功能键留为今后他用。
根据CCITT建议,国际上采用697Hz、770Hz、852Hz、94lHz低频群及1209Hz、1336Hz、1477Hz、1633Hz高频群。
从低频群和高频群任意各抽出一种频率进行组合,共有16种组合,代表16种不同的数字键或功能,每个按键唯一地由一组行频和列频组成,如下表所示。
利用MATLAB软件能够利用矩阵不同的基频合成0-9不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程。
进一步利用MATLAB中的图形用户界面GUI做出简单的图形操作界面。
从而实现对电话拨号音系统的简单的实验仿真。
具体实现步骤如下:
(1)图形电话拨号面板的制作
利用GUI图形用户界面设计工具制作电话拨号面板,把DTMF信号和电话机的键盘矩阵对应起来。
其中选用我们熟悉的10个数字键0—9,2个功能键“*”、“#”,另外为了仿真方便,添加信号识别键和复位键。
每个按键可用
(PushButton)添加。
最终利用GUI图形用户界面设计工具生成的图形电话拨号面板用于拨号音的合成产生部分,如下图所示。
这里将其保存为Untitle.fig文件。
(2)DTMF信号的产生合成
现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对Untitle.m文件进行编辑。
其主要的功能是使对应的按键,按照表中的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。
此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。
鉴于CCITT对DTMF信号规定的指标,这里每个数字信号取1000个采样点模拟按键信号,并且每两个数字之间用100个0来表示间隔来模拟静音。
以便区别连续的两个按键信号。
间隔的静音信号也是在按键时产生的。
以按键0为例,简单介绍拨号音产生的过程:
按键0的响应函数
functionvarargout=pushbutton0_Callback(h,eventdata,handles,varargin)
n=[1:
1000];%每个数字1000个采样点表示
d0=sin(0.7217*n)+sin(1.0247*n);%对应行频列频叠加
n0=strcat(get(handles.edit1,'string'),'0');%获取数字号码
set(handles.edit1,'string',n0);%显示号码
space=zeros(1,100);%100个0模拟静音信号
globalNUM
phone=[NUM,d0];
NUM=[phone,space];%存储连续的拨号音信号
wavplay(d0,8192);%产生拨号音
程序解释:
NUM为定义的全局变量,用于存储连续的拨号音(DTMF)信号,包括数字信号音以及静音信号。
d0=sin(0.7217*n)+sin(1.0247*n)
中的行频与列频是由表1中0键对应的
计算得出,已知声音取样频率
则取样后
对于保留的两个功能键“*”、“#”,按照现行键盘式拨号电话的习惯,将“*”作为删除键,“#”作为确认键。
“*”删除键的作用是将前面拨错的号码删除退回,表现为将显示窗口已经显示的错误号码退回一位数字,并且将连续拨号音信号的存储单元NUM中退回一位拨号音信号和静音信号。
删除可以进行连续的操作。
“#”确认键的作用是将前面拨过的号码进行确认保留,意味着此时连续拨号音信号的存储单元NUM中的信号即为最后用于识别的连续拨号音DTMF信号,并在显示窗口中显示“#”号作为标记。
删除键的响应函数
functionvarargout=pushbuttonback_Callback(h,eventdata,handles,varargin)
n=[1:
1000];
num=get(handles.edit1,'string');
l=length(num);
n11=strrep(num,num,num(1:
l-1));%去掉末尾号码在面板上的显示
d11=sin(0.7217*n)+sin(0.9273*n);
set(handles.edit1,'string',n11);
globalNUM
L=length(NUM);
NUM=NUM(1:
L-1100);%删除末尾号码在拨号音信号中的存储
wavplay(d11,8192);
(3)DTMF信号的检测识别
要实现电话拨号音(DTMF)信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。
这里采用FFT算法对信号进行解码分析。
首先对接收到的数字信号作FFT分析,计算出其幅频谱,进而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。
对于连续的双音多频(DTMF)信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用FFT算法对信号进行解码分析。
DTFM信号的最小周期为40ms,取采样周期为8KHz,每个周期至少采样0.04*8000=320点。
DTMF解码器计算采样序列的DFT,从给定的8个基本频中找出与结果最接近的频率。
DFT的长度N决定了DFT样本的位置和计算该样本所用时间直接的间隔。
对8KHz的采样率,人们发现检测八个基本DTMF音调的DFT长度N的最佳值为205,表中给出N=205是最接近的音调频率的DFT指标k。
基本音调(Hz)
实际k
679
18
770
20
852
22
941
24
1209
31
1336
34
1477
38
1633
42
附件1:
信号的插值重构
以对一个简单正弦信号的重构为例,以10倍原信号长度进行插值。
clear;
closeall;
f=10;
fs=100;
k=1:
100;
x=sin(2*pi*f*k/fs);
n=10;
y=zeros(1,n*length(x));
y(1:
n:
length(y))=x;
附图2-1信号插值前后的波形
附图2-2信号插值前后的频谱图
由上图可看出,插值后信号最大频率同样变为原来的10倍,高频部分进行了拓展(由于在原始信号中插入0的缘故),为原始频谱的周期延拓(类似采样定理)。
故,只需根据以上插值后信号的频率特性,设计FIR低通滤波器进行滤波,即可得到(滤波器具体的设计方法见附录)。
低频滤波器的通带为0~50Hz,由于1对应最大频率500Hz,故,50Hz对应的转换频率为50/500=0.1,设计通带截止频率为wp为0.09,阻带截止频率为0.11。
N为滤波器阶数,理想状况下,阶数越高,滤波器效果越好。
(工程中涉及到的滤波器阶数问题需另做考虑)
N=100;
B=firls(N,[00.090.111],[1100]);
figure,plot((-N/2:
N/2)/(N/2),abs(fftshift(fft(B)))),title(‘FIR低通滤波器’);
xx=filter(B,1,y);%利用低通滤波器滤波
figure,
subplot(211),plot(xx);title('滤波后信号');
subplot(212),plot((-n*50:
n*50-1)/(n*100)*n*fs,abs(fftshift(fft(xx))));title('滤波后信号频谱');
附图2-3FIR低通滤波器的频率响应
附图2-4插值后的信号经低通滤波的信号波形和频谱图
附件2:
信号频谱
有限长序列的离散傅立叶变换(DFT)定义为
逆变换为:
Matlab频谱分析相关函数:
(1)一维快速傅立叶变换FFT函数fft,调用格式:
y=fft(x)
y=fft(x,n)
函数说明:
fft函数用于计算矢量或矩阵的离散傅立叶变换,可通过
来实现,式中
。
Y=fft(x)利用FFT算法计算矢量x的离散傅立叶变换,当x为矩阵时,y为矩阵x的每一列的FFT。
当x的长度为2的幂次方时,则fft采用基-2FFT算法,否则采用稍慢的混合基算法。
Y=fft(x,n)采用n点FFT。
当x长度小于n时,fft函数在x尾部补零.。
当x长度大于n时,函数将序列截断.
(2)一维逆快速傅立叶变换(IFFT)ifft,调用格式:
Y=ifft(x)
Y=ifft(x,n)
函数说明:
ifft函数用于计算矢量或矩阵的逆傅立叶变换,即
式中,
。
(3)fft函数最通常的应用是计算信号的频谱。
考虑由一个50Hz和120Hz正弦信号构成的信号,受零均值随机信号的干扰,数据采样率为1000Hz。
通过fft函数来分析其信号频率成分。
相关程序如下:
t=0:
0.001:
0.6;
x=sin(2*pi*50*t)+sin(2*pi*120*t);
y=x+1.5*randn(1,length(t));
Y=fft(y,512);
附件3:
滤波器设计
一、IIR数字滤波器设计
1、经典设计法:
主要有两种方法:
脉冲响应不变法、双线性变换法
经典设计IIR滤波器的步骤:
A.根据给定的性能指标和方法,首先对设计性能指标中的频率指标进行转换,转换后的频率指标作为模拟滤波器原型设计指标;
B.估计模拟滤波器最小阶数和边界频率,可利用Matlab工具函数buttord,cheb1ord等;如,设计buttord滤波器的调用格式:
[n,Wn]=buttord(Wp,Ws,Rp,Rs)
[n,Wn]=buttord(Wp,Ws,Rp,Rs,’s’)
buttord可在给定滤波器性能的情况下,选择模拟或数字滤波器的最小阶数,其中,Wp和Ws分别是通带和阻带的截止频率,取值范围为0fs为采样频率,Rp和Rs分别是通带和阻带区的波纹系数。
C.设计模拟低通滤波器原型,可利用buttap,cheblap等;
D.由模拟低通原型经频率变换得到模拟滤波器(低通,高通,带通,带阻),可利用MATLAB工具函数lp2lp,lp2hp,lp2bs,lp2bp等;如低通到低通模拟滤波器变换函数为[bt,at]=lp2lp(b,a,Wo),lp2lp函数将截止频率为1rad/s(归一化频率)的模拟低通滤波器原型变换为截止频率为Wo的低通滤波器。