📄 fiter_design.m
字号:
%用自适应方式设计FIR滤波器
%迭代因子全部取1
clear all
N=100;
fs=8000;
delta_f=fs/2/(N-1);
% f=[0:fs/2/(N-1):fs/2].';
f=[0:fs/2/(N):fs/2-fs/2/(N)].';
for i=1:length(f)
A(i,1)=RequiredAmplitudeRespone(f(i));
end
M=33;%
PD=(M-1)/2;%相位延迟
omega=2*pi.*f./fs;
phi=-PD*omega;
% L-->信号长度
L=3032;
% x-->未乘以代价因子的输入信号矩阵
x=sin(2*pi*f./fs*[0:L-1]);
% A1-->无量纲的理想幅度值
A1=10.^(A./10);
% d-->未乘以代价因子的理想输出矩阵
d=A1*ones(1,L).*sin(2*pi*f./fs*[0:L-1]+phi*ones(1,L));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 用LMS算法逼近理想值 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c=ones(N,1);
cc=c;
% mu-->步长
mu=2.5e-4;
% w-->权值,也即滤波器系数
w=0.*ones(M,1);
K=10;
N2=floor(2500/delta_f);%调整范围
%=============================================%
% 迭代 %
%=============================================%
for i=1:L-M+1
%================输入信号==================%
x1=cc*ones(1,M).*x(:,i:i+M-1);
x2=sum(x1).';
%================期望信号==================%
d1=cc.*d(:,i+(M-1));
d2=sum(d1);
y=w'*x2(M:-1:1);
er(i)=d2-y;
w((M+1)/2,1)=w((M+1)/2,1)+mu*er(i)*x2((M+1)/2,1);
w(1:(M-1)/2,1)=w(1:(M-1)/2,1)+0.5*mu*er(i)*(x2(1:(M-1)/2,1)+x2(M:-1:(M+1)/2+1,1));
w(M:-1:(M+1)/2+1,1)=w(1:(M-1)/2,1);
end
H=freqz(w,1,f,fs);
HH=abs(H)./max(abs(H));
Hphase=angle(H);
HRphase=phi./pi*180;
for i=1:length(HRphase)
HRphase1(i,1)=WrapPhase(HRphase(i,1));
end
% Hphase1=UnWrap(Hphase);
subplot(211)
% plot(f,10*log10(abs(H)))
semilogx(f,10*log10(abs(H)))
hold on
semilogx(f,A,'rp')
% semilogx(f,10*log10(HH))
grid on
xlabel('Frequency / Hz');
ylabel('Amplitude respone /dB')
subplot(212)
plot(f,Hphase./pi*180)
% semilogx(f,Hphase)
hold on
plot(f,HRphase1,'rp')
grid on
xlabel('Frequency / Hz');
ylabel('Phase respone')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -