2012-02-29 3 views
1

私は実装しようとしているFFTアルゴリズムに役立つWAVファイルからデータを抽出する方法を探しています。これまでのところ、左右のオーディオチャンネルには16進数の値がたくさんありますが、これをFFTの時間ドメインと周波数ドメインにどのように変換するかについて少し迷っています。ここでFFTで使用するためにWAVファイルからデータを抽出する方法

は、私は、たとえば必要なものです:

3.6 2.6 
2.9 6.3 
5.6 4.0 
4.8 9.1 
3.3 0.4 
5.9 4.8 
5.0 2.6 
4.3 4.1 

そして、これはFFTのデータを取り込む関数のプロトタイプです:

Nはのためのポイント数である
void fft(int N, double (*x)[2], double (*y)[2]) 

FFT、xは時間領域サンプルへのポインタ、yは周波数領域サンプルへのポインタです。

ありがとうございます!

+0

ここで指定したWAVE形式を使用してデータの頻度を決定しましたか:https://ccrma.stanford.edu/courses/422/projects/WaveFormat/?このリンクはこのSOの質問から来ました:http://stackoverflow.com/questions/9499270/reading-wav-file-in-matlab-coder – macduff

+0

あなたが学術的な理由であなた自身のFFTを書いていない限り、http://をチェックしてくださいwww.fftw.org/。そして、waveファイルを読むために:http://www.mega-nerd.com/libsndfile/ –

+0

@oexcz - 明確にするために、時間領域サンプルは入力(デコードwavファイル)であり、周波数領域サンプルはあなたの出力。これがFFTの機能です - 時間領域から周波数領域への変換 - そうですか? – hooleyhoop

答えて

3

WAVファイルから波形データを抽出する必要はありません。あなたはちょうどメモリ内のいくつかの信号を生成することができます(例えば、0、非ゼロ定数、正弦波、2つの重畳正弦波、白色雑音)、それらのFFT関数をテストして、 0、非ゼロ定数信号の場合はゼロ周波数でピーク、正弦波ごとに2つのピーク、白色ノイズの場合はすべての周波数にわたって均一な非ゼロ振幅)。

実際にWAVファイルを解析する場合は、フォーマットのWikipedia(リンクをたどってください)を参照してください。 RAW PCM符号化またはA /μ-law PCM符号化(AKA G.711)のいずれかを使用します。

通常、FFTはインプレースアルゴリズムを使用して実装されます。つまり、出力が入力を置き換えます。同じことをするなら、2番目のポインタは本当に必要ありません。

0

最も一般的に見られるWAVE/RIFFファイル形式は、ステレオ用にインターリーブされた16ビットまたは2バイトのリトルエンディアン符号付き整数サンプルの後に44バイトのヘッダーが続きます。あなたがバイトをスキップする方法を知っていて、短いintをdouble型に読み込むなら、あなたは良いと思うはずです。

実際のコンポーネントベクトルとしてFFTに必要な長さの時間領域データを入力するだけです。 FFTの結果は複素周波数領域ベクトルになります。

関連する問題