1

複素数を返し、c# を使用してスペクトログラム/スペクトル密度チャートを作成するために、Lomont FFTを使用しようとしています。

クラスから値を返す方法がわかりません。これまでにまとめたコードは、動作しているように見えます。

    int read = 0;
    Double[] data;
    byte[] buffer = new byte[1024];

    FileStream wave = new FileStream(args[0], FileMode.Open, FileAccess.Read);  
    read = wave.Read(buffer, 0, 44);                                            
    read = wave.Read(buffer, 0, 1024);                                          
    data = new Double[read];                                                    


    for (int i = 0; i < read; i+=2)
    {
        data[i] = BitConverter.ToInt16(buffer, i) / 32768.0;
        Console.WriteLine(data[i]);
    }
    LomontFFT LFFT = new LomontFFT();
    LFFT.FFT(data, true);

私がはっきりしていないのは、Lomont FFT 実装の値をアプリケーション (コンソール) に戻す/アクセスする方法です。

C# 開発にかなり慣れていないので、Lomont クラスのインスタンスから処理された値を取得する方法、またはそれを間違って呼び出す方法に関する理解の基本的な側面が欠けているのではないかと考えています。

Console.WriteLine(LFFT.A); // Returns 0
Console.WriteLine(LFFT.B); // Returns 1

これを行う方法のコードスニペットまたは説明を探していましたが、これまでのところ、私が直面している問題のこの特定の側面を理解したり説明したりするものは何もありません. ガイダンスをいただければ幸いです。

上記のコードに示されている配列に保持されている結果のサブセットはdata以下にあり、私の現在の理解に基づいて、有効であるように見えます:

0.00531005859375
0.0238037109375
0.041473388671875
0.0576171875
0.07183837890625
0.083465576171875
0.092193603515625
0.097625732421875
0.099639892578125
0.098114013671875
0.0931396484375
0.0848388671875
0.07354736328125
0.05963134765625
0.043609619140625
0.026031494140625
0.007476806640625
-0.011260986328125
-0.0296630859375
-0.047027587890625
-0.062713623046875
-0.076141357421875
-0.086883544921875
-0.09454345703125
-0.098785400390625
-0.0994873046875
-0.0966796875
-0.090362548828125
-0.080810546875
-0.06842041015625
-0.05352783203125
-0.036712646484375
-0.0185546875

私は実際に何をしようとしていますか?(視点)

ウェーブ ファイルをコンソール アプリケーションにロードし、さらに処理するために、スペクトログラム/スペクトル密度チャート/画像を jpg/png として返したいと考えています。

私が読んでいるWaveファイルはモノフォーマットです


更新 1

I どの FFT を使用するかによって、わずかに異なる結果が得られます。

RealFFT の使用

    for (int i = 0; i < read; i+=2)
    {
        data[i] = BitConverter.ToInt16(buffer, i) / 32768.0;
        //Console.WriteLine(data[i]);
    }

    LomontFFT LFFT = new LomontFFT();
    LFFT.RealFFT(data, true);

    for (int i = 0; i < buffer.Length / 2; i++)
    {
        System.Console.WriteLine("{0}",
          Math.Sqrt(data[2 * i] * data[2 * i] + data[2 * i + 1] * data[2 * i + 1]));
    }

RealFFT の部分的な結果

0.314566983321381
0.625242818210924
0.30314888696868
0.118468857708093
0.0587697011760449
0.0369034115568654
0.0265842582236275
0.0207195964060356
0.0169601273233317
0.0143745438577886
0.012528799609089
0.0111831275153128
0.0102313284519146
0.00960198279358434
0.00920236001619566

FFT の使用

    for (int i = 0; i < read; i+=2)
    {
        data[i] = BitConverter.ToInt16(buffer, i) / 32768.0;
        //Console.WriteLine(data[i]);
    }

    double[] bufferB = new double[2 * data.Length];

    for (int i = 0; i < data.Length; i++)
    {
        bufferB[2 * i] = data[i];
        bufferB[2 * i + 1] = 0;
    }

    LomontFFT LFFT = new LomontFFT();
    LFFT.FFT(bufferB, true);

    for (int i = 0; i < bufferB.Length / 2; i++)
    {
        System.Console.WriteLine("{0}",
          Math.Sqrt(bufferB[2 * i] * bufferB[2 * i] + bufferB[2 * i + 1] * bufferB[2 * i + 1]));
    }

FFT の部分的な結果:

0.31456698332138
0.625242818210923
0.303148886968679
0.118468857708092
0.0587697011760447
0.0369034115568653
0.0265842582236274
0.0207195964060355
0.0169601273233317
0.0143745438577886
0.012528799609089
0.0111831275153127
0.0102313284519146
0.00960198279358439
0.00920236001619564
4

1 に答える 1