【问题标题】:Calculating Hertz of STFT计算 STFT 的赫兹
【发布时间】:2014-01-09 16:08:55
【问题描述】:

这个问题主要与这个答案有关:Here 所以如果@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 块的大小。

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

这是正确的,还是我完全没有抓住重点?

【问题讨论】:

    标签: audio fft dft


    【解决方案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。

    【讨论】:

    • 嗨,事情是这样的。对于 STFT,我将使用频谱图,它似乎已经找到了幅度。 10 * log10(sqrt(re*re + im * im) 那么我只需要计算这些垃圾箱的最高数字,然后计算 htz 吗?例如,频谱图的结果可以用在这里吗/
    • 我从不使用频谱图来计算它,我使用磁力方程 sqrt(rere+imim) 这是正确的方法,现在您只需要从上半年结果中获取最大值(索引)...
    • 谢谢这个作品!!只是不使用频谱图计算?知道了 :)!我很可能会从块中看到 htz 的变化吗? IE。如果一个块低于另一个,我认为频率会增加,反之亦然?
    • 太棒了,每个块都没有关系,如果你的频率会增加或减少,只是取决于你的输入信号
    • 那么这种方法不适合展示频率如何随时间变化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2019-11-21
    相关资源
    最近更新 更多