matlab 一个简单的FIR低通滤波器设计例子

matlab 一个简单的FIR低通滤波器设计例子

先直接放代码跟结果

%假设有一个3hz的信号,由于某种原因带有一些高频噪声,需要将其滤除掉
close all;
clear all;
load lowpass_fir; %fs=20 fc=6的32阶低通滤波器汉明窗

fs = 20;  %采样率
T0 = 10;  %信号时长10s
F0 = 1/T0; %频率分辨率
N = fs*T0; %采样点数
t = (0:N-1)/fs;  %时间轴坐标
f = (0:F0:fs/2-F0);  %频率轴坐标

x = sin(2*pi*3*t)+1.2*sin(2*pi*7*t)+0.7*sin(2*pi*8*t)+0.2*randn(size(t));  %模拟信号
subplot(2,2,1);
plot(t(1:100),x(1:100));

fx = abs(fft(x))*(2/N); %2/N中的N很好理解,2是因为matlab的FFT把负频也算上了,只分析正频需要加倍
subplot(2,2,3);
plot(f,fx(1:N/2));

y = filter(b_fir,1,x);
subplot(2,2,2);
plot(t(1:100),y(1:100));

fy = abs(fft(y))*(2/N);
subplot(2,2,4);
plot(f,fy(1:N/2));

1.输出有延迟,FIR滤波器的特性,阶数越大延迟越高,延迟为(N-1)/2,

2.窗函数法不可避免带来一定的频谱泄露,所以输出在3hz幅度变小,附近的频率分量增大

要有基本的数信理论才能看懂,最重要的是两点性质

1.观测时长为T0,则频率分辨率为F0=1/T0

2.采样频率为fs,则最大观测频率为fs

这样才能将坐标系对应上

matlab的滤波器设计如下,需要将滤波器系数导出这样方便使用,有了系数就可以用C语言去实现了。对于入门来说,用什么窗,阶数是多少就随便了

经验分享 程序员 微信小程序 职场和发展