当前位置: 首页 > news >正文

快速傅里叶变换(FFT)基础(附python实现)

对于非专业人士,傅里叶变换一直是一个神秘的武器,它可以分析出不同频域的信息,从时域转换到频域,揭示了信号的频率成分,对于数字信号处理(DSP)、图像、语音等数据来说,傅里叶变换是最为基础,同时非常重要的分析工具。在处理真实世界的问题中,快速傅里叶变换(Fast Fourier Transform,FFT)是一种高效的算法,用于计算离散傅里叶变换(Discrete Fourier Transform,DFT)及其逆变换。DFT是傅里叶变换在离散数据上的版本,FFT算法的出现极大地减少了DFT的计算复杂度,使得在实际应用中变得可行。本文介绍一些基础概念,最后使用一个python小例子来展示FFT的效果。

傅里叶变换的基本概念

傅里叶变换是一种数学工具,它表明任何周期函数都可以表示为正弦和余弦函数的和。在信号处理中,傅里叶变换用于分析信号的频率成分,即信号中包含的所有不同频率的正弦波。

离散傅里叶变换(DFT)

DFT是傅里叶变换的离散版本,它将有限长度的时域信号转换为有限长度的频域信号。对于一个长度为N的序列x[n],其DFT定义为:

[ 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[k]是序列x[n]的DFT,k是频率索引,j是虚数单位。

快速傅里叶变换(FFT)

FFT是DFT的一种高效算法实现,它利用了DFT的对称性和周期性等数学性质,将复杂度从 O ( N 2 ) O(N^2) O(N2)降低到 O ( N l o g N ) O(N log N) O(NlogN)。这意味着对于长度为N的序列,FFT算法可以在对数时间内完成DFT的计算。

FFT的关键性质

FFT是一种强大的工具,它使得在各种科学和工程领域中分析和处理信号成为可能。通过将信号分解为不同频率的组成部分,FFT揭示了信号的内在结构,为信号处理提供了一个强大的分析框架。所有这些,其实都利益于它具备如下的特点:

  1. 线性:FFT保持了傅里叶变换的线性性质。
  2. 时域和频域的局部性:FFT算法利用了“蝶形操作”来减少复数乘法的数量。
  3. 并行性:FFT可以并行执行,进一步提高计算效率。

因此,FFT在很有领域有广泛的应用:

  1. 信号处理:音频和图像的压缩、滤波和分析。
  2. 图像处理:边缘检测、图像增强和图像压缩。
  3. 通信系统:在无线通信中,FFT用于信道均衡和信号调制。
  4. 数据分析:频谱分析和周期性检测。
代码

下面给出一个例子,使用pytorch,分析两个不同频率合成后的信号,使用FFT识别出两个频率,最后使用matplotlib来进行可视化:

import torch
import numpy as np
import matplotlib.pyplot as plt# 设置参数
sample_rate = 1000  # 采样率 (Hz)
T = 1 / sample_rate  # 采样间隔
t = np.linspace(0, 1, sample_rate, endpoint=False)  # 时间向量# 生成信号
freq1, freq2 = 50, 120  # 两正弦波的频率
amplitude1, amplitude2 = 0.7, 0.5  # 振幅
signal = amplitude1 * np.sin(2 * np.pi * freq1 * t) + amplitude2 * np.sin(2 * np.pi * freq2 * t)# 将信号转换为 Torch 张量
signal_tensor = torch.tensor(signal, dtype=torch.float32)# 执行 RFFT
rfft_result = torch.fft.rfft(signal_tensor)# 获取幅度谱
magnitude = torch.abs(rfft_result)# 频率轴
frequencies = torch.fft.rfftfreq(signal.size, d=T)plt.figure(figsize=(12, 6))# 原始信号
plt.subplot(2, 1, 1)
plt.plot(t, signal)
plt.title('Original Signal')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')# 频谱
plt.subplot(2, 1, 2)
plt.plot(frequencies.numpy(), magnitude.numpy())
plt.title('Magnitude Spectrum')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Magnitude')plt.tight_layout()
plt.show()
效果

上图为原始信息,由两个信息合成;下图为解析出来的光谱图,可以看到,分析得到两个脉冲,分别对应两个正弦波的频率:50与120,可以看到FFT的神奇之处了吧:)

在这里插入图片描述

相关文章:

快速傅里叶变换(FFT)基础(附python实现)

对于非专业人士,傅里叶变换一直是一个神秘的武器,它可以分析出不同频域的信息,从时域转换到频域,揭示了信号的频率成分,对于数字信号处理(DSP)、图像、语音等数据来说,傅里叶变换是最…...

使用Docker-compose安装mysql5.7

1.首先选择一个目录用来存放docker-compse文件以及mysql的数据(例如logs、conf) cd /home mkdir mysql vi docker-compose.yml2.填写docker-compse.yml内容 version : 3 services:mysql:# 容器名(以后的控制都通过这个)container_name: mysql# 重启策略…...

如何管理PHP的API部署环境

管理PHP的API部署环境是一个涉及多个步骤和考虑因素的过程。以下是一些关键步骤和最佳实践,用于管理PHP的API部署环境: 一、选择合适的服务器和配置环境 选择服务器:根据API的访问量和性能需求,选择合适的服务器。可以选择物理服…...

web——sqliabs靶场——第一关

