[解決済み] 高速フーリエ変換を用いたオーディオの解析
質問
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 つのチャネルを一緒に平均化する必要があります。ステレオ音声をモノラル音声に混合し、結合された周波数を表示するのです。右と左の周波数を別々に表示したい場合は、各チャンネルで別々にフーリエ変換を行う必要があります。
関連
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?