计算STFT的赫兹

时间:2014-01-09 16:08:56

标签: audio fft dft

这个问题主要与这个答案有关: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)

这会产生以下结果:

enter image description here

我主要对下一部分如何工作感到困惑。例如,我基本上具有包含来自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块的大小。

然后,这将给出每个块的频率。

这是正确的,还是我完全忽略了这一点?

1 个答案:

答案 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。