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) を含む 2D ベクトルがあります。したがって、ブロック内の各ポイントのマグニチュードを計算し、マグニチュードの最大数を計算してから、式を使用し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 * 256 = 5376 ポイントを合わせた 21 個のブロック (FFT) のようですが、実際には何の役にも立ちません!

以下を使用して、すべてのブロック (NFFT=256) の基本周波数を見つける必要があります。

freq = MaxMagnitudeFromThisBlockFFT * Fs / NFFT

あなたの場合:

freq = MaxMagnitudeFromThisBlockFFT * 44100 / 256

最後に、ブロックFFTごとに1つずつ、21の周波数が見つかります

PS:

あなたの NFFT は 256 で、サンプルレートは 44100 で、周波数分解能は 44100/ 256 = 172,265625 です。より正確にしたい場合は、NFFT= 2048 または 4096 を試してください。

于 2014-01-10T13:28:36.283 に答える