基于MATLAB的FIR和IIR低通/带通滤波器实现

一、FIR低通滤波器

%% FIR低通滤波器设计
clear; clc; close all;

% 参数设置
Fs = 1000;      % 采样率
Fc = 150;       % 截止频率
N = 64;         % 滤波器阶数

% 生成测试信号(含50Hz/150Hz/300Hz成分)
t = 0:1/Fs:1;
signal = sin(2*pi*50*t) + 0.5*sin(2*pi*150*t) + 0.2*sin(2*pi*300*t);

% 添加高斯噪声
noisy_signal = signal + 0.3*randn(size(t));

% 设计FIR低通滤波器(汉明窗)
Wn = Fc/(Fs/2);
b = fir1(N, Wn, 'low', hamming(N+1));

% 滤波处理
filtered = filter(b, 1, noisy_signal);

% 频谱分析
NFFT = 2^nextpow2(length(signal));
Y = fft(noisy_signal, NFFT)/NFFT;
Y_filt = fft(filtered, NFFT)/NFFT;
f = Fs/2*linspace(0,1,NFFT/2+1);

% 图形对比
figure;
subplot(2,2,1); plot(t, signal); title('原始信号');
subplot(2,2,2); plot(t, noisy_signal); title('含噪信号');
subplot(2,2,3); plot(t, filtered); title('滤波后信号');
subplot(2,2,4); plot(f, 20*log10(abs(Y(1:NFFT/2+1))));
hold on; plot(f, 20*log10(abs(Y_filt(1:NFFT/2+1))), 'r');
title('频谱对比'); legend('原始', '滤波后');

二、FIR带通滤波器

%% FIR带通滤波器设计
clear; clc; close all;

% 参数设置
Fs = 2000;      % 采样率
Fpass = [300 800]; % 通带范围
Fstop = [200 1000];% 阻带范围
Ap = 1;         % 通带衰减(dB)
As = 40;        % 阻带衰减(dB)

% 生成测试信号(含200Hz/500Hz/1000Hz成分)
t = 0:1/Fs:0.5;
signal = sin(2*pi*200*t) + sin(2*pi*500*t) + sin(2*pi*1000*t);

% 添加噪声
noisy_signal = signal + 0.5*randn(size(t));

% 计算最小阶数
N = firpmord(Fpass, Fstop, Ap, As, Fs);

% 设计带通滤波器(等波纹法)
b = firpm(N, Fpass, [1 1], [1 0.5]);

% 滤波处理
filtered = filter(b, 1, noisy_signal);

% 频谱分析
NFFT = 2^nextpow2(length(signal));
Y = fft(noisy_signal, NFFT)/NFFT;
Y_filt = fft(filtered, NFFT)/NFFT;
f = Fs/2*linspace(0,1,NFFT/2+1);

% 图形对比
figure;
subplot(2,2,1); plot(t, signal); title('原始信号');
subplot(2,2,2); plot(t, noisy_signal); title('含噪信号');
subplot(2,2,3); plot(t, filtered); title('滤波后信号');
subplot(2,2,4); plot(f, 20*log10(abs(Y(1:NFFT/2+1))));
hold on; plot(f, 20*log10(abs(Y_filt(1:NFFT/2+1))), 'r');
title('频谱对比'); legend('原始', '滤波后');

三、IIR低通滤波器

%% IIR低通滤波器设计
clear; clc; close all;

% 参数设置
Fs = 1000;      % 采样率
Fc = 150;       % 截止频率
Rp = 1;         % 通带波纹(dB)
Rs = 40;        % 阻带衰减(dB)

% 生成测试信号(含50Hz/150Hz/300Hz成分)
t = 0:1/Fs:1;
signal = sin(2*pi*50*t) + 0.5*sin(2*pi*150*t) + 0.2*sin(2*pi*300*t);

% 添加噪声
noisy_signal = signal + 0.3*randn(size(t));

% 设计巴特沃斯低通滤波器
[N, Wn] = buttord(Fc/(Fs/2), 1.2*Fc/(Fs/2), Rp, Rs);
[b,a] = butter(N, Wn, 'low');

% 滤波处理
filtered = filter(b, a, noisy_signal);

