【数字信号处理】一文讲清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进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

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

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

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

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

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作