0

这个问题主要与这个答案有关:如果@Paul R 有机会看到它,这将是理想的。

我有一个信号,我已经计算了一个 STFT。NFFT 的大小为 256,重叠为 128。这产生了 21 个包含输出的单独块。

因此,我想将其转换为赫兹,以查看信号中每个点的不同赫兹是什么。我使用以下公式计算了幅度:

sqrt(output[i][j].re * output[i][j].re + output[i][j].im * output[i][j].im)

这会产生以下结果:

在此处输入图像描述

我主要对下一部分的工作方式感到困惑。例如,我基本上有一个二维向量,其中包含来自 STFT 的所有块(每个块的大小为 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 块的大小。

然后这会给我每个块的频率。

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

4

1 回答 1

1

你混淆了一些东西,你的输出图像似乎是所有 21 个块(FFT)加起来 21 * 256 = 5376 点,这真的没什么帮助!

您需要使用以下方法找到每个块 (NFFT=256) 的基频:

freq = MaxMagnitudeFromThisBlockFFT * Fs / NFFT

对于您的情况:

freq = MaxMagnitudeFromThisBlockFFT * 44100 / 256

最后,您会发现 21 个频率对应每个块 FFT

PS:

你的 NFFT 是 256,你的采样率是 44100,那么你的频率分辨率是 44100/ 256 = 172,265625,如果你想要更准确的尝试 NFFT= 2048 或 4096。

于 2014-01-10T13:28:36.283 回答