四类线性相位 FIR滤波器设计 —— MATLAB源码全集


目录

引言

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滤波器的函数。这里全部写出来,以作记录,以备不时之需。


1、FIR线性相位滤波器

简单说一些 FIR线性相位滤波器的基本点:

  1. 长度有限
  2. 通带内相位线性(群延迟为常数)
  3. 长度为N,阶数为N-1
  4. 具有奇/偶对称特性

以下图片是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函数设计)滤波后输出 双边幅度谱')



有问题可以在评论区留言交流,看到会回复~~

你可能感兴趣的:(基于FPGA的数字信号处理设计,matlab,FIR,线性相位)