结合数字滤波器的理论基础和设计方法,在MATLAB程序语言环境下,设计出有限长单位脉冲响应(FIR)数字滤波器,同时利用GUI界面设计FIR数字滤波器人机交互平台,该系统平台界面直观、操作简单且功能齐全,可实现对加噪语音信号的去噪滤波功能.平台主要包括语音信号、加噪信号、FIR数字滤波器设计和去噪信号四个模块,用户可根据读入的语音信号及噪声信号特点调整滤波器技术指标,实现滤波器的优化设计,最终达到FIR数字滤波器对语音信号的去噪处理效果.
clear all;
clc;
[filename,filepath]=uigetfile('.wav','Open wav file');
[y,fs]=audioread([filepath,filename]); %从电脑文件夹选择wav音频文件
b=menu('请选择选项','原始信号采样后时域图和频谱图','FIR滤波器','IIR滤波器','退出');
while(b~=4)
if b==1
temp=menu('请选择选项','播放原始语音','原始语音时域图','原始语音做FFT变换后频谱图','返回');
if temp==1
%播放语音
sound(y);
elseif temp==2
%画出原始语音时域图
figure(11)
plot(y);
xlabel('时间(ms)');
ylabel('幅值');
title('原始语音时域图');
elseif temp==3
%画出原始语音做FFT变换后频谱图
Y1=fft(y);
Y=abs(Y1);
figure(12)
plot(Y);
xlabel('频率');
ylabel('幅值');
title('原始语音做FFT变换后频谱图');
else
end
end
if b==2
temp=menu('请选择选项','FIR低通滤波器','FIR高通滤波器','FIR带通滤波器','返回');
if temp==1
%FIR低通滤波器
fs=10000;
wp=2*pi*1000/fs;
wst=2*pi*1200/fs;
Rp=1;
Rs=100;
wdelta=wst-wp;
N=ceil(8*pi/wdelta); %取整
wn=(wp+wst)/2;
[b,a]=fir1(N,wn/pi,hamming(N+1)); %选择窗函数,并归一化截止频率
figure(21)
freqz(b,a,512);
title('FIR低通滤波器');
y1=filter(b,a,y);
figure(22)
subplot(2,1,1)
plot(y)
title('FIR低通滤波器滤波前的时域波形');
xlabel('时间(ms)');
ylabel('幅值');
subplot(2,1,2)
plot(y1);
title('FIR低通滤波器滤波后的时域波形');
xlabel('时间(ms)');
ylabel('幅值');
sound(y1,8000); %播放滤波后的语音信号
F0=fft(y1,1024);
f=fs*(0:511)/1024;
figure(23)
y2=fft(y,1024);
subplot(2,1,1);
plot(f,abs(y2(1:512)));
title('FIR带通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
F2=plot(f,abs(F0(1:512)));
title('FIR低通滤波器滤波后的频谱');
xlabel('频率/Hz');
ylabel('幅值');
elseif temp==2
%FIR高通滤波器
fs=22050;
wp=2*pi*5000/fs;
wst=2*pi*3000/fs;
Rp=1;
Rs=100;
wdelta=wp-wst;
N=ceil(8*pi/wdelta); %取整
wn=(wp+wst)/2;
[b,a]=fir1(N,wn/pi,'high');
figure(24)
freqz(b,a,512);
title('FIR高通滤波器');
y1=filter(b,a,y);
figure(25)
subplot(2,1,1)
plot(y)
title('FIR高通滤波器滤波前的时域波形');
xlabel('时间(ms)');
ylabel('幅值');
subplot(2,1,2)
plot(y1);
title('FIR高通滤波器滤波后的时域波形');
xlabel('时间(ms)');
ylabel('幅值');
sound(y1,8000); %播放滤波后的语音信号
F0=fft(y1,3000);
f=fs*(0:511)/1024;
figure(26)
y2=fft(y,1024);
subplot(2,1,1);
plot(f,abs(y2(1:512)));
title('FIR高通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
plot(f,abs(F0(1:512)));
title('FIR高通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
elseif temp==3
%FIR带通滤波器
fs=22050;
wp1=2*pi*1200/fs;wp2=2*pi*3000/fs;
ws1=2*pi*1000/fs;ws2=2*pi*3200/fs;
Rp=1;
Rs=100;
wp=(wp1+ws1)/2;ws=(wp2+ws2)/2;
wdelta=wp1-ws1;
N=ceil(8*pi/wdelta); %取整
wn=[wp ws];
[b,a]=fir1(N,wn/pi,'bandpass');
figure(27)
freqz(b,a,512);
title('FIR带通滤波器');
y1=filter(b,a,y);
figure(28)
subplot(2,1,1)
plot(y);
xlabel('时间(ms)');
ylabel('幅值');
title('FIR带通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(y1);
title('FIR带通滤波器滤波后的时域波形');
xlabel('时间(ms)');
ylabel('幅值');
sound(y1,8000); %播放滤波后的语音信号
F0=fft(y1,3000);
f=fs*(0:511)/1024;
figure(29)
y2=fft(y,1024);
subplot(2,1,1);
plot(f,abs(y2(1:512)));
title('FIR带通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
plot(f,abs(F0(1:512)));
title('FIR带通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
else
end
end
if b==3
temp=menu('请选择选项','IIR低通滤波器','IIR高通滤波器','IIR带通滤波器','返回');
if temp==1
%IIR低通滤波器
fs=22050;
Ts=1/fs;
R1=10;
wp=2*pi*1000/fs;
ws=2*pi*1200/fs;
Rp=1;
Rl=100;
wp1=2/Ts*tan(wp/2); %将模拟指标转换成数字指标
ws1=2/Ts*tan(ws/2);
[N,Wn]=buttord(wp1,ws1,Rp,R1,'s'); %选择滤波器的最小阶数
[Z,P,K]=buttap(N); %创建butterworth模拟滤波器
[Bap,Aap]=zp2tf(Z,P,K);
[b,a]=lp2lp(Bap,Aap,Wn);
[bz,az]=bilinear(b,a,fs); %用双线性变换法实现模拟滤波器到数字滤波器的转换
[H,W]=freqz(bz,az);
figure(31)
plot(W*fs/(2*pi),abs(H))
grid
xlabel('频率/Hz');
ylabel('频率响应幅度');
title('IIR低通滤波器');
f1=filter(bz,az,y);
figure(32)
subplot(2,1,1) %画出滤波前的时域图
plot(y);
xlabel('时间(ms)');
ylabel('幅值');
title('IIR低通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(f1); %画出滤波后的时域图
title('IIR低通滤波器滤波后的时域波形');
xlabel('时间(ms)');
ylabel('幅值');
sound(f1,9000); %播放滤波后的信号
F0=fft(f1,3000);
f=fs*(0:511)/1024;
figure(33)
y2=fft(y,1024);
subplot(2,1,1);
plot(f,abs(y2(1:512))); %画出滤波前的频谱图
title('IIR低通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
f=fs*(0:511)/1024;
F1=plot(f,abs(F0(1:512))); %画出滤波后的频谱图
title('IIR低通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
elseif temp==2
%IIR高通滤波器
fs=22050;
Fs=22050;
Ts=1/Fs;
R1=50;
Wp=2*pi*5000/fs;
Ws=2*pi*3000/fs;
Rp=1;
Rl=100;
Wp1=2/Ts*tan(Wp/2); %将模拟指标转换成数字指标
Ws1=2/Ts*tan(Ws/2);
[N,Wn]=cheb2ord(Wp1,Ws1,Rp,Rl,'s'); %选择滤波器的最小阶数
[Z,P,K]=cheb2ap(N,Rl); %创建切比雪夫模拟滤波器
[Bap,Aap]=zp2tf(Z,P,K);
[b,a]=lp2hp(Bap,Aap,Wn);
[bz,az]=bilinear(b,a,Fs); %用双线性变换法实现模拟滤波器到数字滤波器的转换
[H,W]=freqz(bz,az); %绘制频率响应曲线
figure(34)
plot(W*fs/(2*pi),abs(H));
grid
xlabel('频率/Hz');
ylabel('频率响应幅度');
title('IIR高通滤波器');
f1=filter(bz,az,y);
figure(35)
subplot(2,1,1)
plot(y); %画出滤波前的时域图
xlabel('时间(ms)');
ylabel('幅值');
title('IIR高通滤波器滤波前的时域波形');
subplot(2,1,2)
xlabel('时间(ms)');
ylabel('幅值');
plot(f1);
xlabel('时间(ms)');
ylabel('幅值');
title('IIR高通滤波器滤波后的时域波形');
sound(f1,8000); %播放滤波后的信号
F0=fft(f1,1024);
figure(36)
y2=fft(y,1024);
subplot(2,1,1);
plot(f,abs(y2(1:512))); %画出滤波前的频谱图
title('IIR高通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
f=fs*(0:511)/1024;
plot(f,abs(F0(1:512))); %画出滤波后的频谱图
title('IIR高通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
elseif temp==3
%IIR带通滤波器
Fs=22050;
Ts=1/Fs;
R1=30;
fb1=1200;
fb2=3000;
fc1=1000;
fc2=3200;
fs=22050;
W1=2*fb1*pi/fs;
W2=2*fc1*pi/fs;
W3=2*fb2*pi/fs;
W4=2*fc2*pi/fs;
Wp=[W1,W3];
Ws=[W2,W4];
Rp=1;
Rl=100;
Wp1=2/Ts*tan(Wp/2); %将模拟指标转换成数字指标
Ws1=2/Ts*tan(Ws/2);
[N,Wn]=cheb2ord(Wp1,Ws1,Rp,R1,'s'); %选择滤波器的最小阶数
[Z,P,K]=cheb2ap(N,Rl); %创建切比雪夫模拟滤波器
[Bap,Aap]=zp2tf(Z,P,K);
[b,a]=lp2bp(Bap,Aap,2100*2*pi,1800*2*pi);
[bz,az]=bilinear(b,a,Fs); %用双线性变换法实现模拟滤波器到数字滤波器的转换
[H,W]=freqz(bz,az); %绘制频率响应曲线
figure(37)
plot(W*fs/(2*pi),abs(H));
grid
xlabel('频率/Hz');
ylabel('频率响应幅度');
title('IIR带通滤波器');
f1=filter(bz,az,y);
figure(38)
subplot(2,1,1)
plot(y); %画出滤波前的时域图
xlabel('时间(ms)');
ylabel('幅值');
title('IIR带通滤波器滤波前的时域波形');
subplot(2,1,2)
F0=fft(f1,1024);
f=fs*(0:511)/1024;
plot(f1);
title('IIR带通滤波器滤波后的时域波形');
xlabel('时间(ms)');
ylabel('幅值');
sound(f1,8000); %播放滤波后的信号
F0=fft(f1,3000);
figure(39)
y2=fft(y,1024);
f=fs*(0:511)/1024;
subplot(2,1,1);
plot(f,abs(y2(1:512))); %画出滤波前的频谱图
title('IIR带通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
plot(f,abs(F0(1:512))); %画出滤波后的频谱图
title('IIR带通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
else
end
end
b=menu('请选择选项','原始信号采样后时域图和频谱图','FIR滤波器','IIR滤波器','退出');
end
[1]凌生强, 廖柏林, 丁亮,等. 基于Matlab的FIR带通滤波器设计及DSP实现[J]. 现代电子技术, 2012, 35(9):4.
部分理论引用网络文献,若有侵权联系博主删除。