数字信号处理基础:采样定理、时域与频域、离散傅里叶变换(DFT)与快速傅里叶变换(FFT)的关系
在嵌入式数字信号处理(DSP)领域,尤其是使用CMSIS-DSP库进行特征提取时,理解信号从模拟世界进入数字处理器的底层逻辑至关重要。本章将聚焦于三个核心支柱:采样定理决定了我们能否无失真地捕获信号;时域与频域的视角转换让我们能够洞察信号的本质构成;而DFT与FFT的关系则决定了我们在资源受限的MCU上如何高效地完成频谱分析。这三者构成了所有后续窗口函数配置与特征提取算法的理论基础。
核心原理:从连续世界到离散世界的桥梁
任何物理信号,如电机振动、音频电流或心电信号,在自然界中都是连续变化的。微控制器(MCU)内部的CMSIS-DSP库只能处理离散的数字序列。这一转变的第一步由模数转换器(ADC)完成,其采样率的选择直接决定了信息的保真度。奈奎斯特采样定理指出:为了能从采样后的离散信号中无失真地重建原始连续信号,采样频率 fs 必须大于信号最高频率分量 fmax 的两倍(fs > 2×fmax)。在实际工程中,通常取 fs 为 fmax 的 5~10 倍,以留出抗混叠滤波器的过渡带余量。
采样后的信号在时间轴上离散化,但在幅度上仍保持连续。经过ADC量化后,信号变为时间和幅度均离散的数字序列 x[n]。此时,我们面对的是一个长度为 N 的有限序列。这个序列承载了原始信号的全部信息,但仅从时域波形上,我们很难直观地判断出信号包含哪些频率成分、各成分的能量占比如何。这正是需要引入频域分析的根本原因。
时域与频域:观察同一信号的两个维度
时域描述信号幅度随时间变化的规律,直观但信息冗余度高。频域则通过傅里叶变换,将信号分解为一系列不同频率、幅度和相位的正弦波之和。对于嵌入式开发者而言,频域分析具有无可替代的优势:它能够将复杂的时域波形(如叠加了噪声的振动信号)转化为清晰的频谱峰值,从而便于提取特征频率。
以一段包含50Hz工频干扰和200Hz有效振动分量的信号为例,在时域中两者叠加后波形杂乱无章;而在频域中,我们可以在50Hz和200Hz处看到两个明显的尖峰。这种“稀疏性”使得特征提取变得简单可靠。CMSIS-DSP库中的 arm_rfft_fast_f32() 函数正是实现这一转换的高效工具。
| 维度 | 横轴 | 纵轴 | 信息特点 | 典型应用 |
|---|---|---|---|---|
| 时域 | 时间 t (s) | 幅度 | 直观、包含相位信息、数据量大 | 阈值检测、波形触发 |
| 频域 | 频率 f (Hz) | 幅度/功率 | 稀疏、特征明显、便于滤波 | 频谱分析、特征提取 |
DFT与FFT:从数学定义到工程实现
离散傅里叶变换(DFT)是频域分析的数学基石。对于长度为 N 的序列 x[n],其DFT定义为:
X[k] = Σ_{n=0}^{N-1} x[n] · e^(-j·2π·k·n / N) (k = 0, 1, ..., N-1)
直接计算DFT需要 N² 次复数乘法和加法。当 N=1024 时,需要约100万次运算,这对MCU来说是不可承受的负担。快速傅里叶变换(FFT)并非一种新的变换,而是利用旋转因子 e^(-j2π/N) 的周期性和对称性,将DFT的计算复杂度从 O(N²) 降低至 O(N·log₂N)。以 N=1024 为例,FFT仅需约 1024×10 = 10240 次运算,性能提升近100倍。
在CMSIS-DSP库中,FFT的实现分为实数FFT(arm_rfft_fast_f32)和复数FFT(arm_cfft_f32)。对于大多数物理信号(实数序列),使用实数FFT可以节省一半的存储空间和计算时间。其内部通过将 N 点实数序列打包为 N/2 点复数序列,再执行复数FFT,最后拆包得到实数序列的频谱。
案例拆解:电机振动信号的频谱分析流程
假设我们需要监测一台工业电机的健康状态,通过分析其振动信号来判断是否存在轴承磨损故障。已知轴承故障特征频率约为 123Hz,电机转速为 3000 RPM(基频 50Hz)。
第一步:参数确定。根据采样定理,设置采样率 fs = 2000Hz(远大于 2×123Hz),采样点数 N = 1024,则频率分辨率 Δf = fs/N ≈ 1.95Hz。这足以区分 123Hz 与 125Hz 的相邻频率。
第二步:数据采集与预处理。通过ADC以2000Hz采样率连续采集1024个点,得到时域序列 x[n]。在调用FFT前,需将数据从时域整形为CMSIS-DSP要求的输入格式(对于实数FFT,需将数据复制到 fftInput 数组的偶数索引位置,奇数索引置0)。
第三步:执行FFT。调用 arm_rfft_fast_f32(&S, fftInput, fftOutput, 0),其中 ifftFlag=0 表示执行正向FFT。输出数组 fftOutput 中包含了 N/2 个有效的复数频谱点(直流分量和奈奎斯特频率分量特殊处理)。
第四步:幅度谱计算。使用 arm_cmplx_mag_f32() 函数计算每个频点的幅度。此时,我们会在 50Hz、100Hz、123Hz 附近观察到明显的峰值。若 123Hz 处的幅度超过预设阈值(如 0.5V),则判定轴承存在早期故障。
结果对比:若直接使用时域波形进行阈值检测,由于噪声和基频振动的叠加,很难在早期发现 123Hz 的微弱特征信号。而频域分析将信号能量集中到特定频点,信噪比显著提升,故障识别灵敏度提高了约 15dB。
常见误区与总结复盘
误区一:采样率越高越好。虽然高采样率可以放宽抗混叠滤波器要求,但会显著增加FFT的计算量和存储开销。在嵌入式系统中,应基于信号最高频率合理选择采样率,而非盲目追求高采样率。
误区二:FFT点数越多频率分辨率越高。频率分辨率 Δf = fs/N,提高 N 确实能减小 Δf,但代价是更长的采样时间和更大的内存。对于实时系统,需要在分辨率和响应速度之间权衡。另一种提高分辨率的方法是降低 fs,但需确保仍满足采样定理。
误区三:忽略FFT输出的对称性。对于实数输入信号,FFT输出关于奈奎斯特频率(fs/2)共轭对称。因此,只需分析前 N/2 个频点即可,后 N/2 个频点是冗余的。CMSIS-DSP的实数FFT已经自动处理了这一点,但开发者需理解输出数组的排列格式,避免错误读取。
总结:本章的核心链路为“模拟信号 → 抗混叠滤波 → ADC采样 → 时域序列 → FFT → 频域特征”。采样定理是前提,DFT/FFT是工具,频域特征提取是目的。在后续的窗口函数配置章节中,我们将基于本章的频谱泄漏问题,深入探讨如何通过加窗来优化频谱质量,从而进一步提升CMSIS-DSP特征提取的准确性。