FIR滤波器Matlab

本文详细介绍了FIR滤波器在Matlab中的实现,包括hamming和hanning窗函数的应用。相较于IIR滤波器,FIR滤波器具有线性相移优势,适合于对时间延迟要求严格的场景。文章通过实例展示了如何使用filter函数进行滤波,并解释了加窗截断的原因,以避免频域的吉布斯现象。此外,还探讨了FIR滤波器的线性相移条件及其幅度特性的设计方法。

FIR滤波器的Matlab实现

一、Matlab实现hamming,hanning时域窗函数相乘法。

FIR与IIR滤波器相比,除了计算量大些,其他都优于IIR滤波器,比如具有线性相移,设计过程简单。而对于计算机的,计算量大已经不算缺点。所以FIR是比IIR更加优秀性能的滤波器。
线性相移有什么好处呢,就是不同频率具有固定的时间延迟,整个滤波器后的波形具有严格的相似性。

1、简要的matlab设计代码

给出正确的滤波器输入参数,首先要知道,数字滤波器都是2π归一化的,2π对应fs采样率。这一点和FFT结果是一样。采样时间离散序列,频谱以2π为周期,(也是以Fs为周期)。比如通带200Hz,阻止500Hz,采样率Fs=100000Hz。
% %------------------------------低通滤波器2----------------------------------
在这里插入图片描述
%filter()实现,原始数据data进行滤波,即data与firfilter_numt的卷积。
%======================================================
如果除了对matlab的简单使用,还想有一点点个人层面的理解,可以如下看

二、FIR滤波器的理解

因为理想滤波器具有很好频率特性,但是因为其时间响应长度无限。所以在时间域序列中,我们要用一个窗函数来把它截断,我们需要一种理想方式的截断。
比如hamming窗截断,在频域看来具有通带、阻带波动小的特点。fir1函数实现了理想低通滤波器的时域无限长序列h(t)与汉明窗window相乘,生成一个有限长的序列。即对h(t)的加窗截断。
为啥要加窗截断,而不是直接截断。数字域直接截断称为矩形窗截断,我们是从频域来看哪种滤波器性能好,时域直接矩形窗截断,频域起伏较大,约9%(-20dB)的波动,而且不随矩形窗加宽而减小,波动峰只是随宽度加大,向过渡的边界靠拢而已,也就是吉布斯现象,这样的频域特性肯定不好啦。我们希望波动小一些,而且可以承受频域过渡区域加宽一些的牺牲,因此有了各种窗,比如升余弦窗(hanning,hamming,blackman)。

如果你想进一步深究FIR滤波器的理论基础可以继续向下看

三、FIR滤波器的理论基础

**1、线性相移条件
假设有限项系数,b(k)能够实现线性相移滤波,则可以推断b(k)特点:
在这里插入图片描述

2、幅度特性**
在这里插入图片描述
当n为偶数时,将h(n)代入傅里叶变换,会得到频率为π是H(w)=0。但是n为奇数时不会(这个过程需要计算)。被告知总结如下。
在这里插入图片描述
π代表最高频率(采样率一半,Fs/2),0代表最低频率。可见n为奇数时,0和π都不为零,也就是没有低频和高频限制,因此最方便的设计特性。通常我们就去h(n)偶对称,n为奇数这种设计方法。

### 如何在 MATLAB 中设计实现 FIR 滤波器 #### 方法概述 FIR(Finite Impulse Response)滤波器是一种重要的数字滤波器类型,因其线性相位特性稳定性而被广泛应用于信号处理领域。MATLAB 提供了多种方法来设计实现 FIR 滤波器,其中最常用的是函数法、频率采样法以及等波纹最优逼近法。 --- #### 使用函数法设计 FIR 滤波器 函数法是最简单直观的一种设计方法,通过将理想的冲激响应截断并加来获得实际可用的滤波器系数。以下是具体实现过程: 1. **定义滤波器参数** 需要明确滤波器的类型(低通、高通、带通或带阻)、截止频率以及其他性能指标。 2. **计算滤波器口类型** 根据所需的衰减程度选择合适的口类型(如汉宁、海明或凯泽),并通过经验公式估计滤波器的阶数 \(N\)。 3. **生成滤波器系数** 利用 `fir1` 或 `kaiserord` 函数生成滤波器系数。 ```matlab % 定义参数 fs = 1000; % 采样率 (Hz) fc = 150; % 截止频率 (Hz) N = 50; % 滤波器阶数 windowType = 'hamming'; % 口类型 % 计算滤波器系数 b = fir1(N, fc/(fs/2), windowType); % 绘制幅度响应 [h,w] = freqz(b,1); plot(w/pi*fs/2, 20*log10(abs(h))); xlabel('Frequency (Hz)'); ylabel('Magnitude (dB)'); title('Amplitude Response of the Lowpass Filter'); grid on; ``` 此代码片段展示了如何使用 `fir1` 函数设计一个低通滤波器,并绘制其幅频响应曲线[^3]。 --- #### 使用频率采样法设计 FIR 滤波器 频率采样法通过对目标频率响应进行离散采样,再求逆傅里叶变换得到滤波器系数。这种方法适合于需要精确控制某些特定频率点的情况。 ```matlab % 定义参数 M = 51; % 滤波器度 f = [0 0.4 0.5 1]; % 归一化频率向量 a = [1 1 0 0]; % 幅度响应向量 % 设计滤波器 h = fir2(M-1, f, a); % 绘制幅度响应 [H,W] = freqz(h,1); plot(W/pi, abs(H)); xlabel('Normalized Frequency (\times\pi rad/sample)'); ylabel('|H|'); title('Magnitude Response of Bandstop Filter Using Frequency Sampling Method'); grid on; ``` 以上代码演示了一个带阻滤波器的设计过程[^3]。 --- #### 使用 Remez 法设计 FIR 滤波器 Remez 法可以实现等波纹最佳逼近,适用于对滤波器性能有严格要求的应用场景。 ```matlab % 参数设置 bands = [0.3 0.45 0.65 0.8]; desired_amplitudes = [0 1 0]; weights = [1 100 1]; % 获取滤波器阶数其他必要参数 [n,fpts,mag,wt] = remezord(bands, desired_amplitudes, weights); % 设计滤波器 b = remez(n, fpts, mag, wt); % 绘制幅度响应 [H,F] = freqz(b,1,512,'whole',2*pi); plot(F/(2*pi),abs(H)); xlabel('Normalized Frequency'); ylabel('Magnitude'); title('Bandpass Filter Designed by Remez Algorithm'); grid on; ``` 这段代码利用 `remezord` `remez` 函数完成了一款带通滤波器的设计[^2]。 --- #### 性能验证与优化 为了评估所设计滤波器的实际表现,可以通过以下手段进行测: - 使用 `freqz` 函数观察幅频响应; - 应用输入信号至滤波器模型中,比较原始信号与经过滤波后的输出差异; - 调整滤波器阶数或其他参数直至达到预期效果。 如果希望进一步提升效率,则可考虑采用硬件加速技术或将算法移植到 FPGA 上运行[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值