【数字信号处理】一文讲清FFT(快速傅里叶变换)

2024-09-06 20:20

本文主要是介绍【数字信号处理】一文讲清FFT(快速傅里叶变换),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 快速傅里叶变换(Fast Fourier Transform,FFT)
      • FFT的背景
      • 快速傅里叶变换(Fast Fourier Transform,FFT)
      • DFT的数学表达
      • 实际计算
      • 重要性和应用
      • 频谱泄露、频谱混叠
      • 奈奎斯特采样定理
      • 参考链接

快速傅里叶变换(Fast Fourier Transform,FFT)

FFT的背景

  • 1、为什么要时域→频域频率?50Hz+频率120Hz正弦波信号叠加,再叠加一些随时间变换的干扰信号(噪声),信号时域上的波形如图2- 1(左)所示。
    显然,从图中很难看出真正的有效信息,更无法直接过滤干扰信号。若对叠加信号进行离散傅里叶变换处理,将时域波形→频域图,如图2- 1(右)为变换后的频谱图。此时便很容易分辨出真正有效的频率段是在50Hz和120Hz,而其它频率都是干扰信息。
    在这里插入图片描述
  • 2、那么问题来了,怎样将时域→频域呢
    于是出现了大神傅里叶。他提出了——离散傅里叶变换(Discrete Fourier Transform,DFT)是一种基础的数字信号处理算法,它将一个离散的信号从时域转换到频域,使得我们可以分析复杂信号中的频率成分。
    在这里插入图片描述
  • ???傅里叶变换是啥玩意?用人话来说,“把信号比喻成一件衣服,任何一块布都可以由不同颜色的线织成,远看这张比布我们不知道是由哪些颜色的线织成的,但如果把布料拆散成一条条线,是不是就可以清晰地分析出所用线的颜色”
  • 同理,傅里叶认为任何一个信号都可以用很多个不同幅度、频率的正弦波/余弦波叠加而成,如果把这些“正弦波/余弦波”分离出来,就可以分析这些波的频率。如果再把这些频率画在如图2- 1(右)的频谱分布图上,就直观地实现了时域→频域

傅里叶变换(法语:Transformation de Fourier,英语:Fourier transform,缩写:FT)是一种线性变换,通常定义为一种积分变换。
其基本思想是一个函数可以用(可数或不可数,可数的情况对应于傅里叶级数)无穷多个周期函数的线性组合来逼近,从而这些组合系数在保有原函数的几乎全部信息的同时,还直接地反映了该函数的“频域特征”。——维基百科

在这里插入图片描述

  • 3、说的简单,那我算起来该怎么算呢
    在现实世界中,一条连续的信号需要经过采样,变成一个个离散的信号后,才能用计算机计算。
    用到的算法就是“离散傅里叶变换(Discrete Fourier Transform,DFT)”。
    但是离散傅里叶变换的计算量极为庞大,能算,但是太慢!记住就行,因为会用到很多的乘法、加法运算,计算机实现乘法很麻烦!

(有兴趣可以看看为什么计算量大)一个N点复数序列x[n]的离散傅里叶变换定义为公式(3-1)所示,在计算N点序列x[n]的DFT时,每计算一次频率分量应进行N次复数乘法运算以及N-1次复数加法运算,故需要N2次复数乘法运算和(N-1)N次复数加法运算才能获取N个频率分量X[k][28]。由此看来,随着N值增加,信号处理中离散傅里叶变换的运算量会变得极为庞大,从而难以满足实时性的需求。
在这里插入图片描述

快速傅里叶变换(Fast Fourier Transform,FFT)

于是便出现了快速傅里叶变换(Fast Fourier Transform,FFT),说白了就是一类快速的计算离散傅里叶变换的方法。代表者是1965年Cooley(库利)和Tukey(图基)提出的FFT,可以将计算N点序列DFT的复乘次数降低到(N/2)log2N。

  • FFT假设输入信号是周期性的,即它会将一个有限长度的序列视为一个无限长的周期信号。当我们对一个有限长度的信号进行FFT时,实际上是在假设这个信号会无限重复。这个过程称为周期延拓。对于一个正弦波信号,如果你截取了一个完整的周期并进行FFT,得到的频谱将是该正弦波的特征频率。
  • 傅立叶变换(FFT)是一种算法,用于计算离散傅立叶变换(DFT)和其逆变换。
  • DFT的核心思想是任何时域信号都可以表示为一系列不同频率的正弦波和余弦波的加权和

DFT的数学表达

DFT将一个长度为 (N) 的时域序列 (x(n)) 转换为一个等长的频域序列 (X(k))。每个频域样本 (X(k)) 是通过以下公式计算得到的:

