理论知识
概念理解
定义
DFT中的一种快速计算方法FFT,是离散傅里叶级数
如何理解DFT的本质
【基础知识】正交向量和
只要知道两个向量是相乘等于1即可,后续也需要这些知识
对离散序列 做 点DFT:
其中:
- 实部
- 虚部
具体实现
首先我们定义一个信号,我选择了100Hz+250Hz的基础混合信号,其图像如下图所示

叠加波形:黑色线条所示为双频信号
采样参数:
- 采样率 (满足奈奎斯特采样定理 )
- 采样时间
- 采样点数 个
图上标注:红点表示8个等间隔采样点
采样后的投影操作
现在我们已经完成了采样,采集到了一下8个点,接下来进行一个手搓计算DFT
首先我们需要理解什么是频率分辨率,这里就是我们的频率分辨率
定义与公式
对于离散傅里叶变换(DFT):
- :采样率(Hz)
- :采样点数
- :总观测时长(秒)
频率分辨率:
“采样时间多长,频谱就能‘多细’。”
Δf = 1 / T,与采样率无关,只取决于你看了信号多久。
直观理解
- 是频谱上相邻两根“钉子”之间的最小间隔。
- 你无法区分两个频率差小于 的信号,因为它们会落在同一根钉子上。
| 观测时长 | 频率分辨率 | 频谱精细度 |
|---|---|---|
| 10 ms | 100 Hz | 粗 |
| 100 ms | 10 Hz | 细 |
| 1 s | 1 Hz | 很细 |

同一个信号不同的频率分辨率
几何解释(圆周等分)
DFT 把总时长 均匀切成 段,每段长度:
在频域里,频率轴也被均匀切成 段,每段长度:
时间越短,切得越粗;时间越长,切得越细——这就是时间与频率的“对偶”。
例子解释
那么我们接下来依旧回到原来的信号,此时原来的信号的频率分辨率是100Hz,因为8个点
DFT 给出 个复数 ,对应频率:
完整横坐标(共 8 点):
有效分析范围
实信号具有共轭对称性,只关注前半段:
( 为奈奎斯特频率,镜像对称中心)
实信号频谱共轭对称,正、负频率互为镜像;
前一半(0~Nyquist)已含全部信息,后一半是冗余镜像。数学证明:共轭对称性
对实数序列 做 DFT:
由于 ,可证:
- 幅值相同:
- 相位相反:
结论: 的频点完全是 的镜像,不携带新信息。
直观例子(8点)
| 序号 | 频率 | 复数 | 说明 |
|---|---|---|---|
| 0 | 0 Hz | 实数 | 直流,自身对称 |
| 1 | 100 Hz | 正频率 | |
| 2 | 200 Hz | 正频率 | |
| 3 | 300 Hz | 正频率 | |
| 4 | 400 Hz | 实数 | Nyquist,自身对称 |
| 5 | 500 Hz | 负频率镜像(= -300 Hz) | |
| 6 | 600 Hz | 负频率镜像(= -200 Hz) | |
| 7 | 700 Hz | 负频率镜像(= -100 Hz) |
正频率:(0~400 Hz)
负频率:(400~700 Hz,镜像)
物理意义
- 负频率是数学产物,不是真实物理频率。
- 实信号的正、负频率成对出现,能量相同,只看正半轴就够了。
在单片机上的FFT
实数FFT
- 在单片机上做 1024 点实数 FFT 时:
- 只有前 512 个点是有效的频谱信息, 后 512 个点是共轭对称的冗余镜像。
复数FFT
如果你用的是 复数 FFT 库(输入有实部 + 虚部),那就没有对称性,必须看全部 1024 个点。 但在纯实信号场景下,前一半就够用。
📌 一句话总结:
实信号 + FFT → 只看前一半,后一半是镜像。 单片机做 1024 点实 FFT,有效频谱 = 前 512 个点。
与原始信号对应
- 100 Hz → 正好落在 (100 Hz 钉子)
- 250 Hz → 位于 与 之间,最接近 300 Hz 钉子,产生频谱泄漏,但幅值/相位仍可从 读取。
信号分析
采集的8个点的值为

然后我们就需要进行DFT,即得出实部和虚部,具体怎么得出的呐?
得出实部与虚部:原始信号的投影
正交基频向量的生
就是把N=8和k带进去
DFT 的核心是为每个频率点构造一对正交基底向量,其数学来源是欧拉公式:
对于第 个频率 bin(对应频率 ),其基底向量为:
- 实部(cos 轴):
- 虚部(sin 轴):
其中 为采样点序号, 为总点数。
几何意义:在 维空间中, 与 构成一对正交的单位长度向量(归一化后),分别代表该频率的余弦分量和正弦分量。
投影计算:点乘的本质
投影的数学操作是向量点积(内积),即将原始信号向量 分别与 和 逐点相乘后求和:
实部(投影到 cos 轴):
虚部(投影到 sin 轴):
计算过程(以 即 100 Hz 为例): | 采样点 | | | | | | |------------|--------|-------------------|-----------------|-------------------|--------------------| | 0 | 1.7 | 1.00 | +1.70 | 0.00 | 0.00 | | 1 | 0.2 | 0.71 | +0.14 | -0.71 | -0.14 | | 2 | -1.5 | 0.00 | 0.00 | -1.00 | +1.50 | | 3 | -0.8 | -0.71 | +0.57 | -0.71 | +0.57 | | 4 | 1.2 | -1.00 | -1.20 | 0.00 | 0.00 | | 5 | -0.3 | -0.71 | +0.21 | 0.71 | -0.21 | | 6 | -1.1 | 0.00 | 0.00 | 1.00 | -1.10 | | 7 | 0.9 | 0.71 | +0.64 | 0.71 | +0.64 | | 求和 | — | — | 2.06 | — | 1.26 |
投影计算:点乘的本质
投影的数学操作是向量点积(内积),即将原始信号向量 分别与 和 逐点相乘后求和:
实部(投影到 cos 轴):
虚部(投影到 sin 轴):
计算过程(以 即 100 Hz 为例):
| 采样点 | |||||
|---|---|---|---|---|---|
| 0 | 1.7 | 1.00(n=0) | +1.70 | 0.00 | 0.00 |
| 1 | 0.2 | 0.71 | +0.14 | -0.71 | -0.14 |
| 2 | -1.5 | 0.00 | 0.00 | -1.00 | +1.50 |
| 3 | -0.8 | -0.71 | +0.57 | -0.71 | +0.57 |
| 4 | 1.2 | -1.00 | -1.20 | 0.00 | 0.00 |
| 5 | -0.3 | -0.71 | +0.21 | 0.71 | -0.21 |
| 6 | -1.1 | 0.00 | 0.00 | 1.00 | -1.10 |
| 7 | 0.9 | 0.71 | +0.64 | 0.71 | +0.64 |
| 求和 | — | — | 2.06 | — | 1.26 |



得到模值与相位角
将实部和虚部合成复数并归一化(除以 ):
模值(幅值):
相位角(初相):
意义:模值代表该频率分量在原始信号中的能量占比,相位角代表相对时序偏移。

总结
- 基频向量由欧拉公式生成,提供正交的 cos/sin 轴
- 投影 = 信号向量与基频向量的点积(逐点乘 → 求和)
- 实部/虚部分别对应 cos/sin 分量贡献
- 模值 + 相位完整描述该频率在原始信号中的存在形态
最后绘制频谱图和幅度相位谱图

相位谱就是上面夹角计算出来的
IDFT还原波形对比


代码知识
注意FFT和输入捕获采样不同,他是通过数学分析计算adc采样进去的值分析出来频谱和幅度谱
基础设置
在设置FFT的时候会涉及到ADC的时钟(时钟树的时候设置的),ADC转换时间(因为这个的限制导致无法像输入捕获的时候一样能更高的频率),采样分辨率的设置(采样时长,以及采样点数决定采样分辨率)
20kHz信号FFT频谱测量核心知识总结
核心结论:实现20kHz信号FFT测量,需先满足ADC采样频率的抗混叠要求(Nyquist定理),再通过采样点数/采样时长优化频率分辨率,三者存在固定数学关联,无法单独随意修改。
一、核心参数及关联逻辑
- ADC采样频率(Fs):FFT测量的前提,决定能否准确捕获20kHz信号,需满足Fs≥2×20kHz(Nyquist定理),工程中推荐50kHz~100kHz(留1.2~2倍余量,规避滤波器过渡带影响)。
- 频率分辨率(Δf):决定频谱相邻谱线间隔,影响相近频率区分能力,公式为Δf=Fs/N=1/Tacq(N为采样点数,Tacq为总采样时长)。
- 采样点数(N)与总采样时长(Tacq):两者与Fs锁定关联,Tacq=N/Fs,固定N和Fs则Tacq自动确定,无法单独修改;调整Tacq需通过修改N或Fs实现(优先改N)。
二、关键设置原则
- 采样频率底线:Fs必须≥40kHz(最低要求),低于此值会导致20kHz信号混叠,FFT结果失真。
- 频率分辨率选择:仅检测信号是否存在时,Δf可宽松(如1kHz);需精确测频或区分相邻频率(如19.9kHz与20.1kHz),则Δf需减小(如1Hz、10Hz)。
- 采样点数优化:N建议取2的整数次幂(如1024、2048、8192),提升基2FFT算法效率,降低单片机计算压力。
三、参数调整核心规则
- 固定N和Fs → Tacq与Δf同步固定,不可单独修改,否则破坏三者逻辑关联。
- 需调整Tacq(优化分辨率):优先保持Fs不变、修改N(避免Fs过低导致抗混叠不足);禁止为延长Tacq而降低Fs至40kHz以下。
- 权衡关系:Tacq越长(N越大),Δf越小(分辨率越高),但单片机存储压力(需缓存N个采样点)和计算时间会增加,需平衡分辨率与实时性。
四、标准设置步骤(工程常用)
- 定采样频率:Fs=50kHz~100kHz(满足抗混叠,预留调整空间)。
- 定分辨率Δf:根据需求选择(如10Hz,兼顾精度与实时性)。
- 算N和Tacq:N=Fs/Δf(向上取2的整数次幂),Tacq=N/Fs=1/Δf。
- 验证合理性:确认单片机ADC支持该Fs,且存储缓冲区可容纳N个采样点。
五、典型配置示例
Fs=50kHz(抗混叠充足)、Δf≈6.1Hz、N=8192(2的整数次幂)、Tacq≈164ms,可准确捕获20kHz信号,清晰区分相邻频率,且单片机负载适中。
要不要我帮你整理一份20kHz信号FFT参数配置速查表,包含不同需求下的Fs、N、Tacq对应值,方便直接调用?
20kHz信号FFT参数配置速查表
(基于工程实用场景设计,均满足 Nyquist 抗混叠要求,采样点数 N 均为 2 的整数次幂,适配基2FFT算法)
| 需求场景 | 采样频率(Fs) | 目标频率分辨率(Δf) | 采样点数(N,2^n) | 实际频率分辨率(Δf实际) | 总采样时长(Tacq) | 单片机负载(16位ADC) | 备注(适用场景+关键提示) |
|---|---|---|---|---|---|---|---|
| 仅检测20kHz信号是否存在 | 50kHz | 1kHz(宽松分辨率) | 64 | ≈781Hz | 1.28ms | 存储:128B(64×2B) 计算:极低 | 实时性最优,适合快速判断信号有无;前端滤波器需截止40kHz以上信号 |
| 仅检测20kHz信号是否存在 | 80kHz | 1kHz(宽松分辨率) | 128 | ≈625Hz | 1.6ms | 存储:256B(128×2B) 计算:极低 | 抗混叠余量更足(4×20kHz),信号失真风险更低 |
| 常规精度测频/区分相邻频率(如19.9kHz~20.1kHz) | 50kHz | 10Hz(平衡精度与负载) | 8192 | ≈6.1Hz | 163.84ms | 存储:16KB(8192×2B) 计算:中等 | 工程首选配置,既保证分辨率,又不占用过多存储/计算资源;适合多数场景的频率测量 |
| 常规精度测频/区分相邻频率(如19.9kHz~20.1kHz) | 80kHz | 10Hz(平衡精度与负载) | 8192 | ≈9.77Hz | 102.4ms | 存储:16KB(8192×2B) 计算:中等 | 采样时长更短(实时性更好),Δf接近目标值;适合对实时性要求稍高的场景 |
| 常规精度测频/区分相邻频率(如19.9kHz~20.1kHz) | 100kHz | 10Hz(平衡精度与负载) | 16384 | ≈6.1Hz | 163.84ms | 存储:32KB(16384×2B) 计算:中等 | 抗混叠最强(5×20kHz),分辨率更优;适合干扰较多的场景 |
| 高精度测频(误差±1Hz)/区分近频信号(如19.999kHz) | 50kHz | 1Hz(高精度) | 65536 | ≈0.76Hz | 1.31s | 存储:128KB(65536×2B) 计算:较高 | 精度拉满,适合对频率精度要求极高的场景;需单片机有足够存储缓存,实时性较弱 |
| 高精度测频(误差±1Hz)/区分近频信号(如19.999kHz) | 100kHz | 1Hz(高精度) | 131072 | ≈0.76Hz | 1.31s | 存储:256KB(131072×2B) 计算:较高 | 抗混叠+精度双优;适合干扰强、精度要求高的场景;需高性能单片机支持(大缓存+快运算速度) |
速查表使用说明
场景匹配优先:
- 仅判断20kHz信号“有/无”→ 选“仅检测”类配置(负载最低、实时性最好);
- 需大致测量频率或区分相近频率→ 选“常规精度”类(工程首选,兼顾各方);
- 需精准测频(如校准场景)→ 选“高精度”类(牺牲实时性换精度)。
单片机适配注意:
- 存储需求:16位ADC每个采样点占2字节,可根据表格中“存储”值判断单片机RAM是否足够(如8位单片机常见RAM为128B~4KB,优先选N≤8192的配置);
- 采样率支持:确认单片机ADC最大采样率≥表格中Fs(如STM32F1系列ADC最高采样率约1MHz,完全支持表中所有Fs);
- 计算速度:N越大,FFT计算时间越长(如N=65536的计算时间约为N=8192的8倍),8位单片机建议优先选N≤16384。
关键补充提醒:
- 前端滤波器:无论选哪种配置,需在ADC前加低通滤波器(截止频率≤Fs/2,如Fs=50kHz时截止≤25kHz),避免高频干扰混叠;
- 灵活调整:若表格中无完全匹配的配置,可按“Fs不变,调整N(2的整数次幂)”推导(如Fs=60kHz,需Δf≈8Hz,则N=8192,Δf实际=60kHz/8192≈7.3Hz);
- 避免踩坑:Fs不可低于40kHz,N不可非2的整数次幂(否则基2FFT效率暴跌)。
