这个问题主要与这个答案有关:Here如果@Paul R有机会看到它,那将是理想的。
我有一个信号,我已经计算了STFT。 NFFT的大小为256,重叠为128.这产生了21个包含输出的独立块。
我想将此转换为Hertz,以了解信号中每个点的不同Hertz是什么。我使用以下公式计算了幅度:
sqrt(output[i][j].re * output[i][j].re + output[i][j].im * output[i][j].im)
这会产生以下结果:
我主要对下一部分如何工作感到困惑。例如,我基本上具有包含来自STFT的所有块的2D矢量(每个块大小为256)。因此,我是否计算块内每个点的幅度,计算最大幅度数,然后使用公式freq = i_max * Fs / N
?
如果是这样,它看起来如下(例如,不是实际数据):
D0 = {0.23 + 1.58,
1.05 + 0.56,
0.58 + 1.38,
.....,
0.58 + 87.6}
= mag[0] = sqrt(0.23 * 0.23 + 1.58 * 1.58),
....
....
然后,这将为每个STFT输出产生幅度矢量。从那里,我可以计算哪个是最高的(比方说7),然后我可以计算以下内容:
freq = 7 * 44100 / 4
其中44100 =采样率,4 = STFT块的大小。
然后,这将给出每个块的频率。
这是正确的,还是我完全忽略了这一点?
答案 0 :(得分:1)
你混淆了几件事,你的输出图像似乎是所有21块(FFT)在一起21 * 256 = 5376点,它真的没有任何帮助!
您需要使用以下方法找到每个块的基频(NFFT = 256):
freq = MaxMagnitudeFromThisBlockFFT * Fs / NFFT
对于你的情况:
freq = MaxMagnitudeFromThisBlockFFT * 44100 / 256
最后,您将找到每个块FFT的21个频率
PS:
你的NFFT是256,你的采样率是44100,那么你的频率分辨率是44100/256 = 172,265625,如果你想要更准确的尝试NFFT = 2048或4096。