% 频谱分析
NFFT = 2^nextpow2(length(signal));
Y = fft(noisy_signal, NFFT)/NFFT;
Y_filt = fft(filtered, NFFT)/NFFT;
f = Fs/2*linspace(0,1,NFFT/2+1);

% 图形对比
figure;
subplot(2,2,1); plot(t, signal); title('原始信号');
subplot(2,2,2); plot(t, noisy_signal); title('含噪信号');
subplot(2,2,3); plot(t, filtered); title('滤波后信号');
subplot(2,2,4); plot(f, 20*log10(abs(Y(1:NFFT/2+1))));
hold on; plot(f, 20*log10(abs(Y_filt(1:NFFT/2+1))), 'r');
title('频谱对比'); legend('原始', '滤波后');

四、IIR带通滤波器

%% IIR带通滤波器设计
clear; clc; close all;

% 参数设置
Fs = 2000;      % 采样率
Fpass = [300 800]; % 通带范围
Fstop = [200 1000];% 阻带范围
Rp = 1;         % 通带波纹(dB)
Rs = 40;        % 阻带衰减(dB)

% 生成测试信号(含200Hz/500Hz/1000Hz成分)
t = 0:1/Fs:0.5;
signal = sin(2*pi*200*t) + sin(2*pi*500*t) + sin(2*pi*1000*t);

% 添加噪声
noisy_signal = signal + 0.5*randn(size(t));

% 计算最小阶数
[N, Wn] = buttord(Fpass/(Fs/2), Fstop/(Fs/2), Rp, Rs);

% 设计带通滤波器
[b,a] = butter(N, Wn, 'bandpass');

% 滤波处理
filtered = filter(b, a, noisy_signal);

% 频谱分析
NFFT = 2^nextpow2(length(signal));
Y = fft(noisy_signal, NFFT)/NFFT;
Y_filt = fft(filtered, NFFT)/NFFT;
f = Fs/2*linspace(0,1,NFFT/2+1);

% 图形对比
figure;
subplot(2,2,1); plot(t, signal); title('原始信号');
subplot(2,2,2); plot(t, noisy_signal); title('含噪信号');
subplot(2,2,3); plot(t, filtered); title('滤波后信号');
subplot(2,2,4); plot(f, 20*log10(abs(Y(1:NFFT/2+1))));
hold on; plot(f, 20*log10(abs(Y_filt(1:NFFT/2+1))), 'r');
title('频谱对比'); legend('原始', '滤波后');

五、关键参数说明

参数 FIR设计建议 IIR设计建议
阶数选择 通常需较高阶数(32-128) 较低阶数(4-16)即可
相位特性 严格线性相位 非线性相位
设计方法 窗函数法/firpm 巴特沃斯/切比雪夫
抗噪性能 过渡带较陡峭 需更高阶数实现

六、扩展应用

  1. 实时滤波

    % 使用dsp.FilterCascade实现实时处理
    firFilter = dsp.FIRFilter('Numerator', b);
    iirFilter = dsp.BiquadFilter('SOSMatrix', [b a]);
    
  2. GUI界面开发

    % 使用App Designer创建交互界面
    fdesign = fdesign.bandpass('Fst,Fp1,Fp2,Fst',200,300,800,1000,Fs);
    d = design(fdesign,'equiripple');
    

七、完整工程文件结构

Filter_Design/
├── FIR_LP/
│   ├── main.m
│   └── plot_result.m
├── FIR_BP/
│   ├── main.m
│   └── plot_result.m
├── IIR_LP/
│   ├── main.m
│   └── plot_result.m
└── IIR_BP/
    ├── main.m
    └── plot_result.m

相关代码 matlab FIR 底通和带通滤波器和IIR 底通和带通滤波器完整程序 www.youwenfan.com/contentcnj/50643.html

可清晰对比FIR和IIR滤波器在信号处理中的性能差异。实际应用中建议:

  • 对相位敏感场景优先选择FIR滤波器
  • 对计算资源有限场景选择IIR滤波器
  • 高频信号处理推荐使用等波纹设计法
posted @ 2025-10-17 16:11  lingxingqi  阅读(147)  评论(0)    收藏  举报