基于等波纹最佳逼近法的FIR数字滤波器实现matlab仿真

本文详细介绍了等波纹最佳逼近法在FIR滤波器设计中的应用,通过MATLAB实例展示了如何使用该方法设计低通和高通滤波器,以及在去除噪声和信号处理中的效果。仿真结果对比了不同设计方法的性能,突出了等波纹逼近法的优越性。
摘要由CSDN通过智能技术生成

目录

一、理论基础

二、案例背景

三、MATLAB核心代码

四、仿真结论分析


一、理论基础

        等波纹最佳逼近法,其本质是一种优化算法,该方法有效克服了基于窗函数的FIR滤波器设计方法以及基于频率抽样的FIR滤波器设计方法所存在的各种缺点,使得算法的设计误差达到最小值。而基于等波纹最佳逼近法的FIR数字滤波器,其频谱特性曲线在通带和阻带上都具有等纹波特性。

二、案例背景

滤波器的含义,就是指对输入信号有着消除噪声和平滑功能的系统[01]。根据处理信号种类的不同,将处理连续信号的滤波器称为模拟滤波器,将处理离散信号的滤波器称为数字滤波器。随着通信多媒体技术的飞速发展,数字滤波器成为数字信号处理领域中一个越来越重要的组成部分,其广泛应用在信息通信、语音传输、自适应控制等众多领域。从结构上分,数字滤波器可以分为FIR数字滤波器和IIR数字滤波器两种基本类型。其中,FIR滤波器的设计方法有许多种,如窗函数设计法、频率取样法和等波纹最佳逼近法,本文主要针对FIR滤波器的实现原理和设计方法进行了研究。

    数字滤波器本质上讲是一种通过有限精度算法来运算的线性时不变离散系统,其具有特定的传输选择性,数字滤波器的输入和输出信号均为离散数字信号。数字滤波器的工作原理为,通过一个离散数字系统,对输入的数字信号进行运算,处理,变换等各种数字信号操作,从而实现改变数字输入序列的频谱特性或者时域波形,将有用的信号频谱分量进行保留,消除无用的信号频谱分量。数字滤波器,在功能上可以分为低通数字滤波器、高通数字滤波器、带通数字滤波器以及带阻数字滤波器四种类型。相对于模拟滤波器,数字滤波器具有高精度,高稳定性,高灵活性等优势。

三、MATLAB核心代码

clc;
clear;
close all;
 
Wp=0.2*pi; Ws=0.3*pi; wdelta= Ws-Wp;Fs=1000;T=1/Fs;N=1000;
t=0:T:(N-1)*T;
st=sin(2*pi*t*100);
subplot(3,1,1);plot(st);
nt=2*rand(1,N)-1;
xt=nt+st;
subplot(3,1,2);plot(xt);
fp=120;fs=150;Rp=0.2;As=60;Fs=1000;
wc=(fs+fp)/Fs;
B=2*pi*(fs-fp)/Fs;
Nb=ceil(11*pi/B);
hn=fir1(Nb-1,wc,blackman(Nb));
Hw=abs(fft(hn,1024));
ywt=fftfilt(hn,xt,N);
pp=abs(fft(xt,1024));
subplot(3,1,3);
plot(pp);

%用窗函数设计方法绘制滤波器损耗函数以及输出信号波形
hd = dfilt.dffir(hn)
[H,W]=freqz(hd);
m=abs(H);
figure(2);subplot(3,1,1);
plot(W/pi,20*log10(m/max(m)));grid on;
xlabel('\omega/\pi');ylabel('幅度(dB)')
axis([0,1,-100,0]);title('损耗函数曲线及其频谱图')
subplot(3,1,2);
plot(ywt);
ss=abs(fft(ywt,1024));
subplot(3,1,3);
plot(ss);


%用等波纹最佳逼近法设计滤波器
fb=[fp,fs];m=[1,0];
dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)];
[Ne,fo,mo,W]=remezord(fb,m,dev,Fs);
hn=remez(Ne,fo,mo,W);
Hw=abs(fft(hn,1024));
yet=fftfilt(hn,xt,N);

%用等波纹最佳逼近方法绘制滤波器损耗函数以及输出信号波形
hd = dfilt.dffir(hn)
[H,W]=freqz(hd);
m=abs(H);
figure(3);subplot(3,1,1);
plot(W/pi,20*log10(m/max(m)));grid on;
xlabel('\omega/\pi');ylabel('幅度(dB)')
axis([0,1,-100,0]);title('损耗函数曲线及其频谱图')
subplot(3,1,2);
plot(yet);
aa=abs(fft(yet,1024));
subplot(3,1,3);
plot(aa);


figure;
plot(W/pi,20*log10(m/max(m)));grid on;
xlabel('\omega/\pi');ylabel('幅度(dB)')
axis([0,1,-100,0]);


clc;
clear;
close all;
 
