摘自<Understanding Digital Signal Processing>第三版,13.10 Fast FIR Filtering Using the FFT一节

基于的理论:频域上的乘积等效于时域上的卷积。

基本的计算流程,如下图所示。

将输入信号x(n)x(n)x(n)和滤波器参数h(k)h(k)h(k)分别进行FFT,得到X(m)X(m)X(m)和H(m)H(m)H(m),在频域上进行乘积,然后,进行IFFT。

对于Q−tapQ-tapQ−tap的FIR滤波器,其标准的卷积方程为
y(n)=∑k=0Q−1h(k)x(n−k)=h(k)∗x(n)y(n)=\sum ^{Q-1} _{k=0} {h(k)x(n-k)}=h(k)*x(n) y(n)=k=0∑Q−1​h(k)x(n−k)=h(k)∗x(n)
假设h(k)h(k)h(k)的长度为QQQ,x(n)x(n)x(n)的长度为PPP,则最终输出的y(n)y(n)y(n)的长度为L=Q+P−1L=Q+P-1L=Q+P−1.

为了使快速卷积技术能得到有效的结果,前向和逆FFT的尺寸必须等于或大于LLL,因此,N−pointN-pointN−point的FFT尺寸为N≥LN\ge LN≥L,并对h(k)h(k)h(k)和x(n)x(n)x(n)进行zero−padzero-padzero−pad,使其长度等于NNN。所需要的输出y(n)y(n)y(n)为逆FFT的前LLL个样本的实数部分。关于滤波器参数的FFT只需计算一次并存储下来即可。

当输出序列长度太大,必须进行分段处理时,有两种处理方法:overlap−and−saveoverlap-and-saveoverlap−and−save和overlap−and−addoverlap-and-addoverlap−and−add。

Overlap-and-save

具体流程,如下图所示。

对于给定的FIR滤波器的脉冲响应h(k)h(k)h(k)的长度为QQQ,输入序列x(n)x(n)x(n)的长度为PPP,具体步骤:

  1. 选择FFT的尺寸为NNN,其中NNN为2的指数,约等于4倍QQQ;
  2. 在h(k)h(k)h(k)的末端增加(N−Q)(N-Q)(N−Q)个零值样本,进行N−pointN-pointN−point的FFT,生成复序列H(m)H(m)H(m);
  3. 计算整数M,M=N−(Q−1)M=N-(Q-1)M=N−(Q−1);
  4. 在x(n)x(n)x(n)的前MMM样本之前插入(Q−1)(Q-1)(Q−1)个零值样本,创建N−pointN-pointN−point的FFT的输入序列x1(n)x_1(n)x1​(n);
  5. 对x1(n)x_1(n)x1​(n)进行N−pointN-pointN−point的FFT计算,并乘以H(m)H(m)H(m),然后,对乘积进行N−pointN-pointN−point的逆FFT。去掉逆FFT结果的前(Q−1)(Q-1)(Q−1)个样本,生成M−pointM-pointM−point的输出y1(n)y_1(n)y1​(n);
  6. 将x1(n)x_1(n)x1​(n)的前(Q−1)(Q-1)(Q−1)个零值样本增加到第二个原始长度为M的x(n)x(n)x(n)的开头部分,创建第二个N−pointN-pointN−point的FFT输入序列x2(n)x_2(n)x2​(n);
  7. 对x2(n)x_2(n)x2​(n)进行N−pointN-pointN−point的FFT计算,并乘以H(m)H(m)H(m),然后,进行逆FFT,去除前(Q−1)(Q-1)(Q−1)个样本,生成第二个M点的输出数据y2(n)y_2(n)y2​(n);
  8. 重复步骤6-7,直至处理完整个输入序列。
  9. 将生成的y1(n),y2(n),y3(n),....y_1(n),y_2(n),y_3(n),....y1​(n),y2​(n),y3​(n),....进行串联合并,生成最终的线性卷积滤波器的输出序列y(n)y(n)y(n)。
  10. 可以试验不同的NNN值,看是否存在一个最优的NNN使得你的硬件和软件实现的计算载荷最小。不过,在任何情况下,NNN必须不小于(M+Q−1)(M+Q-1)(M+Q−1)。

