为了验证滤波器的可使用性,我们用常用的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