基于MATLAB的FIR和IIR低通带通滤波器实现
基于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 | 巴特沃斯/切比雪夫 |
抗噪性能 | 过渡带较陡峭 | 需更高阶数实现 |
六、扩展应用
-
实时滤波
% 使用dsp.FilterCascade实现实时处理 firFilter = dsp.FIRFilter('Numerator', b); iirFilter = dsp.BiquadFilter('SOSMatrix', [b a]);
-
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/contentcsf/50643.html
可清晰对比FIR和IIR滤波器在信号处理中的性能差异。实际应用中建议:
- 对相位敏感场景优先选择FIR滤波器
- 对计算资源有限场景选择IIR滤波器
- 高频信号处理推荐使用等波纹设计法