📄 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 + -