Я хочу использовать волновой файл в качестве входных данных, преобразовать его Фурье и сравнить эти значения с другим файлом и получить разницу.
Задача, над которой я так долго работал, — заставить работать преобразование Фурье.
Вместо того, чтобы давать разумные результаты, я получаю только значения 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);
}
}
Код: Выделить всё
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);
Подробнее здесь: https://stackoverflow.com/questions/355 ... urier-work
Мобильная версия