Быстрое преобразование Фурье и обратное преобразование

101
23 декабря 2020, 20:10

Я ищу реализацию БПФ на .NET-совместных языках. Однако, то множество реализаций, что мне удалось найти возвращают массив комплексных чисел - значений амплитуд. Мне нужно получить сопоставление частот и амплитуд (т.е. спектр). Например, вот готовые примеры БПФ на wiki: Быстрое преобразование Фурье.

Возможно, для получения нужного результата достаточно знать ширину окна, по которому рассчитывается БПФ.

Ну, говоря об обратном преобразовании, готовых реализаций вообще не нашёл.

Answer 1

Вообще-то гугл много чего находит. Вот, например, нашлась оболочка для шарпа и либы FFTW: https://github.com/tszalay/FFTWSharp

Ну, говоря об обратном преобразовании, готовых реализаций вообще не нашёл.

Очень боюсь в чем-то наврать, поскольку работал с БПФ очень давно и многое забыл. Там есть несколько вариантов. Прореживание по времени или по частоте, а также нормирование по мощности. Второе связано с незначительными изменениями в операции "бабочка". У меня при прямом преобразовании в "бабочке" присутствовало деление на 2, а при обратном нет. Кроме того, перед обратным преобразованием надо было выполнить комплексное сопряжение над фурье-образом, то есть просто изменить знак мнимых частей.

Задача была - вычитание спектра шума из сигнала в реальном времени. Вообще-то спектры, полученные БПФ, вычитать нельзя, как я уже написал в комментарии к вопросу. Поэтому я на каждом блоке сигнала уже не помню как строил цифровой фильтр, который максимально соответствовал бы производимой операции. Естественно, для каждого блока сигнала такой фильтр получается разный. Поэтому я строил два фильтра: для одного блока и для следующего. Оба их применял а результат уже на сигнале линейно интерполировал. В общем, БПФ прямых и обратных, да еще и с разной длиной блока для этого приходилось делать порядка десяти. Но 10 БПФ все равно быстрее 1 НПФ (непрерывное преобразование Фурье), с которым все проще для данной задачи. Я тогда так и не разобрался на уровне математики, почему это вообще работает, но работало хорошо.

Надеюсь, этот пример вам чем-то поможет. Как минимум, поможет понять, что все не так просто, и БПФ это не волшебная палочка, а лишь способ быстрого вычисления сверток.

READ ALSO
Как связать две таблицы с помощью DataGridViewComboBoxColumn?

Как связать две таблицы с помощью DataGridViewComboBoxColumn?

У меня есть две таблицы Timetable и Services связанные по ID_ServiceTimetable представлена как DataGrid

118
Сохранение и открытие данных в файл из dataGridView

Сохранение и открытие данных в файл из dataGridView

Всем здравствуйте, вопрос следующийК программе на с# подключена БД из Microsoft SQL Server, в DataGridView выводится таблица

111
Несколько условий для Mysql запроса

Несколько условий для Mysql запроса

Есть таблица, в ней есть колонка meta_key и meta_value Вот запр

133
Передача значений отмеченных checbox

Передача значений отмеченных checbox

У меня есть сайт с несколькими страницами с checbox, мне нужно сначала с одной страницы запомнить значения выбранных потом со следующей, передать...

110