オーディオ入力/スペクトルを正しく分析する方法


9

私はJavaと信号処理にかなり慣れていますが、オーディオ処理を扱うプロジェクトが割り当てられました。私に与えられたトピックは、曲(任意の曲)を分析するコンポーネントを持ち、現在再生されている周波数(リアルタイム)に応じてデータを出力するゲームです。つまり、曲が再生されると、現在の周波数が出力されます(1秒ごとに現在の周波数が出力されます)。

Stackoverflowで FFTを使用するように言われました。彼らは「ただFFTをする」と言いますが、それは私には何も意味しませんか?どのようにFFTを行いますか?私はチュートリアルを読み、基本的にそれが何であるかを理解していますが、次のようにそれを実装する方法についての手がかりはありません。

  • そのような処理に最も適したオーディオファイルのデータタイプは何ですか?
  • FFTの入力は正確には何ですか
  • 結果を解釈する方法

誰かがオーディオ信号を処理する方法について簡単なウォークスルー/チュートリアルを提案できますか?さらに、Java用のFFTの適切な実装を誰かが知っている場合は、その提案をいただければ幸いです。


2
この質問は、基本的なJava配列、データ型、ファイルの読み取りに関するものであるため、トピックから外れているようです。
hotpaw2 14

1
彼らはそれが信号処理を行うことであると私はここにお願いしなければならないと述べた
user3241507

あなたの質問の最後の部分だけがDSPに関するようです。ここで話題になる最初の2つまたは3つの部分を削除してみてください。
hotpaw2 14

回答:


8

どれどれ。Javaクラスや信号処理に対するJavaクラスのサポートについては知りませんが、いくつかガイドラインを示します。言語での実装の特定の詳細は、あなたが理解する必要があります。

オーディオファイルに対して何らかの処理を行うには、「生」のデータが必要です。つまり、オーディオファイルに圧縮されていないオーディオサンプルが含まれています。たとえば、WAV形式は、通常、16ビットの符号付き2の補数でサンプルを持っています。

コンピューターを使用してオフライン処理を行う場合は、その値をdoubleにキャストすることをお勧めします(今日のほとんどのプロセッサーでは64ビット浮動小数点数を意味します)。

したがって、ファイルからの連続した二重の数値のストリームが得られます。次に、連続データを処理する方法を定義する必要があります。標準的で非常に広く使用されている方法は、循環バッファーを使用することです(オフラインであっても、コードを効率的にしたいと思い、配列としてファイル全体をメモリにロードすることは最善の解決策ではありません)。それか、通常のバッファのどちらかを選択できます。バッファーの長さは2の累乗でなければなりません(Cooley-Tukey radix-2アルゴリズムの効率を高めてください)。

次に、実際のFFTを実行する必要があります。これは、FFT行列によるバッファーの乗算(数学的にはベクトルです)にすぎません。この操作が実際にJavaでどのように実行されるかはわかりません。Cでは、配列へのポインタと長さをFFTルーチンに渡すだけで、動的に割り当てられたメモリへのポインタを返すか、結果を配列に残して配列に渡します。

最後に、M個の複素数の配列に到達します(信号を含む配列/バッファー/ベクトルの長さがMであると想定)。そして、あなたはそれであなたがやりたいことを何でもします。

たとえば、基本周波数がどこにあるかを検出するために、複素数のそれぞれの大きさを取り、最大値を見つけることができます(ただし、非常に近似しています)。

その他:処理するより高度な手法には、漏れを回避するための事前ウィンドウ処理、ウィンドウパディングされたスペクトルでより高い解像度を得るためのゼロパディングの実行などがあります。

それが役に立てば幸い。


5

あなたが十分であれば JAVAJTRANSFORMSのJavaライブラリを使用できFFTます。

そしてあなたの必要性によってそれはのように聞こえます

ここに画像の説明を入力してください

Java Sound APIを使用した音楽の視覚化

7StepsのRubyでFFTを使用した音楽の視覚化

要件に応じて、次の簡単な手順に従うことができます。

*いくつかのオーディオ用語に慣れる

1.再生フレームを読み取ります(20〜30ミリ秒としましょう)。フレームサイズはsampling rate、サンプリングレート8000​​を使用しているとしましょう。各サンプルは16bit signed little endian、20ミリ秒のフレームは160サンプルになります。

注:raw圧縮mp3ファイルではなくファイルを再生してみてください。

2.生データのフレームを取り、実行する FFT

3.適切に実行する Windowing

4.出力FFTの結果には、2つの成分が実際にありabsolute、複素数成分の値であるマグニチュードプロットを取得しようとする複雑な結果が得られます。ピークは、dominant frequency

5.以下のような簡単なチュートリアルを見てください

FFTの良いチュートリアル

FFTのエンジニアガイド

FFTチュートリアル

FFTの概要

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.