快速傅里叶FFT变换

发布时间:2026/10/10 4:48:25

快速傅里叶FFT变换 目录一、概述二、FFT结果的物理意义1、FFT讲解2、实例讲解3、总结4、Matlab测试程序三、理解离散傅立叶变换参考1、DFT、DFS、FFT区别2、名词解释一、概述DFS 是周期序列的离散傅里叶级数DTFT 是非周期序列的傅里叶变换称离散时间傅里叶变换其频谱是连续的函数DFT 是有限长序列的离散傅里叶变换是对其 DTFT 的等间隔抽样是离散的频谱。DFT 是 DFS 的主值序列是非周期的。而 DFS 是 DTFT 的频域内的抽样。FFT 是 DFT 的一种高效快速算法也称作快速傅里叶变换。二、FFT结果的物理意义1、FFT讲解FFT 是离散傅立叶变换DTF的快速算法可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的但是如果变换到频域之后就很容易看出特征了。这就是很多信号分析采用 FFT 变换的原因。另外FFT 可以将一个信号的频谱提取出来这在频谱分析方面也是经常用的。虽然很多人都知道 FFT 是什么可以用来做什么怎么去做但是却不知道 FFT 之后的结果是什意思、如何决定要使用多少点来做 FFT。现在就根据实际经验来说说 FFT 结果的具体物理意义。一个模拟信号经过 ADC 采样之后就变成了数字信号。采样定理告诉我们采样频率要大于信号频率的两倍这些我就不在此罗嗦了。采样得到的数字信号就可以做 FFT 变换了。N个采样点经过 FFT 之后就可以得到 N个点的 FFT 结果。为了方便进行 FFT运算通常 N 取 2 的整数次方。假设采样频率为 Fs信号频率为 F采样点数为 N。那么FFT 之后结果就是一个为 N点的复数。每一个点就对应着一个频率点。这个点的模值就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢假设原始信号的峰值为 A那么 FFT 结果的每个点除了第一个点直流分量之外的模值就是 A 的 N/2倍。而第一个点就是直流分量它的模值就是直流分量的 N倍。而每个点的相位呢就是在该频率下的信号相位。第一个点表示直流分量即0Hz而最后一个点N的再下一个点实际上这个点是不存在的这里是假设的第N1个点也可以看做是将第一个点分做两半分另一半移到最后则表示采样频率Fs这中间被 N-1个点平均分成N等份每个点的频率依次增加。例如某点n 所表示的频率为Fn (n-1)*Fs/N。由上面的公式可以看出Fn 所能分辨到频率为 Fs/N如果采样频率Fs 为 1024Hz采样点数为 1024点则可以分辨到 1Hz。1024Hz 的采样率采样 1024点刚好是 1秒也就是说采样 1秒时间的信号并做 FFT则结果可以分析到 1Hz如果采样 2秒时间的信号并做 FFT则结果可以分析到 0.5Hz。如果要提高频率分辨力则必须增加采样点数也即采样时间。频率分辨率和采样时间呈倒数关系。假设 FFT 之后某点n 用复数abi 表示那么这个复数的模就是 An √(a*ab*b)相位就是 Pn atan2(b,a)。根据以上的结果就可以计算出 n点n ≠ 1且n ≤ N/2对应的信号的表达式为An/(N/2)*cos(2*pi*Fn*tPn)即 2*An/N*cos(2*pi*Fn*tPn)。对于 n 1点的信号是直流分量幅度即为 A1/N。由于FFT结果的对称性通常我们只使用前半部分的结果即小于采样频率一半的结果。2、实例讲解假设我们有一个信号它含有 2V 的直流分量频率为 50Hz、相位为 -30°、幅度为 3V 的交流信号以及一个频率为 75Hz、相位为 90°、幅度为 1.5V 的交流信号。数学表达式Signal 23*cos(2*pi*50*t-pi*30/180)1.5*cos(2*pi*75*tpi*90/180)。式中 cos 参数为弧度所以 -30° 和 90° 要分别换算成弧度。我们以 256Hz 的采样率对这个信号进行采样总共采样 256点。按照我们上面的分析Fn (n-1)*Fs/N我们可以知道每两个点之间的间距就是 1Hz第n个点的频率就是 n-1。我们的信号有 3个频率0Hz、50Hz、75Hz应该分别在第1个点、第51个点、第76个点上出现峰值其它各点应该接近 0。实际情况如何呢我们来看看 FFT 的结果的模值如图所示。图2.2.1 时域到频域变换图2.2.2 各个频域幅值从图中我们可以看到在第1点、第51点、和第76点附近有比较大的值。我们分别将这三个点附近的数据拿上来细看1点 5120i2点 -2.6195E-14 - 1.4162E-13i3点 -2.8586E-14 - 1.1898E-13i……50点-6.2076E-13 - 2.1713E-12i51点332.55 - 192i52点-1.6707E-12 - 1.5241E-12i……75点-2.2199E-13 -1.0076E-12i76点3.4315E-12 192i77点-3.0263E-14 7.5609E-13i很明显1点、51点、76点的值都比较大它附近的点值都很小可以认为是 0即在那些频率点上的信号幅度为 0。接着我们来计算各点的幅度值。分别计算这三个点的模值结果如下1点 51251点38476点192按照公式可以计算出直流分量为512/N 512/256 250Hz信号的幅度为384/(N/2) 384/(256/2) 375Hz信号的幅度为 192/(N/2) 192/(256/2) 1.5。可见从频谱分析出来的幅度是正确的。然后再来计算相位信息。直流信号没有相位可言不用管它。先计算 50Hz 信号的相位atan2(-192, 332.55) -0.5236结果是弧度换算为角度就是 180*(-0.5236)/pi -30.0001。再计算75Hz信号的相位atan2(192, 3.4315E-12) 1.5708弧度换算成角度就是180*1.5708/pi 90.0002。可见相位也是对的。根据 FFT 结果以及上面的分析计算我们就可以写出信号的表达式了它就是我们开始提供的信号。3、总结假设采样频率为 Fs采样点数为 N做 FFT 之后某一点nn从1开始表示的频率为Fn (n-1)*Fs/N该点的模值除以 N/2 就是对应该频率下的信号的幅度对于直流信号是除以N该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a) 计算。atan2(b,a) 是求坐标为 (a,b)点的角度值范围从 -ππ。要精确到 xHz则需要采样长度为 1/x秒的信号并做 FFT。要提高频率分辨率就需要增加采样点数这在一些实际的应用中是不现实的需要在较短的时间内完成分析。解决这个问题的方法有频率细分法比较简单的方法是采样比较短时间的信号然后在后面补充一定数量的 0使其长度达到需要的点数再做 FFT这在一定程度上能够提高频率分辨力。具体的频率细分法可参考相关文献。使用Excel进行傅里叶变换傅里叶变换FFT基于Excel。4、Matlab测试程序close all; %先关闭所有图片 Adc2; %直流分量幅度 A13; %频率F1信号的幅度 A21.5; %频率F2信号的幅度 F150; %信号1频率(Hz) F275; %信号2频率(Hz) Fs256; %采样频率(Hz) P1-30; %信号1相位(度) P290; %信号相位(度) N256; %采样点数 t[0:1/Fs:N/Fs]; %采样时刻 %信号 SAdcA1*cos(2*pi*F1*tpi*P1/180)A2*cos(2*pi*F2*tpi*P2/180); %显示原始信号 plot(S); title(原始信号); figure; Y fft(S,N); %做FFT变换 Ayy (abs(Y)); %取模 plot(Ayy(1:N)); %显示原始的FFT模值结果 title(FFT 模值); figure; AyyAyy/(N/2); %换算成实际的幅度 Ayy(1)Ayy(1)/2; F([1:N]-1)*Fs/N; %换算成实际的频率值 plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果 title(幅度-频率曲线图); figure; Pyy[1:N/2]; for i1:N/2 Pyy(i)phase(Y(i)); %计算相位 Pyy(i)Pyy(i)*180/pi; %换算为角度 end; plot(F(1:N/2),Pyy(1:N/2)); %显示相位图 title(相位-频率曲线图);三、理解离散傅立叶变换理解离散傅立叶变换一. 傅立叶变换的由来理解离散傅立叶变换二. 实数形式离散傅立叶变换理解离散傅立叶变换三.复数理解离散傅立叶变换四. 复数形式离散傅立叶变换参考1、DFT、DFS、FFT区别2、名词解释1采样频率单位时间一般1秒内采样点数2带宽指的是信号的主体占据的频率范围3频率分辨率分辨两个不同频率信号的最小间隔所以信号越长分辨率越好T就是采样前模拟信号的时间长度。我与春风皆过客你携秋水揽星河。觉得不错动动发财的小手点个赞哦
延伸阅读

更多相关文章

2026/10/5 16:20:46

人车分流出入口管理系统整体解决方案

一、系统概述本方案以 智能一卡通平台(DAIC-YKT-SF)​ 为核心,将汽车、电动两轮车、行人三种通行主体分别纳入独立但统一的管控体系,实现:人车分流:汽车走车牌识别道闸,电动两轮车走RFID识别闸机…

2026/10/10 4:45:13

Go学长带新人前十天:从自己会到让别人也会的实战复盘

初当Go学长第十天,我是真的体会到了“带人比自己写代码累十倍”这句话的分量。十天前我被安排带一个刚接触Go的新人同学,当时想着不就是答疑嘛,结果真正上手才明白,从“自己会”到“让别人也会”,中间隔着的不是知识的…

2026/10/10 4:45:13

triton._C.libtriton找不到?PyTorch C扩展加载报错排查指南

这个报错我前后至少见了二十多次,每次都是不同的人在不同的环境里踩中。有手滑升级了一波依赖就挂的,有刚从别人那里拷来项目一跑就炸的,还有以为自己装了CUDA结果压根没装对版本的。血泪经验攒了不少,这篇就专门把这个错误连根刨…

2026/10/10 4:45:13

Triton导入报错:二进制扩展与版本冲突排查修复

跑大模型和自定义算子的人,对 triton 应该都不陌生。这是一个用 Python 编写 GPU 内核的编译器,torch.compile在不少路径下也会把它拉进来。但就在前几天,我在一台机器上准备跑一个图像处理的模拟项目,脚本刚执行到 import 阶段&a…

2026/10/10 4:45:13

调用栈分析实战:从崩溃排查到死锁定位与性能优化

前阵子凌晨两点多,某服务的告警群突然炸了。日志里只有一条孤零零的崩溃栈,指向一个我再熟悉不过的函数,却完全看不出哪里错了。重启恢复,第二天同一时间又崩一次。这种“日志告诉我它死在哪,却没告诉我它为什么死”的…

2026/10/10 4:45:13

金融客户分群实战:DeepSeek大模型在特征工程与动态聚类的应用

简介:《DeepSeek金融客户分群与画像方案》是一份488页的深度技术文档,面向金融行业数据分析师、算法工程师及AI落地团队,系统讲解如何借助DeepSeek大模型实现客户特征自动提取、动态分群与画像建模,解决传统分群方法在时效性、精准…

2026/10/10 4:40:13

Spring Boot校园智能停车系统:从需求建模到核心代码实战

每年到毕业设计选题季,总有同学在各种系统里纠结犹豫。校园智能停车系统是我见过最能打的一组选题:业务场景真实、用户角色清晰、技术栈覆盖全面,而且停车这个事儿人人都能共情,答辩时业务说得清楚,代码也有得聊。这套…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