Как мне взять БПФ неравномерно расположенных данных?

55

Преобразование Фурье Быстрый алгоритм вычисляет Фурье разложения в предположении , что его входные точки равномерно распределены во временной области, . Что если они не? Есть ли другой алгоритм, который я мог бы использовать, или каким-то образом я мог бы изменить БПФ, чтобы учесть, что фактически является переменной частотой дискретизации?tk=kT

Если решение зависит от того, как распределены образцы, меня интересуют две конкретные ситуации:

  • Постоянная скорость дискретизации с джиттера: где б т K является случайным образом распределены переменной. Предположим, можно с уверенностью сказать | δ t k | < T / 2 .tk=kT+δtkδtk|δtk|<T/2
  • Отброшенные выборки с другой постоянной частотой выборки: где n kZktk=nkTnkZk

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

Дэвид З
источник

Ответы:

40

Существует множество методов для неоднородного БПФ, и наиболее эффективные из них предназначены именно для вашего случая: квазиоднородные выборки. Основная идея состоит в том, чтобы намазывать источники с неравномерной выборкой на слегка более тонкую («передискретизированную») равномерную сетку, хотя местные свертки против гауссиан. Затем можно выполнить стандартное БПФ на равномерной сетке с избыточной дискретизацией, и тогда свертка с гауссианами может быть отменена. Хорошие реализации - это что-то вроде разы дороже, чем стандартное FFT в d измерениях, где C - что-то близкое к 4 или 5.CddC

Я рекомендую прочитать Ускорение неравномерного быстрого преобразования Фурье Грингарда и Ли.

O(NdlogN)

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

Джек Полсон
источник
9

При обработке сигналов псевдонимы исключаются путем отправки сигнала через фильтр нижних частот перед дискретизацией. Джек Полсон уже объяснил один метод для неоднородного БПФ, используя усеченные гауссианы в качестве фильтров нижних частот. Одна неудобная особенность усеченных гауссианов состоит в том, что даже после того, как вы определили интервал сетки для БПФ (= частота дискретизации при обработке сигнала), у вас все еще есть два свободных параметра: ширина гауссова и радиус усечения.

Поэтому я предпочитаю функцию "шляпа" с шириной двух ячеек сетки в качестве фильтра нижних частот. Это приводит к тому, что нулевой порядок Фурье является точным и что нижние порядки Фурье будут сходиться квадратично. Преобразование Фурье функции «шляпа» легко вычисляется (это квадрат функции sinc), что упрощает отмену свертки после БПФ. Обратите внимание, что функция "шляпа" - это свертка характеристической функции (центрированной) элементарной ячейки с самой собой. Любая желаемая скорость сходимости может быть достигнута путем свертки элементарной ячейки более одного раза с самим собой и использования результирующей функции вместо функции «шляпа».

Томас Климпел
источник
6

Если вы заинтересованы в программном обеспечении, я могу порекомендовать библиотеку NFFT (на языке C с интерфейсом для MATLAB), которую можно найти здесь . Обратите внимание, что есть также библиотека PFFT для параллельных вычислений FFT и даже библиотека PNFFT для параллельных неэквивалентных FFT тех же разработчиков .

кортик
источник
1
Насколько я знаю, PNFFT - самая быстрая библиотека для параллельных трехмерных неоднородных БПФ.
Джек Полсон
ссылка на PNFFT, кажется, не работает.
Foad
2

Дополнение к принятому ответу. Вот ссылка на реализацию метода Грингарда и Ли с открытым исходным кодом: https://finufft.readthedocs.io/en/latest/ Оболочки для C, fortran, MATLAB, octave и python. Я считаю, что FINUFFT написана на C ++.

Он поддерживается и используется в институте NYU Courant, SFU, Flatiron Institute (очевидно), Техасском университете в Остине и государственном университете штата Флорида. По крайней мере, это те, о которых я знаю.

Я сам использую старую версию, потому что я ленивый. См .: https://cims.nyu.edu/cmcl/nufft/nufft.html.

Raibyo
источник