Как создать объект 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