Math. Net и alglib по умолчанию возвращают разные выходы FFT - PullRequest
0 голосов
/ 18 февраля 2020

Я занимаюсь разработкой приложения в C# с функцией рисования спектрограммы.

Для своей первой попытки я использовал Mat hNet .Numerics, и сейчас я продолжаю разрабатывать с alglib. Когда я перешел с одного на другой, я заметил, что выходной сигнал для них отличается. Mat hnet по умолчанию использует некоторую коррекцию, которую alglib, похоже, не использует. Я на самом деле не занимаюсь обработкой сигналов, а также новичком ie в программировании, и я не могу понять, из-за чего именно возникает разница.

Мат hNet Значения по умолчанию (необработанная величина) варьируются от ~ 0,1 до ~ 274 в моем случае. А с помощью alglib я получаю значения в диапазоне от ~ 0,2 до ~ 6220.

Я обнаружил, что Mat hNet Fourier.Forward использует параметр масштабирования по умолчанию. Вот что говорит FourierOptions.Default: «Универсальный; Symmetri c масштабирование и общий показатель (используется в Maple)». https://numerics.mathdotnet.com/api/MathNet.Numerics.IntegralTransforms/FourierOptions.htm Если я использую FourierOptions.NoScaling, выходные данные будут такими же, как в alglib.

В Mat hNet я использовал функцию Fourier.Forward: https://numerics.mathdotnet.com/api/MathNet.Numerics.IntegralTransforms/Fourier.htm#Forward В случае с alglib я использовал функцию fftr1d: https://www.alglib.net/translator/man/manual.csharp.html#sub_fftr1d

  • Какая разница в их расчете?
  • Какую функцию я мог бы использовать для преобразования выходной величины alglib в Mat hNet, или наоборот?
  • В каких случаях я должен использовать эти разные "масштабирования"? Для чего они нужны?

Пожалуйста, поделитесь своими знаниями. Заранее спасибо!

1 Ответ

0 голосов
/ 21 февраля 2020

Я разработал это сам, прочитав кучу постов, в которых упоминаются разные методы масштабирования FFT. Я до сих пор нахожу этот аспект обработки БПФ сильно недокументированным везде. Я еще не нашел надежного источника, который бы объяснял, для чего используются эти вычисления, какие области науки или какие методы обработки их используют.

Я еще обнаружил три различных вида вычислений, касающихся необработанного БПФ выход (величины комплексов). Это означает умножение их на: 1. 1 / numSamples 2. 2 / numSamples 3. 1 / sqrt (numSamples) 4. (без масштабирования)

Mat hNet .IntegralTransforms.Fourier.Forward (и соответственно для различных сообщений на net, также возможно Matlab и Maple) по умолчанию, используется третий. Что, по моему мнению, приводит к более четкому графическому выводу при использовании раскрашивания логарифми c.

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

...