Math.NET Fourier не работает должным образомC#

Место общения программистов C#
Ответить
Anonymous
 Math.NET Fourier не работает должным образом

Сообщение Anonymous »

Я пытаюсь найти решение уже несколько недель и прочитал все темы, связанные с этой темой, поэтому надеюсь, что кто-нибудь поможет мне в этом.
Я хочу использовать волновой файл в качестве входных данных, применить к нему преобразование Фурье и взять эти значения, чтобы сравнить их с другим файлом и получить разницу.
Задача, над которой я так долго работал, состоит в том, чтобы заставить это преобразование Фурье работать. Вместо того, чтобы давать разумные результаты, я получаю только значения NaN.
У меня есть следующий код:

Код: Выделить всё

public FFTPerformer(float[] soundvalues)
{
buffer = new System.Numerics.Complex[4096];
try {
for (int i = 0; i < 4096; i++)
{
System.Numerics.Complex tmp = new System.Numerics.Complex(soundvalues[i], 0);
buffer[i] = tmp;
}
}
catch(Exception ex)
{
System.Windows.MessageBox.Show("Es ist ein Fehler bei der Konvertierung des float arrays zum Complex-Array aufgetreten; " + ex.Message);
}
}
Число 4096 обычно заменяется большим числом, которое по-прежнему является степенью двойки, но оно даже не работает с этим числом.

Код: Выделить всё

public void performFFT()
{
try
{
MathNet.Numerics.IntegralTransforms.Fourier.Forward(buffer, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);
}
catch(Exception ex)
{
System.Windows.MessageBox.Show("Fehler: " + ex.Message);
}
}
Немного более подробное описание:
Я установил длину для 4096 значений, потому что это коэффициент два, и эта длина предназначена только для тестовых целей, так что это немного быстрее проверить, чем использовать исходный звуковой файл с несколькими миллионами значений;) Так что это только так, пока не доказано, что алгоритм работает. Это также причина странного цикла for. Несмотря на то, что Math.Net использует алгоритм Bluestein для вычислений, все равно попробуйте его с коэффициентом двух массивов, потому что они просто должны работать, даже если в данный момент они используют какой-либо другой алгоритм.
Пытался получить сообщение об ошибке с помощью этого try-catch из-за преобразования Float-Decimal, но оно ничего не вызывает.
Моя проблема в том, что теперь я отправляю 4096 комплексных чисел в этом БПФ, все они имеют Y = 0, но X зависит от аудиофайла (прочитайте в другой теме, что значения Y не нужны для аудио БПФ, поэтому вам следует установить их на 0). Все значения X являются обычными числами с плавающей запятой, без NaN. Но тем не менее, БПФ просто возвращает массив, полный NaN.
Сначала я попытался выполнить неявное преобразование в System.Numerics.Complex, но это не сработало, поэтому я создал эту конструкцию с помощью переменной tmp.
В итоге я прочитал еще больше статей об алгоритмах БПФ.
Теперь я все еще получаю свои звуковые значения в виде числа с плавающей запятой и преобразую их в комплексный массив. Я проверил все этапы преобразования на предмет согласованности, и в этой области все в порядке. Это все, что мне нужно сделать?

Код: Выделить всё

MathNet.Numerics.IntegralTransforms.Fourier.Forward(buffer, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);
или мне нужно что-то до этого, чтобы выполнить чистое БПФ в Math.NET?


Подробнее здесь: https://stackoverflow.com/questions/355 ... s-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»