Как создать объект ComplexSignal из объекта Signal в Accord.NET?

Я пытаюсь выполнить БПФ для Сигнала, созданного WAV-файлом, который имеет 1 канал и 64064 сэмпла (приблизительно 4 секунды длиной при 16 КБ). Я использую Accord.NET и следующий код, чтобы попытаться создать объект ComplexSignal, который требуется для выполнения FFT.

string fileName = "mu1.wav"; //the name of my wave file
WaveDecoder sourceDecoder = new WaveDecoder(fileName); //Accord.Audio.Formats.WaveDecoder
Signal s = sourceDecoder.Decode(); //SampleFormat says Format32bitIeeeFloat
ComplexSignal = s.ToComplex(); //This throws the following exception:

//InvalidSignalPropertiesException 
//Signals length should be a power of 2. 

Считывая исходный код Signal, его следует генерировать только в том случае, если Signal.SampleFormat не является Format32bitIeeeFloat, каким он является.

Я действительно удивлен, что не так просто манипулировать аудио функциями (в частности, частотами) wav-файла в C#.

1 ответ

Решение

Вам нужно создать окно Хэмминга (или другого метода) с размером в степени 2 (я выбрал 1024 здесь). Затем примените окно к сложному сигналу перед выполнением прямого преобразования Фурье.

        string fileName = "mu1.wav";
        WaveDecoder sourceDecoder = new WaveDecoder(fileName);
        Signal sourceSignal = sourceDecoder.Decode();

        //Create Hamming window so that signal will fit into power of 2:           
        RaisedCosineWindow window = RaisedCosineWindow.Hamming(1024);

        // Splits the source signal by walking each 512 samples, then creating 
        // a 1024 sample window. Note that this will result in overlapped windows.
        Signal[] windows = sourceSignal.Split(window, 512);

        // You might need to import Accord.Math in order to call this:
        ComplexSignal[] complex = windows.Apply(ComplexSignal.FromSignal);

        // Forward to the Fourier domain
        complex.ForwardFourierTransform(); //Complete!

        //Recommend building a histogram to see the results
Другие вопросы по тегам