Overlap-and-add

具体流程,如下图所示。

对于这种方法,输入序列x(n)x(n)x(n)被分段成长度为MMM的数据片段,数据的overlap发生在逆FFT计算。对于给定的FIR滤波器的脉冲响应h(k)h(k)h(k)的长度为QQQ,输入序列x(n)x(n)x(n)的长度为PPP,具体步骤:

  1. 选择FFT尺寸为NNN,其中NNN为2的指数,约等于2倍的Q;
  2. 在h(k)h(k)h(k)的末端增加(N−Q)(N-Q)(N−Q)个零值样本,进行N−pointN-pointN−point的FFT,生成复序列H(m)H(m)H(m);
  3. 计算整数M,M=N−(Q−1)M=N-(Q-1)M=N−(Q−1);
  4. 在原始序列x1(n)x_1(n)x1​(n)的前MMM样本末端增加(Q−1)(Q-1)(Q−1)个零值样本,创建N−pointN-pointN−point的FFT的输入序列x1(n)x_1(n)x1​(n);
  5. 对x1(n)x_1(n)x1​(n)进行N−pointN-pointN−point的FFT计算,并乘以H(m)H(m)H(m),然后,对乘积进行N−pointN-pointN−point的逆FFT。并保留前MMM个样本,生成MMM样本的输出数据y1(n)y_1(n)y1​(n);
  6. 在第二个原始序列x2(n)x_2(n)x2​(n)的前MMM样本末端增加(Q−1)(Q-1)(Q−1)个零值样本,创建N−pointN-pointN−point的FFT的输入序列x2(n)x_2(n)x2​(n);
  7. 对第二个N−pointN-pointN−point的输入序列进行FFT计算,并乘以H(m)H(m)H(m),然后,对乘积进行N−pointN-pointN−point的逆FFT。将上一步的逆FFT的最后Q−1Q-1Q−1个样本增加到当前逆FFT序列的开头的Q−1Q-1Q−1个样本上。保留Q−1Q-1Q−1个样本相加过程的结果序列中的开头的MMM个样本作为输出数据y2(n)y_2(n)y2​(n);
  8. 重复步骤6-7,直至处理完整个数据序列。
  9. 将生成的y1(n),y2(n),y3(n),....y_1(n),y_2(n),y_3(n),....y1​(n),y2​(n),y3​(n),....进行串联合并,生成最终的线性卷积滤波器的输出序列y(n)y(n)y(n)。
  10. 可以试验不同的NNN值,看是否存在一个最优的NNN使得你的硬件和软件实现的计算载荷最小。不过,在任何情况下,NNN必须不小于$

