CUDA CUFFT / IFFT Различные результаты, если я дополню свои данные? - PullRequest
0 голосов
/ 11 мая 2019

У меня есть сигнал, что я выполняю БПФ, выполняю свертку с самим собой, а затем выполняю IFFT обратно во временную область.Сигнал длиной 8192.Если я добавлю сигнал на 16384 (N * 2) и выполню операции, я получу правильный вывод.Однако нужно ли это?Но когда я пытаюсь придерживаться 8192, используя преобразования FFT C2C, я получаю схожие данные вплоть до IFFT.(При использовании 8192 он имеет только каждую 2-ю точку из данных 16384).

Я выполнил это через matlab и получил те же результаты, поэтому я подозреваю, что это больше связано с математикой, чем с реализацией, но какЯ делаю это в cuda, любые советы приветствуются, я не возражаю против необходимости дополнять данные в некоторой форме, если это необходимо, но данные в порядке вплоть до того момента, когда я выполняю IFFT.

NB Iзнаю, что я не делаю все вычисления на GPU, это было просто для того, чтобы убрать ошибки и позволить мне увидеть, что делал код.

Ссылка на код: http://pasted.co/e2e5e625

Эточто я должен получить This is what i should get

Это то, что я получу, если не набиваю.enter image description here

1 Ответ

2 голосов
/ 12 мая 2019

У меня есть сигнал, что я выполняю БПФ, выполняю свертку с самим собой, а затем выполняю IFFT назад во временную область.

Глядя на ваш код, вы неделать «свертку с самим собой» в частотной области, а скорее умножение само по себе.

Вся последовательность операций (FFT, умножение, IFFT) будет соответствовать вычислению циклической свертки сигнала с самим собой во временной области.Циркулярная свертка будет эквивалентна линейной свертке только в том случае, если сигнал сначала дополняется до длины не менее 2*N-1 (что соответствует минимальному размеру, необходимому для хранения всех коэффициентов линейной свертки после IFFT).

Вы можете использовать меньший размер БПФ (т. Е. Меньше, чем 2*N-1, но, по крайней мере, N) для вычисления линейной свертки, используя метод наложения-сложения .

...