Visual Studio Express 2013を使用し、C#言語によりWaveファイル形式でWaveデータに対して、FFT処理を行います。「C#によるWaveデータの作成」によりFFT処理を行うWaveファイルを作成し、FFT処理を行いその処理結果を表示します。次の表示は、1722Hzと861Hzを加算したデータ長100msの正弦波に対して、FFT処理を行った結果を示します。
FFT処理ライブラリの追加
FFTの計算には、Math.NET Numericsを使用します。Math.NET Numericsは.NET Framework向けのオープンソースな数値計算用のライブラリで、特殊関数、線形代数、確率モデル、乱数、補間、積分変換(FFT)などが含まれます。
ソリューションエクスプローラーの参照設定を右クリックし、表示されたメニューで「NuGetパッケージの管理」を選択します。NuGetパッケージの管理のダイアログが表示されるので、オンラインを選択し、検索ボックスに「Math.NET」と入力します。
検索結果から「Math.NET Numerics」を選択し、表示されるInstallボタンをクリックすると、次のように参照設定に「MathNeT Numerics」が表示されます。
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); }