【数字信号处理】一文讲清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

相关文章

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

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

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

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

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程