X ( k ) = ∑ n = 0 N − 1 x ( n ) e − i 2 π k n / N X(k) = \sum_{n=0}^{N-1} x(n) e^{-i 2 \pi k n / N} X(k)=n=0N1x(n)ei2πkn/N

  • 其中:

    • (x(n)) 是时域信号的第 (n) 个样本。
    • (X(k)) 是频域信号的第 (k) 个样本。
    • (N) 是总样本数。
    • (k) 是频率索引,从 0 到 (N-1)。
    • (e^{-i 2 \pi k n / N}) 是一个复数,表示在 (n) 时刻,频率为 (k) 的复指数函数的值。
  • 频域解释

在频域中,(X(k)) 的每个元素代表了信号在对应频率 (k) 处的复数幅度和相位。复数的模(绝对值)给出了该频率成分的强度,而其角度(相位)则表示该频率成分相对于时间原点的相位偏移。

实际计算

  • FFT算法执行

FFT算法的核心思想是通过分治法将信号分解为更小的部分,以下是具体步骤:

  • 分解信号

分成偶数和奇数部分:将输入信号分为偶数和奇数索引的部分。例如,对于信号 (x[n]),可以分解为:

  • 偶数部分
    x [ 0 ] , x [ 2 ] , x [ 4 ] , … x[0], x[2], x[4], \ldots x[0],x[2],x[4],

  • 奇数部分
    x [ 1 ] , x [ 3 ] , x [ 5 ] , … x[1], x[3], x[5], \ldots x[1],x[3],x[5],

  • 递归计算

递归调用FFT:对偶数和奇数部分分别递归调用FFT,直到信号长度为1(基准情况)。

  • 合并结果

  • 合并频谱:使用“蝴蝶运算”将偶数和奇数部分的FFT结果合并。对于每个频率成分 (k),合并公式为:

X [ k ] = E [ k ] + W N k O [ k ] X[k] = E[k] + W_N^k O[k] X[k]=E[k]+WNkO[k]

X [ k + N / 2 ] = E [ k ] − W N k O [ k ] X[k + N/2] = E[k] - W_N^k O[k] X[k+N/2]=E[k]WNkO[k]

其中,

  • (E[k]) 是偶数部分的FFT结果,

  • (O[k]) 是奇数部分的FFT结果,

  • (W_N^k = e^{-2\pi ik/N}) 是旋转因子。

  • 频谱分析

计算幅度和相位:从FFT的输出中提取频率成分,计算幅度和相位。幅度通常为复数结果的模:

∣ X [ k ] ∣ = ( R e ( X [ k ] ) ) 2 + ( I m ( X [ k ] ) ) 2 |X[k]| = \sqrt{(Re(X[k]))^2 + (Im(X[k]))^2} X[k]=(Re(X[k]))2+(Im(X[k]))2

  • 结果后处理

  • 频率分辨率:根据采样频率和信号长度计算频率分辨率。频率分辨率为

Δ f = f s N \Delta f = \frac{f_s}{N} Δf=Nfs

其中 (f_s) 是采样频率,(N) 是信号长度。

  • 绘制频谱:可以绘制频谱图,展示信号的频率成分。

重要性和应用

  • 例如,在音频处理中,DFT可以帮助识别音乐或语音信号中的不同音调和谐波;
  • 在通信系统中,它用于分析传输信号的频谱,以优化频道使用和减少干扰。

频谱泄露、频谱混叠

特征频谱泄露频谱混叠
定义信号频谱成分扩展到其他频率高频成分被误认为低频成分
原因窗口效应或信号截断采样频率不足
影响降低频率分辨率和准确性导致信号失真
解决方法使用更好的窗函数或增加信号长度提高采样频率
  • 频谱混叠就是采样频率不足,导致实现的频谱图“混叠”在一起,解决方法就是遵循奈奎斯特采样定理,即
    在这里插入图片描述
    在这里插入图片描述

  • 频谱泄露原因之一是窗函数(截取方法)不合适、信号长度不够,

因为FFT处理的是有限长的信号→
但是他会将有限的信号进行有限的周期延拓→
如果信号在延拓后不连续,就会在截断点引入高频成分
FFT处理高频成分时就会导致“泄露”到低频区域

在这里插入图片描述

奈奎斯特采样定理

  • 定义:奈奎斯特采样定理指出,为了准确重建一个带限信号,采样频率必须至少是信号最高频率的两倍。换句话说,如果一个信号的最高频率为 (f_{max}),则其采样频率 (f_s) 应满足:

f s ≥ 2 f m a x f_s \geq 2f_{max} fs2fmax

  • 关键点

    • 带限信号:信号的频谱在某一频率 (f_{max}) 之后为零。只有在这个频率范围内的信号可以被奈奎斯特采样定理所处理。

    • 重建:如果采样频率低于奈奎斯特频率(即 (2f_{max})),将会发生频谱混叠(aliasing),导致无法准确重建原始信号。

参考链接

  1. 傅里叶变换

这篇关于【数字信号处理】一文讲清FFT(快速傅里叶变换)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143023

相关文章

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注