Как получить ВСЕ данные из 2D Real в Complex FFT в Cuda - PullRequest
1 голос
/ 03 мая 2011

Я пытаюсь сделать 2D-БПФ из реального в сложное с использованием CUFFT.

Я понимаю, что сделаю это и верну комплексные значения W / 2 + 1 (W - это "ширина" моего H* W матрица).

Вопрос в том, что если я захочу создать полную H * W версию этой матрицы после преобразования - как мне скопировать некоторые значения из H * (w /2 + 1) результат матрицы обратно в матрицу полного размера, чтобы получить обе части и значение DC в нужном месте

Спасибо

Ответы [ 3 ]

1 голос
/ 04 мая 2011

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

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

Из практики я заметил, что не так многоразница в скорости в любом случае.

1 голос
/ 06 мая 2011

Я на самом деле искал на форумах nVidia и нашел ядро, которое кто-то написал, которое сделало именно то, что я просил. Это то, что я использовал. если вы ищете на форуме cuda «избыточные результаты fft» или аналогичные, вы найдете его.

1 голос
/ 03 мая 2011

Я не знаком с CUDA, поэтому примите это во внимание при чтении моего ответа.Однако я знаком с БПФ и обработкой сигналов в целом.

Звучит так, как будто вы начинаете с матрицы H (строки) x W (столбцы), и что вы делаете 2D-БПФ, которое по существу выполняетБПФ на каждой строке, и вы получите матрицу H x W / 2 + 1.БПФ по ширине возвращает значения W, но функция CUDA возвращает только W / 2 + 1, потому что реальные данные даже в частотной области, поэтому отрицательные данные частоты являются избыточными.

Итак, если вы хотите воспроизвести недостающие точки W / 2-1, просто отразите положительную частоту.Например, если одна из строк выглядит следующим образом:

Индексные данные
0 12 + i
1 5 + 2i
2 6
3 2 - 3i
...

Индекс 0 - это ваша мощность постоянного тока, индекс 1 - самая низкая положительная частота, и так далее.Таким образом, вы сделаете свой ближайший к DC блок с отрицательной частотой 5 + 2i, следующий ближайший 6 и так далее.Где вы разместите эти значения в массиве, зависит от вас.Я бы сделал это так, как это делает Matlab, с данными отрицательной частоты после данных положительной частоты.

Надеюсь, это имеет смысл.

...