⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fir.m

📁 分别用窗函数法和等波纹最佳一致逼近法分别对FIR数字滤波器进行设计和仿真
💻 M
字号:
%(1)窗函数法
%program  3-01利用汉宁窗函数设计一个线性相位FIR低通滤波器
wp=0.5*pi;
ws=0.66*pi;
width=ws-wp;
N=ceil(8*pi/width);     %滤波器窗口长度
if(rem(N,2))==0
    N=N+1;
end
Nw=N;
wc=(wp+ws)/2;       %滤波器截止频率
n=0:N-1;
alpha=(N-1)/2;
m=n-alpha+0.00001;
hd=sin(wc*m)./(pi*m);
win=hanning(Nw);
h=hd.*win';
b=h;
freqz(b,1,512);
%program 3-021)	fir1函数设计FIR带通滤波器
b=fir1(48,[0.35 0.65]);
freqz(b,1,512)
%program 3-032)	用fir2函数设计一个30阶低通滤波器
f=[0 0.6 0.6 1];
m=[1 1 0 0];
b=fir2(30,f,m);
[h,w]=freqz(b,1,128);
plot(f,m,w/pi,abs(h))
legend('期望频率响应','实际频率响应')
title('Comparison of Frequency Response Magnitudes')
%(2)等波纹最佳一致逼近法(也称Parks-McClellan最优法)
%program 3-04  用remez函数设计FIR低通滤波器
clear;close all
fc=1/4;fs=5/16;         %输入给定指标
Rp=3;As=60;Fs=2;
f=[fc,fs];m=[1,0];      %计算remezord函数所需参数f,m,dev
dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)];
[N,f0,m0,W]=remezord(f,m,dev,Fs);    %确定remez函数所需参数
hn=remez(N,f0,m0,W);    %调用remez函数进行设计
hw=fft(hn,512);         %求设计出的滤波器频率特性
w=[0:511]*2/512;
plot(w,20*log10(abs(hw)));grid;    %画对数幅频特性图
axis([0,max(w)/2,-90,5]);
xlabel('w/pi');ylabel('Magnitude(dB)')
line([0,0.4],[-3,-3]);     %画线检验设计结果
line([1/4,1/4],[-90,5]);line([5/16,5/16],[-90,5]);
%program 3-05   用remez函数设计FIR数字高通滤波器
clear;close all
f=[0,23/32,3/4,1];m=[0,0,1,1];
N1=30;W1=[1,1];hn1=remez(N1,f,m,W1);        %情况①
k=[0:1023]*2/1024;
Hw1=fft(hn1,1024);plot(k,20*log10(abs(Hw1)));   %求出其幅频特性
axis([0,1,-40,5]),grid on,pause                  %只画出正半轴频谱
N2=31;W2=[1,5];hn2=remez(N2,f,m,W2);        %情况②
Hw2=fft(hn2,1024);plot(k,20*log10(abs(Hw2)));   %求出其幅频特性
axis([0,1,-40,5]),grid on,pause                  %只画出正半轴频谱
N3=60;W3=[1,1];hn3=remez(N3,f,m,W3);        %情况③
Hw3=fft(hn3,1024);plot(k,20*log10(abs(Hw3)));   %求出其幅频特性
axis([0,1,-40,5]),grid on,pause                  %只画出正半轴频谱
 %program 3-06用firls函数设计一个24阶的反对称分段线性带通滤波器
F=[0,0.3,0.4,0.6,0.7,0.9]
M=[0   1   0    0  0.5  0.5]
b=firls(24,F,M,'hilbert');
for i=1:2:6,
      plot([F(i) F(i+1)],[M(i) M(i+1)],'--'),hold on
end
[H,f]=freqz(b,1,512,2);
plot(f,abs(H)),grid on,hold off
legend('期望频率响应','实际频率响应')
 %program 3-07用remez函数设计一个24阶的反对称分段线性带通滤波器(同上)
F=[0,0.3,0.4,0.6,0.7,0.9]
M=[0   1   0    0  0.5  0.5]
b=remez(24,F,M);
for i=1:2:6,
      plot([F(i) F(i+1)],[M(i) M(i+1)],'--'),hold on
end
[H,f]=freqz(b,1,512,2);
plot(f,abs(H)),grid on,hold off
axis([0 1 0 1]);
legend('期望频率响应','实际频率响应')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -