跳到主要内容

理论知识

概念理解

定义

DFT中的一种快速计算方法FFT,是离散傅里叶级数

如何理解DFT的本质

【基础知识】正交向量

只要知道两个向量是相乘等于1即可,后续也需要这些知识

对离散序列 点DFT:

其中:

  • 实部
  • 虚部

具体实现

首先我们定义一个信号,我选择了100Hz+250Hz的基础混合信号,其图像如下图所示

image-20251118120923354

叠加波形:黑色线条所示为双频信号

采样参数

  • 采样率 (满足奈奎斯特采样定理
  • 采样时间
  • 采样点数

图上标注:红点表示8个等间隔采样点

采样后的投影操作

现在我们已经完成了采样,采集到了一下8个点,接下来进行一个手搓计算DFT

首先我们需要理解什么是频率分辨率,这里就是我们的频率分辨率

定义与公式

对于离散傅里叶变换(DFT):

  • :采样率(Hz)
  • :采样点数
  • ​:总观测时长(秒)

频率分辨率

“采样时间多长,频谱就能‘多细’。”
Δf = 1 / T,与采样率无关,只取决于你看了信号多久

直观理解

  • 是频谱上相邻两根“钉子”之间的最小间隔。
  • 你无法区分两个频率差小于 的信号,因为它们会落在同一根钉子上。
观测时长 频率分辨率 频谱精细度
10 ms100 Hz
100 ms10 Hz
1 s1 Hz很细

image-20251118125100091

同一个信号不同的频率分辨率


几何解释(圆周等分)

DFT 把总时长 均匀切成 段,每段长度:

在频域里,频率轴也被均匀切成 段,每段长度:

时间越短,切得越粗;时间越长,切得越细——这就是时间与频率的“对偶”。

例子解释

那么我们接下来依旧回到原来的信号,此时原来的信号的频率分辨率是100Hz,因为8个点

DFT 给出 个复数 ,对应频率:

完整横坐标(共 8 点):


有效分析范围

实信号具有共轭对称性,只关注前半段

为奈奎斯特频率,镜像对称中心)

实信号频谱共轭对称,正、负频率互为镜像;
前一半(0~Nyquist)已含全部信息,后一半是冗余镜像。

数学证明:共轭对称性

对实数序列 做 DFT:

由于 ,可证:

  • 幅值相同:
  • 相位相反:

结论 的频点完全是 的镜像,不携带新信息。


直观例子(8点)

序号 频率 复数 说明
00 Hz实数直流,自身对称
1100 Hz正频率
2200 Hz正频率
3300 Hz正频率
4400 Hz实数Nyquist,自身对称
5500 Hz负频率镜像(= -300 Hz)
6600 Hz负频率镜像(= -200 Hz)
7700 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个点的值为

image-20251118123758389

然后我们就需要进行DFT,即得出实部和虚部,具体怎么得出的呐?

得出实部与虚部:原始信号的投影


正交基频向量的生

就是把N=8k带进去

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 为例):

采样点
01.71.00(n=0)+1.700.000.00
10.20.71+0.14-0.71-0.14
2-1.50.000.00-1.00+1.50
3-0.8-0.71+0.57-0.71+0.57
41.2-1.00-1.200.000.00
5-0.3-0.71+0.210.71-0.21
6-1.10.000.001.00-1.10
70.90.71+0.640.71+0.64
求和2.061.26

image-20251118125238368

image-20251118125332220

image-20251118125533289

得到模值与相位角

将实部和虚部合成复数并归一化(除以 ):

  • 模值(幅值):

  • 相位角(初相):

意义:模值代表该频率分量在原始信号中的能量占比,相位角代表相对时序偏移

image-20251118124938699


总结

  1. 基频向量由欧拉公式生成,提供正交的 cos/sin 轴
  2. 投影 = 信号向量与基频向量的点积(逐点乘 → 求和)
  3. 实部/虚部分别对应 cos/sin 分量贡献
  4. 模值 + 相位完整描述该频率在原始信号中的存在形态

最后绘制频谱图和幅度相位谱图

image-20251118125655106

相位谱就是上面夹角计算出来的

IDFT还原波形对比

image-20251118130444583

image-20251118130627415

代码知识

注意FFT和输入捕获采样不同,他是通过数学分析计算adc采样进去的值分析出来频谱和幅度谱

基础设置

在设置FFT的时候会涉及到ADC的时钟(时钟树的时候设置的),ADC转换时间(因为这个的限制导致无法像输入捕获的时候一样能更高的频率),采样分辨率的设置(采样时长,以及采样点数决定采样分辨率)


20kHz信号FFT频谱测量核心知识总结

核心结论:实现20kHz信号FFT测量,需先满足ADC采样频率的抗混叠要求(Nyquist定理),再通过采样点数/采样时长优化频率分辨率,三者存在固定数学关联,无法单独随意修改。


一、核心参数及关联逻辑

  1. ADC采样频率(Fs):FFT测量的前提,决定能否准确捕获20kHz信号,需满足Fs≥2×20kHz(Nyquist定理),工程中推荐50kHz~100kHz(留1.2~2倍余量,规避滤波器过渡带影响)。
  2. 频率分辨率(Δf):决定频谱相邻谱线间隔,影响相近频率区分能力,公式为Δf=Fs/N=1/Tacq(N为采样点数,Tacq为总采样时长)。
  3. 采样点数(N)与总采样时长(Tacq):两者与Fs锁定关联,Tacq=N/Fs,固定N和Fs则Tacq自动确定,无法单独修改;调整Tacq需通过修改N或Fs实现(优先改N)。

二、关键设置原则

  1. 采样频率底线:Fs必须≥40kHz(最低要求),低于此值会导致20kHz信号混叠,FFT结果失真。
  2. 频率分辨率选择:仅检测信号是否存在时,Δf可宽松(如1kHz);需精确测频或区分相邻频率(如19.9kHz与20.1kHz),则Δf需减小(如1Hz、10Hz)。
  3. 采样点数优化:N建议取2的整数次幂(如1024、2048、8192),提升基2FFT算法效率,降低单片机计算压力。

三、参数调整核心规则

  1. 固定N和Fs → Tacq与Δf同步固定,不可单独修改,否则破坏三者逻辑关联。
  2. 需调整Tacq(优化分辨率):优先保持Fs不变、修改N(避免Fs过低导致抗混叠不足);禁止为延长Tacq而降低Fs至40kHz以下。
  3. 权衡关系:Tacq越长(N越大),Δf越小(分辨率越高),但单片机存储压力(需缓存N个采样点)和计算时间会增加,需平衡分辨率与实时性。

四、标准设置步骤(工程常用)

  1. 定采样频率:Fs=50kHz~100kHz(满足抗混叠,预留调整空间)。
  2. 定分辨率Δf:根据需求选择(如10Hz,兼顾精度与实时性)。
  3. 算N和Tacq:N=Fs/Δf(向上取2的整数次幂),Tacq=N/Fs=1/Δf。
  4. 验证合理性:确认单片机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信号是否存在50kHz1kHz(宽松分辨率)64≈781Hz1.28ms存储:128B(64×2B)
计算:极低
实时性最优,适合快速判断信号有无;前端滤波器需截止40kHz以上信号
仅检测20kHz信号是否存在80kHz1kHz(宽松分辨率)128≈625Hz1.6ms存储:256B(128×2B)
计算:极低
抗混叠余量更足(4×20kHz),信号失真风险更低
常规精度测频/区分相邻频率(如19.9kHz~20.1kHz)50kHz10Hz(平衡精度与负载)8192≈6.1Hz163.84ms存储:16KB(8192×2B)
计算:中等
工程首选配置,既保证分辨率,又不占用过多存储/计算资源;适合多数场景的频率测量
常规精度测频/区分相邻频率(如19.9kHz~20.1kHz)80kHz10Hz(平衡精度与负载)8192≈9.77Hz102.4ms存储:16KB(8192×2B)
计算:中等
采样时长更短(实时性更好),Δf接近目标值;适合对实时性要求稍高的场景
常规精度测频/区分相邻频率(如19.9kHz~20.1kHz)100kHz10Hz(平衡精度与负载)16384≈6.1Hz163.84ms存储:32KB(16384×2B)
计算:中等
抗混叠最强(5×20kHz),分辨率更优;适合干扰较多的场景
高精度测频(误差±1Hz)/区分近频信号(如19.999kHz)50kHz1Hz(高精度)65536≈0.76Hz1.31s存储:128KB(65536×2B)
计算:较高
精度拉满,适合对频率精度要求极高的场景;需单片机有足够存储缓存,实时性较弱
高精度测频(误差±1Hz)/区分近频信号(如19.999kHz)100kHz1Hz(高精度)131072≈0.76Hz1.31s存储:256KB(131072×2B)
计算:较高
抗混叠+精度双优;适合干扰强、精度要求高的场景;需高性能单片机支持(大缓存+快运算速度)

速查表使用说明

  1. 场景匹配优先

    • 仅判断20kHz信号“有/无”→ 选“仅检测”类配置(负载最低、实时性最好);
    • 需大致测量频率或区分相近频率→ 选“常规精度”类(工程首选,兼顾各方);
    • 需精准测频(如校准场景)→ 选“高精度”类(牺牲实时性换精度)。
  2. 单片机适配注意

    • 存储需求: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。
  3. 关键补充提醒

    • 前端滤波器:无论选哪种配置,需在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效率暴跌)。

image-20251122143246677