题目:采用自适应模拟滤波器拟合一个带通滤波器,并与 Matlab 中拟合的带通
滤波器进行对比。
假设滤波器的通带频率为 40Hz,阻带频率为 60Hz,信号的采样率为 500Hz,采
用自适应模拟 FIR 滤波器,结果如下图:
用 Matlab 自带的函数,拟合一个 FIR 带通滤波器,窗函数为汉明窗,得到结果为:
代码:
clc
close all
clear all
%%
%设计 FIR 滤波器
n=50;
w=[40,60];
fs=500;
wn=w*2/fs;
b_bandpass=fir1(n,wn,'bandpass');
m_bandpass=10*log(abs(fft(b_bandpass)));
x_f=0:(fs/length(m_bandpass)):fs/2;
figure;
plot(x_f,m_bandpass(1:length(x_f)))
%axis([0,10,-200,0]);
%%
%设计巴特沃斯带通滤波器
% wp=[0.05*2*pi,0.1*2*pi];
% ws=[0.01*2*pi,0.15*2*pi];
% Rp=1;
% Rs=20;
%
% [N,Wn]=buttord(wp,ws,Rp,Rs,'s');
% fprintf('巴特沃斯滤波器 N=%4d\n',N);
% [bb,ab]=butter(N,Wn,'s');
% W=0:0.01:2;
% [Hd,wb]=freqs(bb,ab,W);
% figure;plot(wb/pi,10*log(abs(Hd)),'b');
% axis([0,0.5,-20,0]);
%%
%输入信号产生
N=100;
x=0;
fl=1;
fmax=fl*N;
t=0:1/N/5:100;
%设置频点
for i=1:N
end
x=x+sin(2*pi*fl*(i-1)*t);
y=0;
for i=50:70
end
y=y+50*sin(2*pi*fl*i*t);
ss=50;
w = 1*ones(ss,length(x)-ss+2);
for cont = 1 :length(x)-ss+1
X_input = x(cont+ss-1:-1:cont);
error_output= y(cont+ss-1) - X_input*w(:,cont);
error_coverror_output(cont) = error_output;
delt_grad = -error_output*conj(X_input')/(X_input*X_input.');
w(:,cont+1) = w(:,cont) - 0.02/ss*delt_grad;
end
%%
wm=w(:,length(x)-ss+2);
m=10*log(abs(fft(wm))/max(abs(fft(wm))));
x_f=0:(fs/length(m_bandpass)):fs/2;
figure;
plot(x_f,m(2:length(x_f)+1))