коэффициент масштабирования для CUFFT - PullRequest
6 голосов
/ 10 марта 2011

Я написал простую тестовую программу, в которой я выполнял сложную и сложную FT, и я просто сгенерировал некоторые данные 1..50 и вставил их в вещественную и мнимую части для каждого индекса массива.

Когда я выполняю такую ​​операцию, как IFFT (FFT (A)) = A

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

БПФ, мне нужно разделить вывод на len (A), чтобы вернуть оригинал A

Однако, продвигаясь вперед, затем переворачивая FFT с помощью CUFFT, похоже, мне нужно разделить на (sqrt (2) * 50), чтобы вернуться к исходным данным.

Откуда берется этот дополнительный квадратный корень?

согласно документации CUFFT: CUFFT выполняет ненормализованные FFT; то есть, выполняя форвард БПФ на входном наборе данных с последующим обратным БПФ на результирующем набор дает данные, которые равны входу, масштабированному по количеству элементы. Масштабирование либо преобразование на обратную величину размера набор данных оставлен для пользователя, чтобы работать как считает нужным.

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 24 июня 2011

CUFFT имеет то же поведение, что и FFTW, он вычисляет ненормализованные FFT.IFFT(FFT(A))=n A где n - длина вектора.Длина n указана в количестве выборок (не с плавающей запятой или байтов)Между FFTW и CUFFT с C2R и R2C есть некоторые различия в заполнении, которые могут испортить простое сравнение, но не для C2C.Я бы дважды проверил ваши настройки данных и расчеты длины и проверил ваш план как в FFTW, так и в CUFFT.

1 голос
/ 13 июля 2011

В результате возникла проблема со способом вычисления абсолютных значений комплексного числа. в библиотеке std :: complex это вычисляло расстояние вектора.

...