Wp=0.15*pi; Ws=0.4*pi; wdelta= Ws-Wp;Fs=1000;T=1/Fs;N=1000;
t=0:T:(N-1)*T;
st=sin(2*pi*t*100);
% subplot(3,1,1);plot(st);
nt=2*rand(1,N)-1;
xt=nt+st;
% subplot(3,1,2);plot(xt);
fp=120;fs=150;Rp=0.2;As=60;Fs=1000;
wc=(fs+fp)/Fs;
B=2*pi*(fs-fp)/Fs;
Nb=ceil(11*pi/B);
hn=fir1(Nb-1,wc,blackman(Nb));
Hw=abs(fft(hn,1024));
ywt=fftfilt(hn,xt,N);
pp=abs(fft(xt,1024));
% subplot(3,1,3);
% plot(pp);

%用窗函数设计方法绘制滤波器损耗函数以及输出信号波形
hd = dfilt.dffir(hn)
[H,W]=freqz(hd);
m=abs(H);
 

%用等波纹最佳逼近法设计滤波器
fb=[fp,fs];m=[1,0];
dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)];
[Ne,fo,mo,W]=remezord(fb,m,dev,Fs);
hn=remez(Ne,fo,mo,W);
Hw=abs(fft(hn,1024));
yet=fftfilt(hn,xt,N);

%用等波纹最佳逼近方法绘制滤波器损耗函数以及输出信号波形
hd = dfilt.dffir(hn)
[H,W]=freqz(hd);
m=abs(H);
figure;
subplot(3,1,1);
plot(W/pi,20*log10(m/max(m)));grid on;
xlabel('\omega/\pi');ylabel('幅度(dB)')
axis([0,1,-100,0]);title('损耗函数曲线及其频谱图')
subplot(3,1,2);
plot(yet);
aa=abs(fft(yet,1024));
subplot(3,1,3);
plot(aa);


figure;
plot(W/pi,20*log10(m/max(m)));grid on;
xlabel('\omega/\pi');ylabel('幅度(dB)')
axis([0,1,-100,0]);

freqz(hn,1,512); 

Ts=1/1000  ;%设置采样频率
t=0:Ts:3*pi;
y=sin(2*pi*t)+cos(400*pi*t)+cos(600*pi*t);

y_Win=filter(hn,1,y);
figure
plotspec(y_Win,Ts); 

figure
plotspec(y,Ts); 






四、仿真结论分析

    利用MATLAB可以响应的低通滤波器的时域和频率的波形图:

       等波纹最佳逼近法的最优逼近,是指在滤波器长度已知的情况下,通过加权优化的方法,使得纹波误差的值达到最小。因此,在相同阶数的情况下,基于等波纹最佳逼近法的FIR数字滤波器的通带衰减最小,阻带衰减最大。而在相同性能的情况下,基于等波纹最佳逼近法的FIR数字滤波器的阶数可以达到最小。

    这里对等波纹逼近法所设计的FIR滤波器进行仿真,通过MATLAB仿真,获得如下的仿真结果:

     从图的仿真结果克制,当信号中存在较大干扰噪声的时候,通过等波纹逼近法所设计的FIR滤波器依旧可以获得较好的滤波效果。A25-25

波纹逼近设计FIR滤波器仿真分析可以通过MATLAB代码进行实现。下面以一个低通FIR滤波器为例,演示如何使用MATLAB中的firpm函数进行设计和仿真分析。 首先,我们需要指定滤波器的阶数、截止频率、通带最大波纹和阻带最大波纹等参数,然后使用firpm函数来计算滤波器的系数。接着,我们使用freqz函数来计算滤波器的幅度响应和相位响应,并使用plot函数来绘制滤波器的幅度响应和相位响应图像。 MATLAB代码如下: ```matlab % 设置滤波器参数 N = 50; % 滤波器阶数 F = [0.2 0.3]; % 截止频率 A = [1 0]; % 通带和阻带增益 dev = [0.01 0.05]; % 通带和阻带最大波纹 % 使用firpm函数设计滤波器 b = firpm(N, F, A, dev); % 绘制滤波器的幅度响应和相位响应图像 [H, w] = freqz(b, 1); figure; subplot(2,1,1); plot(w/pi, 20*log10(abs(H))); title('FIR滤波器幅度响应'); xlabel('归一化频率'); ylabel('幅度(dB)'); grid on; subplot(2,1,2); plot(w/pi, unwrap(angle(H))); title('FIR滤波器相位响应'); xlabel('归一化频率'); ylabel('相位(rad)'); grid on; ``` 在这个示例中,我们指定了一个50阶低通FIR滤波器,截止频率为0.2和0.3,通带增益为1,阻带增益为0,通带最大波纹为0.01,阻带最大波纹为0.05。使用firpm函数计算滤波器系数,然后使用freqz函数计算滤波器的幅度响应和相位响应,并使用plot函数绘制图像。 需要注意的是,在设计滤波器时,需要权衡滤波器的性能和计算复杂度等因素。在选择通带和阻带最大波纹的时候,需要考虑信号的幅度对应用的影响。通常情况下,调整通带和阻带最大波纹的比例可以在保证滤波器性能的同时降低计算复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值