2

私はPythonでオーディオ分析を行っています。私の最終目標は、 のような周波数とそれぞれのボリュームのリストを取得することです{ frequency : volume (0.0 - 1.0) }

と の間の値を持つフレームのリストとしてオーディオ データが-1.0あり+1.0ます。このリストで numpy のフーリエ変換を使用しました — numpy.fftpack.fft(). しかし、結果のデータは私には意味がありません。

フーリエ変換が時間領域から周波数領域に変換されることは理解していますが、数学的にどのように機能するかはわかりません。そのため、結果がよくわかりません。

  • numpy.fftpack.fft()返されるリストの値は何を意味しますか? それをどのように扱う/解釈するのですか?
  • 上記のようにリストに対して実行されるフーリエ変換の最大値/最小値は何でしょうか?
  • 形式で辞書の最終目標を達成するにはどうすればよい{ frequency : volume (0.0 - 1.0) }ですか?

ありがとうございました。フーリエ変換についての私の理解が不足していて、あなたが顔をしかめた場合は申し訳ありません。

4

1 に答える 1

4

正弦波の 1 周期の FFT を考えてみましょう。

>>> t = np.linspace(0, 2*np.pi, 100)
>>> x = np.sin(t)
>>> f = np.fft.rfft(x)
>>> np.round(np.abs(f), 0)
array([  0.,  50.,   1.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.])

FFT は、周波数の振幅と位相を与える複素数の配列を返します。振幅のみに関心があると仮定するとnp.abs、各周波数の振幅を取得し、 を使用して最も近い整数に丸めましたnp.round(__, 0)1サンプル数に等しい周期の正弦波が見つかったことを示すindex でのスパイクを確認できます。

波をもう少し複雑にします

>>> x = np.sin(t) + np.sin(3*t) + np.sin(5*t)
>>> f = np.fft.rfft(x)
>>> np.round(np.abs(f), 0)
array([  0.,  50.,   1.,  50.,   0.,  48.,   4.,   2.,   2.,   1.,   1.,
         1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.])

入力に対応する指標 1、3、および 5 にスパイクが見られます。周期nn/3およびn/5(n は入力サンプル数) の正弦波。

編集

フーリエ変換の概念的な説明は次のとおりです。http://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/

于 2014-05-12T05:24:16.787 に答える