C#によるWaveデータのFFT処理

Visual Studio Express 2013を使用し、C#言語によりWaveファイル形式でWaveデータに対して、FFT処理を行います。「C#によるWaveデータの作成」によりFFT処理を行うWaveファイルを作成し、FFT処理を行いその処理結果を表示します。次の表示は、1722Hzと861Hzを加算したデータ長100msの正弦波に対して、FFT処理を行った結果を示します。

C#によるWaveデータのFFT処理

FFT処理ライブラリの追加

FFTの計算には、Math.NET Numericsを使用します。Math.NET Numericsは.NET Framework向けのオープンソースな数値計算用のライブラリで、特殊関数、線形代数、確率モデル、乱数、補間、積分変換(FFT)などが含まれます。
ソリューションエクスプローラーの参照設定を右クリックし、表示されたメニューで「NuGetパッケージの管理」を選択します。NuGetパッケージの管理のダイアログが表示されるので、オンラインを選択し、検索ボックスに「Math.NET」と入力します。

NuGetパッケージの管理

検索結果から「Math.NET Numerics」を選択し、表示されるInstallボタンをクリックすると、次のように参照設定に「MathNeT Numerics」が表示されます。

FFT処理ライブラリの追加

C#によるWaveデータ作成のプログラム変更

waveデータは、1722Hzと861Hzを加算した正弦波を発生するために、28行目から31行目を次のように変更します。なお、発生した1722Hzと861Hzを加算した正弦波は、FFT処理を行うと、1722Hzはサンプルポイントの80番目、861Hzはサンプルポイントの40番目がピークとなります。

// 1722Hzと861Hzを加算した正弦波を作る。
double Wave = 0;

Wave += Math.Sin(Radian * 1722);
Wave += Math.Sin(Radian * 861);
Wave /= 2;

short Data = (short)(Wave * 30000);

サンプリング周期が 22.675736961451μsec (=1/44100) で2048ポイントの FFT なら、周波数分解能は、1/(2048・22.67573696145μ)=21.533203125Hzです。
・サンプルポイントの40番目:21.533203125Hz * 40=861Hz

・サンプルポイントの80番目:21.533203125Hz * 80=1722Hz

C#によるWaveデータFFT処理プログラムの作成

インストールしたMath.NET Numericsを使用して、FFT計算を行います。FFTのサンプル数は2048ポイントとしました。

using System.Numerics;
using MathNet.Numerics;
using MathNet.Numerics.IntegralTransforms;

public void computeFFT(int[] soundvalues)
{
    //convert int to complex
    for (int i = 0; i < windowSize; i++)
    {
        complexData[i] = new Complex((double)soundvalues[i], 0);   // 
    }

    //run FFT
    Fourier.Forward(complexData, FourierOptions.Matlab); // arbitrary length
}
  • 変数「windowSize」は「2048」にします。
  • 10行目で、Complexのインスタンスにより、入力したWaveデータを複素数データに変換します。

C#によるWaveデータFFT処理結果表示プログラムの作成

FFT処理結果を棒グラムで表示させます。処理方法については「C#によるWaveファイルのデータを用いた波形表示」を参照してください。なお次の部分を変更します。

  • タイトルや軸ラベルの変更
  • test.ChartType : SeriesChartType.Column

2048ポイントサンプル値の表示は、次のように複素数「value」の絶対値で表示します。

//グラフのデータを追加
for (int i = 0; i < value.Length; i++)
{
    test.Points.AddXY(i, value[i].Magnitude);
}