6

注: これは重複ではありません。関連する質問以外に特定の要件があります。

まず、オーディオ ファイル (.wav) のスペクトルを audacity と同じようにプロットします (類似:フーリエ変換から周波数スペクトルを描画する方法)。

これまでのところ、wav ファイルを読み書きできます。しかし、私の問題は、FFT 関数に渡す必要がある値が正確にわからないことです。ちなみに私はC#でFFTにExocortexを使っています。FFT 関数では、適切なサイズ (512、1024 など) の複素数の配列、長さのオプションの整数パラメーター、およびフーリエ方向 (前方/後方) を渡す必要があります。

具体的な質問:

  1. Exocortex ライブラリの Complex (クラス) には、Real と Imaginary という 2 つの値があります。私はサンプルの配列を持っているので、どれが実数でどれが虚数である必要がありますか?
  2. 私はwavファイルを持っているので、長さは可変であると想定する必要があります。それをFFT関数に渡すにはどうすればよいですか?サイズ (512/1024/etc) を選択し、サンプル全体をそのサイズに分割してから、そのすべてを FFT に渡す必要がありますか?
  3. どの周波数を x 軸にリストする必要があるかを知るにはどうすればよいですか?
  4. FFT されたデータをプロットするにはどうすればよいですか? (x軸を周波数、y軸をデシベルにしたい)

意味がわからない場合は、Audacity を使用してオーディオ ファイルをインポートし、[分析] > [スペクトルのプロット] をクリックしてみてください。それらは再現したいものです。私は本当にこれを学びたいので、私の質問に詳しく答えてください。私はこれについて少しだけ背景を持っています。私はデジタル信号処理の初心者です。また、私の質問に具体的に答えてくれないので、できるだけ他の FFT サイトに誘導しないでください。


編集:

私はいくつかの読書をして、オーディオデータを FFT する方法を見つけましたが、2 のべき乗でしかありません。一部によると、「ウィンドウ」を使用する必要があります。私もそれについて調べてみたところ、後で処理するのに必要なのは波形の一部だけであることがわかりました。上記のことを思い出してください。オーディオ ファイルの一部ではなく、その FFT を取得したいのです。それで、私は今何をすべきですか?助けてください :(

4

1 に答える 1

7

サインは

public static void  FFT( float[] data, int length, FourierDirection direction )
  1. ペアとして表される複素数の配列を渡します。実数 (サンプル) しかないので、サンプルを配列内の偶数の場所 (data[0]、data[2]、data[4] など) に配置する必要があります。奇数の位置は 0、data[1] = data[3] = 0...
  2. 長さは、FFT を計算するサンプルの量であり、データ配列の長さのちょうど半分である必要があります。WAV 全体またはその一部を FFT できます - 見たいものによって異なります。Audacity は、ファイルの選択した部分のパワー スペクトルをプロットします。同じことをしたい場合は、WAV 全体または選択した部分を渡します。
  3. FFT は、サンプリング レートの半分までの周波数のみを表示します。したがって、値は 0 からサンプリング レートの半分にする必要があります。値の量は、持っているサンプルの量によって異なります (サンプルの量は計算の精度に影響します)。
  4. Audacity はパワー スペクトルをプロットします。受け取った配列内の各複素数ペアを取り、その ABS を計算する必要があります。ABS は sqrt(r^2+i^2) として定義されます。各 ABS 値は単一の周波数に対応します。

作業コードの例を次に示します。

float[] data = new float[8];
data[0] = 1; data[2] = 1; data[4] = 1; data[6] = 1;
Fourier.FFT(data, data.Length/2, FourierDirection.Forward);

私はそれに4つのサンプルを与えていますが、すべて同じです。したがって、周波数 0 でのみ何かが得られることを期待しています。実際、それを実行した後、

データ[0] == 1、データ[2] == 1、データ[4] == 1、データ[6] == 1

そして他は0です。

複雑な配列のオーバーロードを使用したい場合

Complex[] data2 = new Complex[4];
data2[0] = new Complex(1,0);
data2[1] = new Complex(1, 0);
data2[2] = new Complex(1, 0);
data2[3] = new Complex(1, 0);
Fourier.FFT(data2,data2.Length,FourierDirection.Forward);

ここでは、各配列メンバーが複素数であるため、2 番目のパラメーターは配列の長さに等しいことに注意してください。以前と同じ結果が得られます。

以前は複雑なオーバーロードを見逃していたと思います。データが既にペアになっていない限り、エラーが発生しにくく、より自然に使用できるようです。

于 2013-08-09T06:51:26.820 に答える