当前位置:网站首页>四类线性相位 FIR滤波器设计 —— MATLAB源码全集
四类线性相位 FIR滤波器设计 —— MATLAB源码全集
2022-06-26 12:37:00 【在路上,正出发】
目录
引言
前段时间,写了一个直接型FIR滤波器实现的Verilog程序:
最近想着再写一个线性相位型的FIR滤波器结构的Verilog程序。在规划好设计思路后,准备开始实现,准备产生四种类型线性相位滤波器抽头系数时,突然发现经常使用的函数 fir1、fir2只能产生Ⅰ、Ⅱ型FIR滤波器。后来索性先停下来研究了所有 MATLAB可以用来产生线性相位FIR滤波器的函数。这里全部写出来,以作记录,以备不时之需。
1、FIR线性相位滤波器
简单说一些 FIR线性相位滤波器的基本点:
- 长度有限
- 通带内相位线性(群延迟为常数)
- 长度为N,阶数为N-1
- 具有奇/偶对称特性
以下图片是MATLAB编辑器里面我自己总结的截图(懒得打字了)

废话不说,3,2,1 上代码~
2、Ⅰ型 FIR 滤波器
2.1、低通滤波器
%% ---- ---- ---- Ⅰ型 线性相位 FIR滤波器(低通)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |----------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 4e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 低通滤波器参数指标
Fc_LP = 1e6; % 截止频率 单位:Hz
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% I 型 FIR 设计
% -1- 低通滤波器
% 统一参数
Order_1_FIP_LP = 32; % Ⅰ型FIR低通滤波器阶数
% -1.1- fir1 实现
WINDOW_GAUSS_1_FIR_LP = gausswin(Order_1_FIP_LP+1,3); % 高斯窗 α=3
% fir1函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fir1 = fir1(Order_1_FIP_LP,2*Fc_LP/fs,"low",WINDOW_GAUSS_1_FIR_LP,"scale");
S_1_FIR_LP_fir1_OUT = filter(H_1_FIR_LP_fir1,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fir1,'filled','b')
axis tight
title('fir1函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fir1,1)
title('fir1函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fir1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fir1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fir1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fir1函数设计)滤波后输出 双边幅度谱')
% -1.2- fir2 实现
WINDOW_BLACKMAN_1_FIR_LP = blackman(Order_1_FIP_LP+1,"symmetric"); % 布莱克曼窗
% fir2函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fir2 = fir2(Order_1_FIP_LP,[0 2*Fc_LP/fs 2*Fc_LP/fs 1],[1 1 0 0],WINDOW_BLACKMAN_1_FIR_LP);
S_1_FIR_LP_fir2_OUT = filter(H_1_FIR_LP_fir2,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fir2,'filled','b')
axis tight
title('fir2函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fir2,1)
title('fir2函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fir2_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(fir2函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fir2_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fir2函数设计)滤波后输出 双边幅度谱')
% -1.3- firls 实现
% firls函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_firls = firls(Order_1_FIP_LP,[0 2*Fc_LP/fs 2*Fc_LP/fs 1],[1 1 0 0],[10,1000]);
S_1_FIR_LP_firls_OUT = filter(H_1_FIR_LP_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_firls,1)
title('firls函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.4- firpm 实现
% firpm函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_firpm = firpm(Order_1_FIP_LP,[0 2*Fc_LP/fs 4*Fc_LP/fs 1],[1 1 0 0],[10,1000]);
S_1_FIR_LP_firpm_OUT = filter(H_1_FIR_LP_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_firpm,1)
title('firpm函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.5- fircls 实现
% fircls函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fircls = fircls(Order_1_FIP_LP,[0 2*Fc_LP/fs 1],[1 0],[1.01,0.01],[0.99,-0.01]);
S_1_FIR_LP_fircls_OUT = filter(H_1_FIR_LP_fircls,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fircls,'filled','b')
axis tight
title('fircls函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fircls,1)
title('fircls函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fircls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(fircls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fircls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fircls函数设计)滤波后输出 双边幅度谱')
% -1.6- fircls1 实现
% fircls1函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fircls1 = fircls1(Order_1_FIP_LP,2*Fc_LP/fs,0.01,0.001);
S_1_FIR_LP_fircls1_OUT = filter(H_1_FIR_LP_fircls1,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fircls1,'filled','b')
axis tight
title('fircls1函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fircls1,1)
title('fircls1函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fircls1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(fircls1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fircls1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fircls1函数设计)滤波后输出 双边幅度谱')
% -1.7- rcosdesign 实现
% rcosdesign函数 设计 Ⅰ型FIR低通滤波器
% 此滤波器无法准确控制截止频率,多用于成型滤波器设计,不用于典型的四种滤波器设计
H_1_FIR_LP_rcosdesign = rcosdesign(0.2,8,4,"sqrt");
figure;
stem(H_1_FIR_LP_rcosdesign,'filled','b')
axis tight
title('rcosdesign函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_rcosdesign,1)
title('rcosdesign函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
% -1.8- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_cfirpm = cfirpm(Order_1_FIP_LP,[0 2*Fc_LP/fs 4*Fc_LP/fs 1],[1 1 0 0],[10,1000],"even");
S_1_FIR_LP_cfirpm_OUT = filter(H_1_FIR_LP_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
2.2、带通滤波器
%% ---- ---- ---- Ⅰ型 线性相位 FIR滤波器(带通)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |------------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 3e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 带通滤波器参数指标
Fc_1_BP = 1.5e6; % 截止频率1 单位:Hz
Fc_2_BP = 4.5e6; % 截止频率1 单位:Hz
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% I 型 FIR 设计
% -1- 带通滤波器
% 统一参数
Order_1_FIP_BP = 32; % Ⅰ型FIR带通滤波器阶数
% -1.1- fir1 实现
WINDOW_GAUSS_1_FIR_BP = gausswin(Order_1_FIP_BP+1,3); % 高斯窗 α=3
% fir1函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_fir1 = fir1(Order_1_FIP_BP,[2*Fc_1_BP/fs 2*Fc_2_BP/fs],"bandpass",WINDOW_GAUSS_1_FIR_BP,"scale");
S_1_FIR_BP_fir1_OUT = filter(H_1_FIR_BP_fir1,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_fir1,'filled','b')
axis tight
title('fir1函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_fir1,1)
title('fir1函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_fir1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('I 型FIR带通滤波器(fir1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_fir1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(fir1函数设计)滤波后输出 双边幅度谱')
% -1.2- fir2 实现
WINDOW_BLACKMAN_1_FIR_BP = blackman(Order_1_FIP_BP+1,"symmetric"); % 布莱克曼窗
% fir2函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_fir2 = fir2(Order_1_FIP_BP,[0 2*Fc_1_BP/fs 2*Fc_2_BP/fs 1],[0 1 1 0],WINDOW_BLACKMAN_1_FIR_BP);
S_1_FIR_BP_fir2_OUT = filter(H_1_FIR_BP_fir2,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_fir2,'filled','b')
axis tight
title('fir2函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_fir2,1)
title('fir2函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_fir2_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(fir2函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_fir2_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(fir2函数设计)滤波后输出 双边幅度谱')
% -1.3- firls 实现
% firls函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_firls = firls(Order_1_FIP_BP,[0 1.5*Fc_1_BP/fs 2*Fc_1_BP/fs 1.9*Fc_2_BP/fs 2*Fc_2_BP/fs 1],[0 0 1 1 0 0],[1,100,1]);
S_1_FIR_BP_firls_OUT = filter(H_1_FIR_BP_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_firls,1)
title('firls函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.4- firpm 实现
% firpm函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_firpm = firpm(Order_1_FIP_BP,[0 1.5*Fc_1_BP/fs 2*Fc_1_BP/fs 1.9*Fc_2_BP/fs 2*Fc_2_BP/fs 1],[0 0 1 1 0 0],[30,100,10]);
S_1_FIR_BP_firpm_OUT = filter(H_1_FIR_BP_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_firpm,1)
title('firpm函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.5- fircls 实现
% fircls函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_fircls = fircls(Order_1_FIP_BP,[0 2*Fc_1_BP/fs 2*Fc_2_BP/fs 1],[0 1 0],[0.001,1.01,0.01],[-0.001,0.99,-0.01]);
S_1_FIR_BP_fircls_OUT = filter(H_1_FIR_BP_fircls,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_fircls,'filled','b')
axis tight
title('fircls函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_fircls,1)
title('fircls函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_fircls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(fircls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_fircls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(fircls函数设计)滤波后输出 双边幅度谱')
% -1.6- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_cfirpm = cfirpm(Order_1_FIP_BP,[0 1.5*Fc_1_BP/fs 2*Fc_1_BP/fs 1.9*Fc_2_BP/fs 2*Fc_2_BP/fs 1],[0 0 1 1 0 0],[30,100,10],"even");
S_1_FIR_BP_cfirpm_OUT = filter(H_1_FIR_BP_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
2.3、带阻滤波器
%% ---- ---- ---- Ⅰ型 线性相位 FIR滤波器(带阻)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |------------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 3e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 带阻滤波器参数指标
Fc_1_BS = 1.5e6; % 截止频率1 单位:Hz
Fc_2_BS = 4.5e6; % 截止频率1 单位:Hz
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% I 型 FIR 设计
% -1- 带阻滤波器
% 统一参数
Order_1_FIP_BS = 32; % Ⅰ型FIR带阻滤波器阶数
% -1.1- fir1 实现
WINDOW_GAUSS_1_FIR_BS = gausswin(Order_1_FIP_BS+1,3); % 高斯窗 α=3
% fir1函数 设计 Ⅰ型FIR带阻滤波器
H_1_FIR_BS_fir1 = fir1(Order_1_FIP_BS,[2*Fc_1_BS/fs 2*Fc_2_BS/fs],"stop",WINDOW_GAUSS_1_FIR_BS,"scale");
S_1_FIR_BS_fir1_OUT = filter(H_1_FIR_BS_fir1,1,S_VERIFY);
figure;
stem(H_1_FIR_BS_fir1,'filled','b')
axis tight
title('fir1函数 设计 Ⅰ型FIR带阻滤波器 冲激响应')
figure;
freqz(H_1_FIR_BS_fir1,1)
title('fir1函数 设计 Ⅰ型FIR带阻滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BS_fir1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('I 型FIR带阻滤波器(fir1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BS_fir1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带阻滤波器(fir1函数设计)滤波后输出 双边幅度谱')
% -1.2- fir2 实现
WINDOW_BLACKMAN_1_FIR_BS = blackman(Order_1_FIP_BS+1,"symmetric"); % 布莱克曼窗
% fir2函数 设计 Ⅰ型FIR带阻滤波器
H_1_FIR_BS_fir2 = fir2(Order_1_FIP_BS,[0 2*Fc_1_BS/fs 2*Fc_2_BS/fs 1],[1 0 0 1],WINDOW_BLACKMAN_1_FIR_BS);
S_1_FIR_BS_fir2_OUT = filter(H_1_FIR_BS_fir2,1,S_VERIFY);
figure;
stem(H_1_FIR_BS_fir2,'filled','b')
axis tight
title('fir2函数 设计 Ⅰ型FIR带阻滤波器 冲激响应')
figure;
freqz(H_1_FIR_BS_fir2,1)
title('fir2函数 设计 Ⅰ型FIR带阻滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BS_fir2_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带阻滤波器(fir2函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BS_fir2_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带阻滤波器(fir2函数设计)滤波后输出 双边幅度谱')
% -1.3- firls 实现
% firls函数 设计 Ⅰ型FIR带阻滤波器
H_1_FIR_BS_firls = firls(Order_1_FIP_BS,[0 1.5*Fc_1_BS/fs 2*Fc_1_BS/fs 1.9*Fc_2_BS/fs 2*Fc_2_BS/fs 1],[1 1 0 0 1 1],[100,1,100]);
S_1_FIR_BS_firls_OUT = filter(H_1_FIR_BS_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_BS_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR带阻滤波器 冲激响应')
figure;
freqz(H_1_FIR_BS_firls,1)
title('firls函数 设计 Ⅰ型FIR带阻滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BS_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带阻滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BS_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带阻滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.4- firpm 实现
% firpm函数 设计 Ⅰ型FIR带阻滤波器
H_1_FIR_BS_firpm = firpm(Order_1_FIP_BS,[0 1.5*Fc_1_BS/fs 2*Fc_1_BS/fs 1.9*Fc_2_BS/fs 2*Fc_2_BS/fs 1],[1 1 0 0 1 1],[1,100,1]);
S_1_FIR_BS_firpm_OUT = filter(H_1_FIR_BS_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BS_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR带阻滤波器 冲激响应')
figure;
freqz(H_1_FIR_BS_firpm,1)
title('firpm函数 设计 Ⅰ型FIR带阻滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BS_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带阻滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BS_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带阻滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.5- fircls 实现
% fircls函数 设计 Ⅰ型FIR带阻滤波器
H_1_FIR_BS_fircls = fircls(Order_1_FIP_BS,[0 2*Fc_1_BS/fs 2*Fc_2_BS/fs 1],[1 0 1],[1.001,0.01,1.01],[0.999,-0.01,0.99]);
S_1_FIR_BS_fircls_OUT = filter(H_1_FIR_BS_fircls,1,S_VERIFY);
figure;
stem(H_1_FIR_BS_fircls,'filled','b')
axis tight
title('fircls函数 设计 Ⅰ型FIR带阻滤波器 冲激响应')
figure;
freqz(H_1_FIR_BS_fircls,1)
title('fircls函数 设计 Ⅰ型FIR带阻滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BS_fircls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带阻滤波器(fircls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BS_fircls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带阻滤波器(fircls函数设计)滤波后输出 双边幅度谱')
% -1.6- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR带阻滤波器
H_1_FIR_BS_cfirpm = cfirpm(Order_1_FIP_BS,[0 1.5*Fc_1_BS/fs 2*Fc_1_BS/fs 1.9*Fc_2_BS/fs 2*Fc_2_BS/fs 1],[1 1 0 0 1 1],[1,1000,1],"even");
S_1_FIR_BS_cfirpm_OUT = filter(H_1_FIR_BS_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BS_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR带阻滤波器 冲激响应')
figure;
freqz(H_1_FIR_BS_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR带阻滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BS_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带阻滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BS_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带阻滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
2.4、高通滤波器
%% ---- ---- ---- Ⅰ型 线性相位 FIR滤波器(高通)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |------------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 4e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 高通滤波器参数指标
Fc_HP = 1e6; % 截止频率 单位:Hz
% 带通滤波器参数指标
% 高通滤波器参数指标
% 带阻滤波器参数指标
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% I 型 FIR 设计
% -1- 高通滤波器
% 统一参数
Order_1_FIP_HP = 32; % Ⅰ型FIR高通滤波器阶数
% -1.1- fir1 实现
WINDOW_GAUSS_1_FIR_HP = gausswin(Order_1_FIP_HP+1,3); % 高斯窗 α=3
% fir1函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_fir1 = fir1(Order_1_FIP_HP,2*Fc_HP/fs,"high",WINDOW_GAUSS_1_FIR_HP,"scale");
S_1_FIR_HP_fir1_OUT = filter(H_1_FIR_HP_fir1,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_fir1,'filled','b')
axis tight
title('fir1函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_fir1,1)
title('fir1函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_fir1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('I 型FIR高通滤波器(fir1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_fir1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(fir1函数设计)滤波后输出 双边幅度谱')
% -1.2- fir2 实现
WINDOW_BLACKMAN_1_FIR_HP = blackman(Order_1_FIP_HP+1,"symmetric"); % 布莱克曼窗
% fir2函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_fir2 = fir2(Order_1_FIP_HP,[0 2*Fc_HP/fs 2*Fc_HP/fs 1],[0 0 1 1],WINDOW_BLACKMAN_1_FIR_HP);
S_1_FIR_HP_fir2_OUT = filter(H_1_FIR_HP_fir2,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_fir2,'filled','b')
axis tight
title('fir2函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_fir2,1)
title('fir2函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_fir2_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(fir2函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_fir2_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(fir2函数设计)滤波后输出 双边幅度谱')
% -1.3- firls 实现
% firls函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_firls = firls(Order_1_FIP_HP,[0 2*Fc_HP/fs 2*Fc_HP/fs 1],[0 0 1 1],[10,1000]);
S_1_FIR_HP_firls_OUT = filter(H_1_FIR_HP_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_firls,1)
title('firls函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.4- firpm 实现
% firpm函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_firpm = firpm(Order_1_FIP_HP,[0 2*Fc_HP/fs 4*Fc_HP/fs 1],[0 0 1 1],[10,1000]);
S_1_FIR_HP_firpm_OUT = filter(H_1_FIR_HP_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_firpm,1)
title('firpm函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.5- fircls 实现
% fircls函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_fircls = fircls(Order_1_FIP_HP,[0 2*Fc_HP/fs 1],[0 1],[0.01,1.01],[-0.01,0.99]);
S_1_FIR_HP_fircls_OUT = filter(H_1_FIR_HP_fircls,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_fircls,'filled','b')
axis tight
title('fircls函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_fircls,1)
title('fircls函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_fircls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(fircls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_fircls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(fircls函数设计)滤波后输出 双边幅度谱')
% -1.6- fircls1 实现
% fircls1函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_fircls1 = fircls1(Order_1_FIP_HP,2*Fc_HP/fs,0.01,0.001,"high");
S_1_FIR_HP_fircls1_OUT = filter(H_1_FIR_HP_fircls1,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_fircls1,'filled','b')
axis tight
title('fircls1函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_fircls1,1)
title('fircls1函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_fircls1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(fircls1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_fircls1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(fircls1函数设计)滤波后输出 双边幅度谱')
% -1.7- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_cfirpm = cfirpm(Order_1_FIP_HP,[0 2*Fc_HP/fs 4*Fc_HP/fs 1],[0 0 1 1],[10,1000],"even");
S_1_FIR_HP_cfirpm_OUT = filter(H_1_FIR_HP_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
3、Ⅱ型 FIR滤波器
3.1、低通滤波器
2.1节中的低通滤波器,将阶数换做奇数即可,rcosdesign函数此类型不可用。
具体:
%% ---- ---- ---- Ⅱ 型 线性相位 FIR滤波器(低通)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |------------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 4e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 低通滤波器参数指标
Fc_LP = 1e6; % 截止频率 单位:Hz
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% FIR 设计
% -1- 低通滤波器
% 统一参数
Order_1_FIP_LP = 31; % Ⅰ型FIR低通滤波器阶数
% -1.1- fir1 实现
WINDOW_GAUSS_1_FIR_LP = gausswin(Order_1_FIP_LP+1,3); % 高斯窗 α=3
% fir1函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fir1 = fir1(Order_1_FIP_LP,2*Fc_LP/fs,"low",WINDOW_GAUSS_1_FIR_LP,"scale");
S_1_FIR_LP_fir1_OUT = filter(H_1_FIR_LP_fir1,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fir1,'filled','b')
axis tight
title('fir1函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fir1,1)
title('fir1函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fir1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fir1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fir1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fir1函数设计)滤波后输出 双边幅度谱')
% -1.2- fir2 实现
WINDOW_BLACKMAN_1_FIR_LP = blackman(Order_1_FIP_LP+1,"symmetric"); % 布莱克曼窗
% fir2函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fir2 = fir2(Order_1_FIP_LP,[0 2*Fc_LP/fs 2*Fc_LP/fs 1],[1 1 0 0],WINDOW_BLACKMAN_1_FIR_LP);
S_1_FIR_LP_fir2_OUT = filter(H_1_FIR_LP_fir2,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fir2,'filled','b')
axis tight
title('fir2函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fir2,1)
title('fir2函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fir2_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(fir2函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fir2_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fir2函数设计)滤波后输出 双边幅度谱')
% -1.3- firls 实现
% firls函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_firls = firls(Order_1_FIP_LP,[0 2*Fc_LP/fs 2*Fc_LP/fs 1],[1 1 0 0],[10,1000]);
S_1_FIR_LP_firls_OUT = filter(H_1_FIR_LP_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_firls,1)
title('firls函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.4- firpm 实现
% firpm函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_firpm = firpm(Order_1_FIP_LP,[0 2*Fc_LP/fs 4*Fc_LP/fs 1],[1 1 0 0],[10,1000]);
S_1_FIR_LP_firpm_OUT = filter(H_1_FIR_LP_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_firpm,1)
title('firpm函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.5- fircls 实现
% fircls函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fircls = fircls(Order_1_FIP_LP,[0 2*Fc_LP/fs 1],[1 0],[1.01,0.01],[0.99,-0.01]);
S_1_FIR_LP_fircls_OUT = filter(H_1_FIR_LP_fircls,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fircls,'filled','b')
axis tight
title('fircls函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fircls,1)
title('fircls函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fircls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(fircls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fircls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fircls函数设计)滤波后输出 双边幅度谱')
% -1.6- fircls1 实现
% fircls1函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_fircls1 = fircls1(Order_1_FIP_LP,2*Fc_LP/fs,0.01,0.001);
S_1_FIR_LP_fircls1_OUT = filter(H_1_FIR_LP_fircls1,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_fircls1,'filled','b')
axis tight
title('fircls1函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_fircls1,1)
title('fircls1函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_fircls1_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(fircls1函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_fircls1_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(fircls1函数设计)滤波后输出 双边幅度谱')
% -1.8- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR低通滤波器
H_1_FIR_LP_cfirpm = cfirpm(Order_1_FIP_LP,[0 2*Fc_LP/fs 4*Fc_LP/fs 1],[1 1 0 0],[10,1000],"even");
S_1_FIR_LP_cfirpm_OUT = filter(H_1_FIR_LP_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_LP_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR低通滤波器 冲激响应')
figure;
freqz(H_1_FIR_LP_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR低通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_LP_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR低通滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_LP_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR低通滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
3.2、带通滤波器
将2.2节中的阶数换为奇数即可,此处不再详细贴代码。
4、Ⅲ型 FIR滤波器
4.1、带通滤波器
%% ---- ---- ---- Ⅲ型 线性相位 FIR滤波器(带通)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |------------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 2.5e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 带通滤波器参数指标
Fc_1_BP = 2e6; % 截止频率1 单位:Hz
Fc_2_BP = 3e6; % 截止频率1 单位:Hz
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% FIR 设计
% -1- 带通滤波器
% 统一参数
Order_1_FIP_BP = 32; % Ⅰ型FIR带通滤波器阶数
% -1.1- firls 实现
% firls函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_firls = firls(Order_1_FIP_BP,[0 1.5*Fc_1_BP/fs 2*Fc_1_BP/fs 1.9*Fc_2_BP/fs 2*Fc_2_BP/fs 1],[0 0 1 1 0 0],[1,100,1],"hilbert");
S_1_FIR_BP_firls_OUT = filter(H_1_FIR_BP_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_firls,1)
title('firls函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.2- firpm 实现
% firpm函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_firpm = firpm(Order_1_FIP_BP,[0 1.5*Fc_1_BP/fs 2*Fc_1_BP/fs 1.9*Fc_2_BP/fs 2*Fc_2_BP/fs 1],[0 0 1 1 0 0],[30,100,10],"hilbert");
S_1_FIR_BP_firpm_OUT = filter(H_1_FIR_BP_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_firpm,1)
title('firpm函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.2- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_cfirpm = cfirpm(Order_1_FIP_BP,[2*Fc_1_BP/fs 2*Fc_2_BP/fs],@hilbfilt);
S_1_FIR_BP_cfirpm_OUT = filter(H_1_FIR_BP_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
5、Ⅳ型 FIR滤波器
5.1、高通滤波器
%% ---- ---- ---- Ⅳ型 线性相位 FIR滤波器(高通)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |------------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 2.5e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 高通滤波器参数指标
Fc_1_HP = 1e6; % 阻带截止频率1 单位:Hz
Fc_2_HP = 3.8e6; % 通带截止频率1 单位:Hz
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% Ⅳ 型 FIR 设计
% -1- 高通滤波器
% 统一参数
Order_1_FIP_HP = 31; % Ⅰ型FIR高通滤波器阶数
% -1.1- firls 实现
% firls函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_firls = firls(Order_1_FIP_HP,[0 2*Fc_1_HP/fs 2*Fc_2_HP/fs 1],[0 0 1 1],[100,1],"hilbert");
S_1_FIR_HP_firls_OUT = filter(H_1_FIR_HP_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_firls,1)
title('firls函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.2- firpm 实现
% firpm函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_firpm = firpm(Order_1_FIP_HP,[0 2*Fc_1_HP/fs 2*Fc_2_HP/fs 1],[0 0 1 1],[100,1],"hilbert");
S_1_FIR_HP_firpm_OUT = filter(H_1_FIR_HP_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_firpm,1)
title('firpm函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.2- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR高通滤波器
H_1_FIR_HP_cfirpm = cfirpm(Order_1_FIP_HP,[2*Fc_1_HP/fs 0.99],@hilbfilt);
S_1_FIR_HP_cfirpm_OUT = filter(H_1_FIR_HP_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_HP_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR高通滤波器 冲激响应')
figure;
freqz(H_1_FIR_HP_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR高通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_HP_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR高通滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_HP_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR高通滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
5.2、带通滤波器
%% ---- ---- ---- Ⅳ型 线性相位 FIR滤波器(带通)设计研究 ---- ---- ----
% Author : Xu Y. B.(CSDN ID :在路上,正出发)
% MATLAB RELEASE : 2022a
% 总结:
% ----线性相位 FIR 滤波器 种类----
% | 类型 | 阶数奇偶 | 长度奇偶 | 对称性 | 特性限制 | 可用函数使用说明 |
% |------------------------------------------------------------------------------------------------------------------------|
% | Ⅰ | 偶 | 奇 | 偶 | 无 |fir1、fir2、firls、firpm、fircls、fircls1、rcosdesign、cfirpm|
% | Ⅱ | 奇 | 偶 | 偶 | 高通、带阻无法设计 | fir1、fir2、firls、firpm、fircls、fircls1、cfirpm |
% | Ⅲ | 偶 | 奇 | 奇 | 只能设计带通滤波器 | firls、firpm、cfirpm |
% | Ⅳ | 奇 | 偶 | 奇 | 低通、带阻无法设计 | firls、firpm、cfirpm |
% Ref:
% [1] 钱玲等, 数字信号处理. 2018: 电子工业出版社.
% [2] https://ww2.mathworks.cn/help/signal/ug/fir-filter-design.html
%% CLEAR
clc;
clearvars;
close all;
set(0,'defaultfigurecolor','w')
%% 参数设置区
% 系统参数
fs = 10e6; % 采样率 单位:Hz
f1 = 10e3; % 验证信号频点1 单位:Hz
f2 = 2.5e6; % 验证信号频点2 单位:Hz
A1 = 1; % 验证信号幅度1 单位:V
A2 = 2; % 验证信号幅度1 单位:V
N = 8192; % 验证信号长度
% 带通滤波器参数指标
Fc_1_BP = 1e6; % 截止频率1 单位:Hz
Fc_2_BP = 3.8e6; % 截止频率1 单位:Hz
%% 验证信号产生
t = (0:N-1)/fs;
S_VERIFY = A1*cos(2*pi*f1*t) + A2*cos(2*pi*f2*t);
figure;
subplot(211)
plot(t*1e6,S_VERIFY,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_VERIFY)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('双边幅度谱')
%% FIR 设计
% -1- 带通滤波器
% 统一参数
Order_1_FIP_BP = 31; % Ⅰ型FIR带通滤波器阶数
% -1.1- firls 实现
% firls函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_firls = firls(Order_1_FIP_BP,[0 1.5*Fc_1_BP/fs 2*Fc_1_BP/fs 1.9*Fc_2_BP/fs 2*Fc_2_BP/fs 1],[0 0 1 1 0 0],[1,100,1],"hilbert");
S_1_FIR_BP_firls_OUT = filter(H_1_FIR_BP_firls,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_firls,'filled','b')
axis tight
title('firls函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_firls,1)
title('firls函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_firls_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(firls函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_firls_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(firls函数设计)滤波后输出 双边幅度谱')
% -1.2- firpm 实现
% firpm函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_firpm = firpm(Order_1_FIP_BP,[0 1.5*Fc_1_BP/fs 2*Fc_1_BP/fs 1.9*Fc_2_BP/fs 2*Fc_2_BP/fs 1],[0 0 1 1 0 0],[30,100,10],"hilbert");
S_1_FIR_BP_firpm_OUT = filter(H_1_FIR_BP_firpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_firpm,'filled','b')
axis tight
title('firpm函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_firpm,1)
title('firpm函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_firpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(firpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_firpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(firpm函数设计)滤波后输出 双边幅度谱')
% -1.2- cfirpm 实现
% cfirpm函数 设计 Ⅰ型FIR带通滤波器
H_1_FIR_BP_cfirpm = cfirpm(Order_1_FIP_BP,[2*Fc_1_BP/fs 2*Fc_2_BP/fs],@hilbfilt);
S_1_FIR_BP_cfirpm_OUT = filter(H_1_FIR_BP_cfirpm,1,S_VERIFY);
figure;
stem(H_1_FIR_BP_cfirpm,'filled','b')
axis tight
title('cfirpm函数 设计 Ⅰ型FIR带通滤波器 冲激响应')
figure;
freqz(H_1_FIR_BP_cfirpm,1)
title('cfirpm函数 设计 Ⅰ型FIR带通滤波器 频响曲线')
figure;
subplot(211)
plot(t*1e6,S_1_FIR_BP_cfirpm_OUT,'b')
axis tight
xlabel('时间/微秒')
ylabel('幅度/V')
title('Ⅰ 型FIR带通滤波器(cfirpm函数设计)滤波后输出 时域波形')
subplot(212)
plot(linspace(-fs/2,fs/2,N)/1e6,abs(fftshift(fft(S_1_FIR_BP_cfirpm_OUT)))/N*2,'r')
axis tight
xlabel('频率/兆赫兹')
ylabel('幅度/V')
title('I 型FIR带通滤波器(cfirpm函数设计)滤波后输出 双边幅度谱')
有问题可以在评论区留言交流,看到会回复~~
边栏推荐
- 快手实时数仓保障体系研发实践
- 不到40行代码手撸一个BlocProvider
- 程序员必备,一款让你提高工作效率N倍的神器uTools
- [极客大挑战 2019]RCE ME 1
- JS get the current screen height method and listen for DOM elements to enter the viewport
- Tiger Dao VC products are officially launched, a powerful supplement to seektiger ecology
- Current situation investigation and investment prospect forecast analysis report of China's electrolytic copper market from 2022 to 2028
- Tiger DAO VC产品正式上线,Seektiger生态的有力补充
- TP5 thinkphp5 report serialization of'closure'is not allowed
- ES6模块
猜你喜欢

NoSQL mongodb - 04 mongodb database and web service combination case

Scala-day03- operators and loop control

"Pinduoduo and short video speed version", how can I roast!

JS get the current screen height method and listen for DOM elements to enter the viewport

环形队列php

Comparison of latest mobile phone processors in 2020 (with mobile phone CPU ladder diagram)

NoSQL mongodb - 01 introduction to NoSQL and mongodb

power designer - 自定义注释按钮

ES6:迭代器

EasyGBS如何解决对讲功能使用异常?
随机推荐
环形队列php
NoSQL mongodb - 01 introduction to NoSQL and mongodb
imagecopymerge
Configuring Apache digest authentication
MySQL 自定义函数时:This function has none of DETERMINISTIC, NO SQL 解决方案
[solved] laravel completes the scheduled job task (delayed distribution task) [execute a user-defined task at a specified time]
Tiger Dao VC products are officially launched, a powerful supplement to seektiger ecology
"Pinduoduo and short video speed version", how can I roast!
快手实时数仓保障体系研发实践
5+API,清除应用缓存
Scala-day03- operators and loop control
JS get the current screen height method and listen for DOM elements to enter the viewport
Tiger Dao VC products are officially launched, a powerful supplement to seektiger ecology
7-1 数的范围
Introduction to the four major FPGA manufacturers abroad
Report on in-depth analysis and investment strategy recommendations for China's petroleum coke industry (2022 Edition)
国标GB28181协议EasyGBS级联宇视平台,保活消息出现403该如何处理?
Research on the current situation of China's modified engineering plastics market and demand forecast analysis report 2022-2028
Laravel uses find_ IN_ The set() native MySQL statement accurately queries whether a special string exists in the specified string to solve the problem that like cannot be accurately matched. (resolve
7-3 最低通行费