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

快速傅里叶变换(Fast Fourier Transform,FFT)是一种算法,用于快速计算离散傅里叶变换(DFT)及其逆变换。傅里叶变换将时间或空间域的信号转换为频率域的信号,便于分析信号的频率特性。FFT显著提高了计算效率,将计算复杂度从 O ( n 2 ) O(n^2) O(n2)降低到 O ( n log ⁡ n ) O(n \log n) O(nlogn)

FFT的基本原理

傅里叶变换的基本公式为:
X ( k ) = ∑ n = 0 N − 1 x ( n ) ⋅ e − j 2 π N k n X(k) = \sum_{n=0}^{N-1} x(n) \cdot e^{-j \frac{2\pi}{N}kn} X(k)=n=0N1x(n)ejN2πkn
其中, x ( n ) x(n) x(n)是时间域信号, X ( k ) X(k) X(k)是频率域信号, N N N是信号的长度, j j j是虚数单位。

FFT利用分治法,将DFT分解成若干个更小的DFT计算。常用的算法包括Cooley-Tukey算法、分裂基算法等。

Cooley-Tukey算法

Cooley-Tukey算法是最常用的FFT算法,它将DFT分解成两个长度为 N / 2 N/2 N/2的DFT,递归计算,直到达到最小子问题。

  1. 将原始序列分为奇数和偶数两部分:
    X ( k ) = ∑ n = 0 N / 2 − 1 x ( 2 n ) ⋅ e − j 2 π N 2 n k + ∑ n = 0 N / 2 − 1 x ( 2 n + 1 ) ⋅ e − j 2 π N ( 2 n + 1 ) k X(k) = \sum_{n=0}^{N/2-1} x(2n) \cdot e^{-j \frac{2\pi}{N} 2nk} + \sum_{n=0}^{N/2-1} x(2n+1) \cdot e^{-j \frac{2\pi}{N} (2n+1)k} X(k)=n=0N/21x(2n)ejN2π2nk+n=0N/21x(2n+1)ejN2π(2n+1)k

  2. 通过变换得到:
    X ( k ) = ∑ n = 0 N / 2 − 1 x ( 2 n ) ⋅ e − j 2 π N / 2 n k + e − j 2 π N k ∑ n = 0 N / 2 − 1 x ( 2 n + 1 ) ⋅ e − j 2 π N / 2 n k X(k) = \sum_{n=0}^{N/2-1} x(2n) \cdot e^{-j \frac{2\pi}{N/2} nk} + e^{-j \frac{2\pi}{N} k} \sum_{n=0}^{N/2-1} x(2n+1) \cdot e^{-j \frac{2\pi}{N/2} nk} X(k)=n=0N/21x(2n)ejN/22πnk+ejN2πkn=0N/21x(2n+1)ejN/22πnk

  3. 递归计算两个 N / 2 N/2 N/2长度的DFT,最终合并结果。

FFT的应用

FFT广泛应用于信号处理、图像处理、音频处理、谱分析等领域。例如:

  • 音频处理:FFT用于分析音频信号的频谱成分,以进行音频压缩、噪声消除等操作。
  • 图像处理:通过FFT进行图像的频域处理,如滤波、边缘检测等。
  • 通信:FFT在数字信号处理(DSP)中用于调制解调、信号分析等。

代码示例

以下是一个使用Python中的numpy库计算FFT的示例:

import numpy as np
import matplotlib.pyplot as plt# 生成一个信号:包含两个不同频率的正弦波
fs = 1000  # 采样频率
t = np.arange(0, 1, 1/fs)  # 时间序列
f1, f2 = 50, 120  # 信号频率
x = 0.6 * np.sin(2 * np.pi * f1 * t) + 0.4 * np.sin(2 * np.pi * f2 * t)# 计算FFT
X = np.fft.fft(x)
freqs = np.fft.fftfreq(len(X), 1/fs)# 绘制频谱
plt.figure()
plt.plot(freqs[:len(freqs)//2], np.abs(X)[:len(X)//2])
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.title('Frequency Spectrum')
plt.show()

这个示例生成了一个包含50Hz和120Hz两个频率成分的信号,通过FFT计算频谱并绘制结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-20填充与步幅

20填充与步幅 import torch from torch import nn# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数 def comp_conv2d(conv2d, X):# 这里的(1,1)表示批量大小和通道数都是1#将输入张量 X 的形状调整为 (1, 1, height,…

Grafana-11.0.0 在线部署教程

Grafana-11.0.0 在线部署教程 环境: 操作系统: ubuntugrafana版本: 11.0.0 (建议不要按照最新版)grafana要求的系统配置不高,建议直接部署在监控服务器上,比如zabbix服务器、prometheus服务器…

从菌群代谢到健康影响——认识肠道丙酸和丁酸

谷禾健康 短链脂肪酸这一词经常出现在谷禾的文章和报告中,那你真的了解短链脂肪酸吗?短链脂肪酸(SCFA)主要是肠道微生物群在结肠内通过发酵碳水化合物(包括膳食和内源性碳水化合物,主要是抗性淀粉和膳食纤维)和一些微生物可利用的蛋白质而产生…

光线追踪:原理与实现

版权声明 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本:见文末 各位同学大家好,今天我要给大家分享的是光线追踪的原理和实现大家知道在过往很多年里面&#x…

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…

如何从0构建一款类似pytest的工具

Pytest主要模块 Pytest 是一个强大且灵活的测试框架,它通过一系列步骤来发现和运行测试。其核心工作原理包括以下几个方面:测试发现:Pytest 会遍历指定目录下的所有文件,找到以 test_ 开头或 _test.py 结尾的文件,并且…

python 实例002 - 数据转换

题目: 有一组用例数据如下: cases [[case_id, case_title, url, data, excepted],[1, 用例1, www.baudi.com, 001, ok],[4, 用例4, www.baudi.com, 002, ok],[2, 用例2, www.baudi.com, 002, ok],[3, 用例3, www.baudi.com, 002, ok],[5, 用例5, www.ba…

MS-Net: A Multi-Path Sparse Model for Motion Prediction in Multi-Scenes

MS-Net: A Multi-Path Sparse Model for Motion Prediction in Multi-Scenes 基本信息 期刊:IEEE ROBOTICS AND AUTOMATION LETTERS (IF 4.6 SCI3区)单位:同济大学,上海人工智能实验室时间:2023年12月数据…

架构师必知的绝活-JVM调优

前言 为什么要学JVM? 首先:面试需要 了解JVM能帮助回答面试中的复杂问题。面试中涉及到的JVM相关问题层出不穷,难道每次面试都靠背几百上千条面试八股? 其次:基础知识决定上层建筑 自己写的代码都不知道是怎么回事&a…

精准图像识别:算法与应用的双重突破

精准图像识别在近年来取得了算法与应用的双重突破,这些突破不仅推动了技术的发展,也极大地拓宽了图像识别的应用领域。以下是对这些突破的详细概述: 算法突破 深度学习技术的崛起:深度学习,特别是卷积神经网络&#…

C++中的虚函数表结构框架

一.虚函数表介绍 Virtual Table虚函数表是实现多态的 每个有虚函数的类的实现,都有个指向虚函数的指针表(不管是父类还是子类) 指向虚表的指针是作为数据成员存在实例对象中 当调用虚函数时,就去查找对象的虚表中指向整顿派生类函…

golang template HTML动态模板解析实现

使用场景: 我们希望在模板里面动态解析指定的模板文件。 这个似乎使用go语言的模板嵌套 template 可以实现,不过模板嵌套声明里面是不支持使用变量的, 如:{{template "模板文件名" .}} 这里的"模板文件名"不…

LeetCode 2710.移除字符串中的尾随零:模拟

【LetMeFly】2710.移除字符串中的尾随零:模拟 力扣题目链接:https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/ 给你一个用字符串表示的正整数 num ,请你以字符串形式返回不含尾随零的整数 num 。 示例 1: 输…

Apache Kylin资源管理全指南:优化你的大数据架构

标题:Apache Kylin资源管理全指南:优化你的大数据架构 摘要 Apache Kylin是一个开源的分布式分析引擎,旨在为大规模数据集提供高性能的SQL查询能力。在Kylin中进行有效的资源管理对于确保查询性能和系统稳定性至关重要。本文将详细介绍如何…

leetcode 133双周赛 统计逆序对的数目「dp」「前缀和优化」

3193. 统计逆序对的数目 题目描述: 给定一个长度为n的二维数组 r e re re,其中 r e [ i ] [ i d i , c n t i ] re[i] [id_i, cnt_i] re[i][idi​,cnti​],求存在多少个全排列perm满足对所有的 r e [ i ] re[i] re[i]都有 p e r m [ 0.. …

Bayes分类器设计

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记&#…

东方博宜 OJ 1201-1300

目录 1268:【基础】高精度加法 1269:【基础】高精度减法 1280:【基础】求 2 的 n 次方 1281:【基础】求 222222⋯222⋯2 1285:【基础】计算 N 的阶乘 1286:【基础】高精度乘单精度 1287:【基础】高精…

第一百三十三节 Java数据类型教程 - Java基本数据类型

Java数据类型教程 - Java基本数据类型 Java定义了八种基本类型的数据:byte,short,int,long,char,float,double和boolean。 基本类型通常被称为简单类型。 这些可以分为四组: Integers - 包括byte&#x…

求推荐几款http可视化调试工具?

Postman 非常流行的API调试工具,适用于构建、测试和文档化APIs。它支持各种HTTP方法,有强大的集合和环境管理功能,以及代码生成能力。 BB-API 是一款旨在提升开发效率的工具,它专注于提供简约、完全免费且功能强大的HTTP模拟请…

目标检测算法

一、绪论 1.1 目标检测算法的定义和背景 1.2 目标检测算法在计算机视觉领域的重要性 二、目标检测算法的发展历程 2.1 传统目标检测算法 2.2 基于深度学习的目标检测算法 2.3 目标检测算法的评价指标 三、目标检测算法的关键技术 3.1 区域建议网络(RPN) 3.2 卷积神经…