张老师每天都能给工程师们解答新问题,这是今天的,也是一个老生常谈的 fft问题:

如图所示

信号处理的基础不扎实,可以看一些本科的教材再回顾一下相关知识,看我之前的文章也行。

问题回顾

600 kHz 时“波形不像正弦”的主要原因不是信号坏了,而是采样与处理方式造成的观感与频谱现象。6 MHz 采样完全能覆盖 600 kHz(Nyquist=3 MHz)

非相干采样(Coherent Sampling 不满足)

100 kHz 情况:Fs=6 MHz、采样点 N=300 → 记录时长 。 周期数 整数)→ 相干采样,时域看起来整齐,FFT 单一尖峰。

600 kHz 情况:Fs=6 MHz、N=256 → 非整数)。 结果:记录首/尾处相位不连续,时域曲线连线看起来像振幅在“起伏/拍频”,好像不是正弦;频域产生谱泄漏(一个主峰散到多个邻近频点),你图里的底部多峰就是这个。

解决:让  为整数;对 600 kHz,因 让  选 10 的整数倍:N=300、310、500、1000…或者在 FFT 前加窗函数(Hann/Blackman),能显著抑制泄漏(代价是幅值要做窗增益校正)。(因为看上面的截图,应该就是直接用了 FFT 的函数,什么也没有处理过)

采样点太少/相位错觉

600 kHz 每周期 10 个采样点(6 MHz/600 kHz=10)。点数虽然足够,但当记录长度不是整周期时,样点相位逐渐滑移,把点用折线连接就像“波峰忽高忽低”,这是离散点可视化的假象,并非失真。可以在时域图只画散点或增加过采样/插值;已保证相干采样(见上)。

FFT 频轴与镜像

实序列 FFT 只需展示 0…Fs/2。若把 0…Fs 都画上,会看到Nyquist 对称镜像(靠近 3 MHz 的峰)。

你第二张图在 ~2.9 MHz 的峰,很可能是把镜像也画出来或频轴标定方式不当。使用 rfft/np.fft.rfftfreq 或手动只取前半谱;频率坐标用 k * Fs/N,k 只取 [0, N/2]

其它次要因素(排查项)

先看信号源/前端带宽,确保激励与测量链路的–3 dB 带宽 ≫ 600 kHz;研究一下0.6 V 是否接近 ADC 满量程或前端放大器线性边界;以及要去 DC、正确幅值标定。

建议

保持 Fs=6 MHz、f=600 kHz时:

选 N=300(30 个周期)、或 N=1000(100 个周期)做 FFT(相干采样);如果 N 受限(比如只能 256):加 Hann 窗并做窗增益校正;FFT 只显示 0…3 MHz;标注主峰应在 600 kHz 附近。

解读读者问题:FFT 分析问题(正弦波失真)

若需要固定 N=256,又要相干:把频率改成

例如

或 

600 kHz 看起来“不像正弦”,本质是非相干采样 + 连接离散点的视觉假象 +(可能)FFT 频轴处理不当。把  选成 10 的倍数或加窗,就会立刻“变回正弦 + 单峰 FFT”。

Case A 相干采样(100 kHz, N=300)

周期数  为整数,时域规整;FFT 只有一个窄主峰(几乎无泄漏)。

Case B 非相干采样(600 kHz, N=256, 矩形窗)

 不是整数,记录首尾相位不连续 →时域看起来像“振幅起伏”(其实是相位滚动的视觉假象);FFT 出现明显谱泄漏,能量在主峰两侧扩散。

Case C 非相干 + Hann 窗(600 kHz, N=256)

时域像被“包络”住(窗函数形状);泄漏大幅减弱,但主峰幅值需做窗增益校正(图里已做相对增益归一)。

Case D 相干修正(600 kHz, N=300)

因 ,选择 N=10 的整数倍(如 300)→ ;时域恢复“标准正弦”,FFT 单一尖峰,不再“像失真”