300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【滤波器】基于FIR+IIR(高通+低通+带通)滤波器实现音频信号去噪含Matlab源码

【滤波器】基于FIR+IIR(高通+低通+带通)滤波器实现音频信号去噪含Matlab源码

时间:2023-08-13 21:59:01

相关推荐

【滤波器】基于FIR+IIR(高通+低通+带通)滤波器实现音频信号去噪含Matlab源码

1 简介

结合数字滤波器的理论基础和设计方法,在MATLAB程序语言环境下,设计出有限长单位脉冲响应(FIR)数字滤波器,同时利用GUI界面设计FIR数字滤波器人机交互平台,该系统平台界面直观、操作简单且功能齐全,可实现对加噪语音信号的去噪滤波功能.平台主要包括语音信号、加噪信号、FIR数字滤波器设计和去噪信号四个模块,用户可根据读入的语音信号及噪声信号特点调整滤波器技术指标,实现滤波器的优化设计,最终达到FIR数字滤波器对语音信号的去噪处理效果.​

2 完整代码

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==1temp=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变换后频谱图');elseendendif b==2temp=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('幅值');elseendendif b==3temp=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))gridxlabel('频率/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));gridxlabel('频率/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));gridxlabel('频率/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('幅值');elseendendb=menu('请选择选项','原始信号采样后时域图和频谱图','FIR滤波器','IIR滤波器','退出');end

3 仿真结果

4 参考文献

[1]凌生强, 廖柏林, 丁亮,等. 基于Matlab的FIR带通滤波器设计及DSP实现[J]. 现代电子技术, , 35(9):4.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。