离散傅里叶变换中期望频率随采样时长增加偏移的问题
DFT频谱峰值偏移的原因分析
核心问题:频率索引与实际频率的映射错误
你遇到的“峰值偏移”其实是把DFT的索引k直接当成了实际频率导致的误解,并非DFT计算错误。
原理说明
离散傅里叶变换(DFT)中,第k个索引对应的实际频率计算公式为:
f = k / sample_duration
或者等价于:
f = k * (sample_rate / sample_size_N)
其中:
sample_duration是采样时长sample_size_N = sample_rate * sample_duration是总采样点数
对应你的测试场景
- 测试1(采样时长1秒):
f = k / 1 = k,k=3对应实际频率3Hz,和原信号频率一致,所以你看到的峰值位置正确。 - 测试2(采样时长2秒):
f = k / 2,峰值出现在k=6时,实际频率是6/2=3Hz,就是原信号的频率,并非不存在的6Hz。 - 测试3(采样时长3秒):
f = k /3,k=9对应的实际频率是9/3=3Hz,同样是原信号频率。
代码中的问题
你的代码里直接将循环变量l(即DFT的k值)作为频率存入freq_arr,没有转换成实际频率,导致频率轴的刻度完全错误。修正方法很简单,把频率数组的生成代码改成:
freq_arr.append(l / sample_duration)
这样绘制频谱图时,频率轴就会显示正确的实际频率,峰值都会落在3Hz的位置。
关于采样时长的作用
增加采样时长确实能提升DFT的频率分辨率(分辨率=1/采样时长),让频谱峰值更尖锐、更精确,你的计算结果其实是正确的,只是频率轴的解读错误导致了误解。
内容的提问来源于stack exchange,提问作者AL-zami
相关产品推荐
相关产品推荐

