Заставьте Math.NET Фурье работатьC#

Место общения программистов C#
Ответить
Anonymous
 Заставьте Math.NET Фурье работать

Сообщение Anonymous »

Я уже несколько недель пытаюсь найти решение и действительно прочитал все темы, связанные с этой темой, поэтому очень надеюсь, что кто-нибудь сможет мне с этим помочь.

Я хочу использовать волновой файл в качестве входных данных, преобразовать его Фурье и сравнить эти значения с другим файлом и получить разницу.

Задача, над которой я так долго работал, — заставить работать преобразование Фурье.

Вместо того, чтобы давать разумные результаты, я получаю только значения NaN.

У меня есть следующий код:< /p>

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

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 использует для вычислений алгоритм Блюстейна, все равно попробуйте его с коэффициентом двух массивов, потому что они просто должны работать, даже если они используют любой другой алгоритм.

пробовал чтобы получить сообщение об ошибке с помощью этой попытки из-за преобразования 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 ... urier-work
Ответить

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

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

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

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

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