从 MATLAB 中提取的频率呸呸呸_ _fft不是很准确

信息处理 matlab fft 信号分析 自由度 频率
2022-02-09 15:25:48

作为测试,我在 MATLAB 中制作了这种形式的正弦波

y = 5*sin((2 * pi * freq).*x + 1.4) - 6;

在哪里freq哪里不同10x01.5分辨率1/1000如下图

fs = 1000;
x = 0:1/fs: 1.5 - (1/fs);

所以我已经知道能够验证它的频率fft在计算幅度 FFT 后abs(fft(yy)),我发现幅度最高的频率仓是16. 既然我有1500对应于采样频率的样本1000然后是 16thbin对应

Frequency Bin×Sampling FrequencyNumber of Samples=16×10001500=10.6667 Hz

但是我知道我硬编码的频率实际上是10 Hz. 这可以用不同的值重复,并且不断发生相同的不准确结果。并且硬编码的频率越小,结果中的误差就越大。为什么会这样?

1个回答

MATLAB 使用基于 1 的索引,DFT 是基于零的,因此您必须将索引值移动 1。

bin 索引对应于以每帧周期为单位的频率。freq的单位是每秒周期数。样本计数以每帧样本为单位,采样率以每秒样本为单位。bin 索引计算应为:

bin=freqNfs15=1015001000

单位是:

cyclesframe=cyclessecondsamplesframesamplessecond

Bin 15 在 MATLAB 的索引 16 中。由于这是每帧的整数周期数,因此所有其他 bin 值都应为零。

希望这可以帮助。

赛德


跟进

你的计算应该是:

Frequency Bin×Sampling FrequencyNumber of Samples=15×10001500=10

15,又名斌1485, 也将是非零且 bin 的复共轭15. 每个都应该有一个大小2.5. 你的 DC 垃圾箱,又名垃圾箱0, 应该有一个值6. 相应的 MATLAB 索引将是16,1486, 和1.