使用FFT进行快速FIR滤波相关推荐

  1. 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)

    1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤 ...

  2. 嵌入式开发日记(8)——用python实现FIR滤波(未完待续)

    第一阶段的方法是根据单位时间内的加速度绝对值差值来判断震颤程度,存在很多问题.因此设想采用更加高级的算法来加以改进. 这部分的主要工作有:  1 学习数字信号处理的滤波算法,重点学习python下使用 ...

  3. fir 滤波参数的含义_详解FIR滤波器与IIR滤波器的具体区别

    姓名:高新诚       学号:17021223282 原文链接:http://mp.weixin.qq.com/s/tC_mdXIeusuggDV1tn3sOw [嵌牛导读]:在大学中学习到了FIR ...

  4. matlab序列谱分析,基于MATLAB序列谱分析及FFT实现快速卷积.pdf

    数字信号处理大作业 基于MATLAB 的序列谱分析与FFT 实现快速卷积 学 院(系): 软件学院 专 业: 网络工程 学 生 姓 名: 学 号: 班 级: 完 成 日 期: 大连理工大学 Dalia ...

  5. (FFT)快速傅里叶变换在目标跟踪中的运用

    随着科学技术的不断发展,许多用于加快计算速度的算法应运而生,快速傅里叶变换就是其中之一,快速傅里叶变换是傅里叶变换的一种快速计算方式.傅里叶变换在科学研究中运用非常广泛,刚开始出现时,主要用于信号分析 ...

  6. DSP28335通过FFT变换实现高频滤波

    这次项目中,由于AD采集到的高频开关噪声大,对数据处理存在极大干扰,经过示波器测量,发现噪声频率主要集中在80kHz,寻求老师帮助,老师推荐使用FFT滤波,有同学使用的是FIR滤波,通过Matlab中 ...

  7. 【嵌入式】STM32利用arm-dsp库进行FIR滤波

    目录 一.Matlab中的FIR实验 1.搭建原始信号 2.设计FIR滤波器 3.FIR滤波 4.滤波前后对比 二.嵌入式平台FIR滤波移植 1.arm-dsp库移植 2.获得FIR滤波系数 3.基于 ...

  8. Matlab、图像IIR、FIR滤波

    大三上学期学的数字信号处理,Matlab大实验可以自选题,想到老师上课说的IIR.FIR的区别,借助图像观察两种滤波器的区别.当然,现在大家使用的图像处理算法是现代滤波器,与经典滤波器分析问题的角度不 ...

  9. [DSP学习笔记]基于TMS320F28335的FIR滤波实现

    首先进入TI官网,搜索C2000 wave,进行下载安装. 安装完成后,在2000 wave的安装目录下,进入以下目录:C2000Ware_4_02_00_00\libraries\dsp\FPU\c ...

最新文章

  1. 比尔盖茨护犊子 称iPad让大批用户沮丧
  2. 409 Longest Palindrome
  3. 通用权限管理系统组件 (GPM - General Permissions Manager) 中后一个登录的把前一个登录的踢掉功能的实现...
  4. EntityFramework之原始查询及性能优化(六)
  5. 【Flutter】shared_preferences 本地存储 ( 简介 | 安装 shared_preferences 插件 | 使用 shared_preferences 流程 )
  6. 原生Java代码拷贝目录
  7. Ajax — 第二天
  8. (原創) 如何在Ubuntu設定P7010的1280 x 768解析度? (OS) (Linux) (Ubuntu) (NB) (P7010)
  9. MRoot 2.2 发布,全新 UI 界面,更好的集群
  10. centos6.5 conky安装配置
  11. 关于mysql的wait_timeout参数 设置不生效的问题【转】
  12. 软件架构发展的几个阶段
  13. Pr 入门教程,如何进行创意调整?
  14. 从零基础入门Tensorflow2.0 ----一、3.4 实战深度神经网络(dropout)
  15. m2增长率曲线_中国通胀率(中国m2历年数据曲线图)
  16. 物联网现状及未来发展趋势
  17. win10快捷键大全 win10常用快捷键
  18. bitbucket搭建
  19. scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下
  20. C#窗体Click事件没反应

热门文章

  1. 【CCF-CSP】201512-4 送货
  2. mysql distinct 去掉查询结果重复记录 可用于多张表连接查询
  3. 全程模拟新浪微博登录(2015)
  4. 【OS笔记 14】进程同步篇——基本概念
  5. Python学习入门基础 -- 第四章 列表、元组、字典、字符串变量使用、变量进阶
  6. 5G学习:协议规范与命名规则
  7. 首届数据安全大赛初赛web
  8. 利用ffmpeg实现rtmp推流直播
  9. SQL 查询并不是从 SELECT 开始的
  10. HERP和单臂路由结合配置时,提示 %IP-4-DUPADDR: Duplicate address错误