今天开始搞这个靶场,从小白开始一点点学习,加油!!!! 1.搭建靶场 注意点:1.php的版本问题,要用老版本 2.小p要先改数据库的密码,否则一直显示链接不上数据库 2.第一道题&#xff0…...

tartanvo ubuntu 20.04部署

1. 所有环境安装流程参考 2. 运行python3 tartanvo_node.py出现问题: ImportError: cannot import name int from numpy版本问题,卸载当前版本并更换版本: pip uninstall numpy pip install numpy1.22.4问题解决。 3. 采用2to3脚本将其代…...

SpringBoot整合Freemarker(三)

定义循环输出的宏 <#macro list title items> ${title?cap_first}:<#list items as x>*${x?cap_first}</#list> </#macro><list items["mouse", "elephant", "python"] title"Animals"/> 输出结果…...

Android 一个APP打开另一个app的两种方式,需添加QUERY_ALL_PACKAGES权限

加&#xff1c;uses-permission android:name"android.permission.QUERY_ALL_PACKAGES"/> 方式1&#xff1a;打开外部app&#xff0c;在新窗口打开。 private void doStartAppPackageName(String packagename) { // 通过包名获取此APP详细信息&#x…...

<数据集>草莓叶片病害识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;4371张 标注数量(xml文件个数)&#xff1a;4371 标注数量(txt文件个数)&#xff1a;4371 标注类别数&#xff1a;7 标注类别名称&#xff1a;[Angular Leafspot, Anthracnose Fruit Rot, Blossom Blight, Gray Mol…...

React 中 `key` 属性的警告及其解决方案

React 中 key 属性的警告及其解决方案 文章目录 React 中 key 属性的警告及其解决方案1. 引言2. 什么是 key 属性3. key 属性的重要性4. 常见的 key 属性警告及其原因4.1 缺少 key 属性4.2 使用不稳定的 key&#xff08;如索引&#xff09;4.3 重复的 key 值 5. 如何解决 key 属…...

OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示

当打开蓝牙后没有反应时&#xff0c;需要排查蓝牙节点是否对应、固件是否加载成功&#xff0c;本文介绍开源鸿蒙OpenHarmony4.1系统下适配蓝牙的方法&#xff0c;触觉智能SBC3568主板演示 修改对应节点 开发板蓝牙硬件连接为UART1&#xff0c;修改对应的节点&#xff0c;路径为…...

濮良贵《机械设计》第十版课后习题答案全解PDF电子版

《机械设计》(第十版)是“十二五”普通高等教育本科国家级规划教材&#xff0c; 是在《机械设计》(第九版)的基础上修订而成的。本次修订主要做了以下几项工作&#xff1a; 1. 内容的适当更新——自本书第九版出版以来&#xff0c; 机械工程及相关领域的新理论、新技术和新标准…...

Python进阶语法探索:列表推导式

在Python编程中&#xff0c;列表推导式&#xff08;List Comprehensions&#xff09;是一种简洁而强大的语法结构&#xff0c;它允许你以一行代码的形式创建列表&#xff0c;同时执行循环、条件判断等操作。列表推导式不仅提高了代码的可读性&#xff0c;还显著提升了编程效率。…...

java合并图片与文字

通过java来绘制海报&#xff0c;加载外部字体并设置样式大小与加粗、设置背景图、合并图片&#xff0c;下面是示例 import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.…...

OpenCV快速入门

OpenCV&#xff08;Open Source Computer Vision Library&#xff0c;开源计算机视觉库&#xff09;是一个广泛应用于图像处理、计算机视觉、视频分析等领域的开源库。它不仅适用于研究人员和开发人员&#xff0c;还被广泛用于学术、工业和商业应用。本篇文章将帮助你快速了解 …...

ArcGIS软件之“计算面积几何”地图制作

一、消防站的泰森多边形 效果图&#xff1a; 二、人口调查的泰森多边形 确定后效果图&#xff1a; 三、人口调查的泰森多边形属性设置 确定后的效果图&#xff1a; 四、计算面积几何&#xff0c;用于求密度 先添加字段area_1&#xff0c;然后设置浮点型及字段属性 五…...

RHCE 第四次作业

一.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 1.配置环境 [rootlocalhost ~]# yum install bind [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 2.配置DNS主服务器 [rootlocalhost ~]# vim /etc/named.conf options { …...

【贪心算法】No.1---贪心算法(1)

文章目录 前言一、贪心算法&#xff1a;二、贪心算法示例&#xff1a;1.1 柠檬⽔找零1.2 将数组和减半的最少操作次数1.3 最⼤数1.4 摆动序列1.5 最⻓递增⼦序列1.6 递增的三元⼦序列 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到…...

分布式光伏管理办法

随着分布式光伏项目的不断增加&#xff0c;传统的管理方式已经难以满足高效、精准的管理需求。光伏业务管理系统作为一种集信息化、智能化于一体的管理工具&#xff0c;正在逐步成为分布式光伏项目管理的重要支撑。 光伏业务管理系统通过数字化手段实现对光伏业务全流程的精细化…...

2024最新软件测试面试热点问题

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大厂面试热点问题 1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工…...

如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选

近年来&#xff0c;随着人工智能与大数据技术的迅猛发展&#xff0c;企业的营销手段和策略发生了巨大变化。尤其是在信息爆炸的数字时代&#xff0c;如何有效利用这些技术在海量数据中精准找到潜在客户&#xff0c;已成为中小企业亟待解决的核心问题。 最近&#xff0c;全球人…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...