飞道的博客

基于MATLAB的有噪声语音信号处理

519人阅读  评论(0)

为了验证滤波器的可使用性,我们用常用的sin函数来进行验证。其具体程序及运行结果如下:

t=[0:1/1023:1];

s=sin(2*pi*t);

N=length(s);

y=s+0.5*rand(1,N);

subplot(2,1,1);

plot(y);

title('加噪语音信号的时域波形','fontweight','bold');

S=fft(y);           

subplot(2,1,2);

plot(abs(S));

title('加噪语音信号的频域波形','fontweight','bold');

Ft=8000;

Fp=1000;

Fs=1200;

wp=2*pi*Fp/Ft;

ws=2*pi*Fs/Ft;

[n11,wn11]=buttord(wp,ws,1,50,'s'); %求低通滤波器的阶数和截止频率

[b11,a11]=butter(n11,wn11,'s');    %求S域的频率响应的参数

[num11,den11]=bilinear(b11,a11,0.5); %利用双线性变换实现频率响应S域到Z域的变换

z11=filter(num11,den11,s);

sound(z11);

m11=fft(z11);  %求滤波后的信号

figure;

subplot(2,2,1);

plot(abs(S),'g');

title('滤波前信号的频谱','fontweight','bold');

grid;

subplot(2,2,2);

plot(abs(m11),'r');

title('滤波后信号的频谱','fontweight','bold');

grid;

subplot(2,2,3);

plot(y);

title('滤波前信号的波形','fontweight','bold');

grid;

subplot(2,2,4);

plot(z11);

title('滤波后的信号波形','fontweight','bold');

grid;

 

用自己设计的各滤波器分别对加噪的语音信号进行滤波,在Matlab中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。

函数fftfilt用的是重叠相加法实现线性卷积的计算。调用:y=fftfilter(h,x,M)。其中,h是系统单位冲击响应向量;x是输入序列向量;y是系统的输出序列向量;M是有用户选择的输入序列的分段长度,缺省时,默认的输入向量的重长度M=512。

函数filter的调用格式:yn=filter(B,A.xn),它是按照直线型结构实现对xn的滤波。其中xn是输入信号向量,yn输出信号向量。

  由于所设计的滤波器有六个,故我们需要进行六次滤波,然后比较得出哪种滤波器的效果最好。下面我们以IIR低通为例:

[y,fs,nbits]=wavread (‘OriSound’);   %IIR低通

n = length (y) ;         %求出语音信号的长度

Noise=0.2*randn(n,2);  %随机函数产生噪声

s=y+Noise;             %语音信号加入噪声

S=fft(s);            

Ft=8000;

Fp=1000;

Fs=1200;

wp=2*pi*Fp/Ft;

ws=2*pi*Fs/Ft;

[n11,wn11]=buttord(wp,ws,1,50,’s’);%求低通滤波器的阶数和截止频率

[b11,a11]=butter(n11,wn11,’s’);    %求S域的频率响应的参数

[num11,den11]=bilinear(b11,a11,0.5); %利用双线性变换实现频率响应S域到Z域的变换

z11=filter(num11,den11,s);

sound(z11);

m11=fft(z11);  %求滤波后的信号

figure;

subplot(2,2,1);

plot(abs(S),’g’);

title(‘滤波前信号的频谱’,’fontweight’,’bold’);

axis([ 0 150000 0 4000]);

grid;

subplot(2,2,2);

plot(abs(m11),’r’);

title(‘滤波后信号的频谱’,’fontweight’,’bold’);

axis([ 0 150000 0 4000]);

grid;

subplot(2,2,3);

plot(s);

title(‘滤波前信号的波形’,’fontweight’,’bold’);

axis([95000 100000 -1 1]);

grid;

subplot(2,2,4);

plot(z11);

title(‘滤波后的信号波形’,’fontweight’,’bold’);

axis([95000 100000 -1 1]);

grid;

程序结果如下图:

  

                     图  4-2  IIR低通滤波器

经过以上的加噪处理后,可在Matlab中用函数sound对声音进行回放。其调用格式:sound(y,Fs),sound(y)和sound(y,Fs,bits)。可以察觉滤波前后的声音有明显的变化。比较后可得;低通效果较好,高通其次,带通最差。对原始语音信号具体程序及运行结果如附录(II 比较滤波前后语音信号的波形及频谱


转载:https://blog.csdn.net/ccsss22/article/details/109611008
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场