利用Windows自带的录音机录制了一个16s的语音文件,编写MATLAB程序对语音信号进行处理。语音信号是一种非平稳的时变信号,携带着很多信息。利用audioread函数对录音进行采样,将采样后的信号进行快速傅里叶变换,使其从时域信号转换为频域信号,并将原始语音信号的时域信号和频域信号进行作图显示,完成对语音信号的频率、幅度等信息的提取。
[y,Fs] = audioread('a.m4a'); %样本数据 y 以及该数据的采样率 Fs
Faudio=Fs;
figure(1);
plot(y,'b');
title('原始语音的时域信号');
xlabel('时间轴');
ylabel('幅值');
y=y(:,1); %取出其中一声道
yFFT=fft(y);
yDFT=abs(yFFT);
yLen=length(y);
k=0:yLen-1;
Fk1=k.*Fs/yLen;
figure(2)
plot(Fk1,yDFT,'b');
xlim([0 5000]);
title('原始语音信号频谱')
xlabel('f(Hz)');
ylabel('幅度');
然后求原始语音信号的特征频带,采用的是对每秒的声音信号求功率谱,即对语音信号进行傅里叶变换后,去其模的平方,然后对得到的结果进行绘图。
代码如下
for i=0:16
YPow=y(Fs*i+1:Fs*(i+1)+1);
YPowFft=fft(YPow,Fs);
YPowDFT=abs(YPowFft);
PowerY=YPowDFT.^2; %功率谱
figure(i+3);
plot(PowerY);
xlabel('频率/Hz');
ylabel('功率');
title(['第',num2str(i+1),'秒的语音信号的功率谱'])
xlim([0 2600]);
end
使用基于汉宁窗的窗函数法和脉冲响应不变法与双线性变换法设计了三个低通滤波器,对三种滤波器的滤波效果进行对比分析。设计的低通滤波器的.通带临界频率为1600Hz,通带内最大衰减为3dB,阻带截止频率为1800Hz,阻带内衰减大于15dB。
对于使用汉宁窗的低通滤波器的设计,将低通滤波的截止频率关于π归一化,然后使用公式B=(2×π×200)/F_s 计算对应的数字带宽,由汉宁窗的过渡带宽为6.2π/N计算出所需h(n)的长度。
对于脉冲响应不变法设计低通滤波器的完整过程为:将数字滤波器的指标转化为模拟滤波器的指标,由模拟滤波器的指标设计模拟滤波器H(s),利用脉冲响应不变法将H(s)转化为H(z).变换过程如下。
脉冲响应不变法在MATLAB上通过函数impinvar实现。
双线性变换法设计低通滤波器的步骤如下:首先将数字滤波器的频率指标转换模拟滤波器的频率指标,然后由模拟滤波器的指标设计模拟滤波器H(s),利用双线性变换法,将H(s)转换为H(z).双线性变换法在MATLAB上通过函数bilinear实现。
滤波器设计
fpLow=1600; fsLow=1800;
%窗函数法,使用汉宁窗
wcLow=(fpLow+fsLow)/Fs; %理想滤波器的截止频率,将截止频率关于pi归一化
BLow=2*pi*(fsLow-fpLow)/Fs;
NLowWin=ceil(6.2*pi/BLow); %hanning窗的长度N
wLow= hann(NLowWin);
hnLowWin=fir1(NLowWin-1,wcLow,'low',wLow);
[hLowWin,wLowWin]=freqz(hnLowWin,1);
fLowWin=2*wLowWin*Fs/pi;
%脉冲响应不变法
[nLow,WnLow]=buttord(2*pi*fpLow,2*pi*fsLow,3,15,'s');
[bLow1,aLow1]=butter(nLow,WnLow,'s');
[bzLow1,azLow1]=impinvar(bLow1,aLow1,Fs); %映射为数字的
[hLow1,wLow1]=freqz(bzLow1,azLow1);
%双线性变换法
wpLow=(fpLow/Fs)*2*pi; %临界频率
wsLow=(fsLow/Fs)*2*pi;
OmegaPLow2=2*Fs*tan(wpLow/2);
OmegaSLow2=2*Fs*tan(wsLow/2);
[nLow2,WnLow2]=buttord(OmegaPLow2,OmegaSLow2,3,15,'s');
[bLow2,aLow2]=butter(nLow2,WnLow2,'s');
[bzLow2,azLow2]=bilinear(bLow2,aLow2,Fs); %映射为数字的
[hLow2,wLow2]=freqz(bzLow2,azLow2);
然后使用设计的滤波器对语音信号进行滤波处理。
代码如下
YLowWin=filter(hLowWin,1,y);
YALowWin=abs(fft(YLowWin));
%sound(YLowWin,Fs);
YLow1=filter(bzLow1,azLow1,y);
YALow1=abs(fft(YLow1));
%sound(YLow1,Fs);
YLow2=filter(bzLow2,azLow2,y);
YALow2=abs(fft(YLow2));
%sound(YLow2,Fs);
注:sound函数的功能为播放处理后的语音