Это связано с комплексной сопряженностью симметрии, присутствующей на выходе БПФ.Intel IPP имеет хорошее описание этой упаковки (такая же упаковка используется OpenCV).Функция OpenCV dft также описывает эту упаковку.
Итак, из документации gpu :: dft мы имеем:
Еслиисходная матрица сложна, а выходные данные не определены как реальные, целевая матрица является сложной и имеет размер dft_size и тип CV_32FC2.
Итак, убедитесь, что вы передали сложную матрицу в функцию gpu::dft
, если не хотите, чтобы она была упакована.Вам нужно будет установить второй канал на все нули:
Mat realData;
// ... get your real data...
Mat cplxData = Mat::zeros(realData.size(), realData.type());
vector<Mat> channels;
channels.push_back(realData);
channels.push_back(cplxData);
Mat fftInput;
merge(channels, fftInput);
GpuMat fftGpu(fftInput.size(), fftInput.type());
fftGpu.upload(fftInput);
// do the gpu::dft here...
Хотя есть предостережение ... вы получаете повышение производительности на 30-40% при использовании упакованных данных CCS, поэтому вы потеряете некоторыепроизводительность с использованием комплексного вывода.
Надеюсь, это поможет!