目录
引言
1、FIR线性相位滤波器
2、Ⅰ型 FIR 滤波器
2.1、低通滤波器
2.2、带通滤波器
2.3、带阻滤波器
2.4、高通滤波器
3、Ⅱ型 FIR滤波器
3.1、低通滤波器
3.2、带通滤波器
4、Ⅲ型 FIR滤波器
4.1、带通滤波器
5、Ⅳ型 FIR滤波器
5.1、高通滤波器
5.2、带通滤波器
前段时间,写了一个直接型FIR滤波器实现的Verilog程序:
数字信号处理——直接型FIR滤波器设计(1)
数字信号处理——直接型FIR滤波器设计(2)
最近想着再写一个线性相位型的FIR滤波器结构的Verilog程序。在规划好设计思路后,准备开始实现,准备产生四种类型线性相位滤波器抽头系数时,突然发现经常使用的函数 fir1、fir2只能产生Ⅰ、Ⅱ型FIR滤波器。后来索性先停下来研究了所有 MATLAB可以用来产生线性相位FIR滤波器的函数。这里全部写出来,以作记录,以备不时之需。
简单说一些 FIR线性相位滤波器的基本点:
以下图片是MATLAB编辑器里面我自己总结的截图(懒得打字了)
废话不说,3,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函数设计)滤波后输出 双边幅度谱')
%% ---- ---- ---- Ⅰ型 线性相位 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函数设计)滤波后输出 双边幅度谱')
%% ---- ---- ---- Ⅰ型 线性相位 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函数设计)滤波后输出 双边幅度谱')
%% ---- ---- ---- Ⅰ型 线性相位 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函数设计)滤波后输出 双边幅度谱')
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函数设计)滤波后输出 双边幅度谱')
将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 = 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函数设计)滤波后输出 双边幅度谱')
%% ---- ---- ---- Ⅳ型 线性相位 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函数设计)滤波后输出 双边幅度谱')
%% ---- ---- ---- Ⅳ型 线性相位 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函数设计)滤波后输出 双边幅度谱')
有问题可以在评论区留言交流,看到会回复~~