1. ホーム
  2. python

[解決済み] 高速フーリエ変換を用いたオーディオの解析

2022-11-12 17:18:55

質問

Pythonでグラフィカルなスペクトラムアナライザーを作ろうとしています。

私は現在、16 ビット デュアル チャネル 44,100 Hz サンプル レートのオーディオ ストリームの 1024 バイトを読み取り、2 つのチャネルの振幅を一緒に平均化しています。 そのため、現在、私は 256 の符号付き短文の配列を持っています。 その配列に対して、numpy のようなモジュールを使用して fft を実行し、その結果を使用してグラフィカルなスペクトル アナライザを作成したいと思います。

私は高速フーリエ変換と離散フーリエ変換に関するwikipediaの記事を読みましたが、結果の配列が何を表しているのかまだ不明です。 これは、numpy を使用して私の配列に fft を実行した後の配列の外観です。

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

これらの数値は一体何を表しているのか、また、これらの数値を32本のバーのそれぞれの高さのパーセンテージにどのように変換すればよいのか、疑問に思っています。 また、2つのチャンネルを一緒に平均化する必要があるのでしょうか?

どのように解決するのですか?

表示されている配列は、音声信号のフーリエ変換の係数です。これらの係数は、音声の周波数コンテンツを得るために使用できます。FFTは複素数値の入力関数に対して定義されているので、入力がすべて実数値であっても、得られる係数は虚数になります。各周波数の電力量を得るには、各周波数のFFT係数の大きさを計算する必要があります。これは ではなく の実数成分だけでなく、実数成分と虚数成分の2乗和の平方根を計算する必要があります。つまり、係数が a + b*j であれば、その大きさは sqrt(a^2 + b^2) となります。

各FFT係数の大きさを計算したら、各FFT係数がどのオーディオ周波数に属しているかを把握する必要があります。サンプリング周波数が 44100 サンプル/秒、FFT のポイント数が 256 なので、周波数間隔は 44100 / 256 = 172 Hz (約) です。

配列の最初の係数は、0 の周波数係数になります。これは基本的に全周波数の平均パワーレベルです。残りの係数は、0 から 172 Hz の倍数で 128 までカウントアップされます。FFTでは、サンプルポイントの半分の周波数までしか測定できません。以下のリンク先をお読みください。 ナイキスト周波数 ナイキスト・シャノンサンプリング定理 は、あなたが大食漢で理由を知る必要がある場合ですが、基本的な結果は、低周波が複製されたり エイリアシング に複製されるということです。つまり、周波数は 0 から始まり、N/2 係数まで各係数ごとに 172 Hz ずつ増加し、N - 1 係数まで 172 Hz ずつ減少します。

これで、始めるには十分な情報でしょう。もし、Wikipedia よりももっと親しみやすい FFT の入門書をお望みなら、次のものを試してみてください。 Understanding Digital Signal Processing: 2nd Ed. . とても役に立ちました。

その数字が表しているのは、そういうことなんですね。高さのパーセンテージへの変換は、各周波数の成分の大きさをすべての成分の大きさの合計でスケーリングすることで行うことができます。ただし、これでは相対的な頻度分布の表現にとどまり、各頻度の実際のパワーは得られません。周波数成分の可能な最大値でスケーリングする方法もありますが、うまく表示されるかどうかわかりません。実用的なスケーリング係数を見つける最も手っ取り早い方法は、大きな音と小さな音のオーディオ信号で実験して、適切な設定を見つけることでしょう。

最後に、オーディオ信号全体の周波数コンテンツを全体として表示したい場合は、2 つのチャネルを一緒に平均化する必要があります。ステレオ音声をモノラル音声に混合し、結合された周波数を表示するのです。右と左の周波数を別々に表示したい場合は、各チャンネルで別々にフーリエ変換を行う必要があります。