Масштабирование выполняется gpu :: dft с помощью OpenCV в C ++ - PullRequest
3 голосов
/ 19 декабря 2011

Я хочу использовать алгоритм с GPU-ускорением, чтобы выполнить быстрый и экономящий память dft.Но когда я выполняю gpu::dft, матрица назначения масштабируется, как объяснено в документации .Как я могу избежать этой проблемы с масштабированием ширины до dft_size.width / 2 + 1?Кроме того, почему это масштабируется так?Мой код для DFT следующий:

cv::gpu::GpuMat d_in, d_out;
d_in = in;
d_out.create(d_in.size(), CV_32FC2 );
cv::gpu::dft( d_in, d_out, d_in.Size );

, где in - матрица CV_32FC1, что составляет 512x512.

Лучшим решением будет матрица назначения, которая имеет размерd_in.size и тип CV_32FC2.

Ответы [ 2 ]

4 голосов
/ 19 декабря 2011

Это связано с комплексной сопряженностью симметрии, присутствующей на выходе БПФ.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, поэтому вы потеряете некоторыепроизводительность с использованием комплексного вывода.

Надеюсь, это поможет!

0 голосов
/ 19 декабря 2011

Масштабирование выполняется для получения результата в диапазоне +/- 1.0. Это наиболее полезная форма для большинства приложений, которые должны иметь дело с частотным представлением данных. Для получения результата, который не масштабируется, просто не включайте флаг DFT_SCALE.

Редактировать

Ширина результата масштабируется, потому что она симметрична. Поэтому все, что вам нужно сделать, это добавить прежние значения симметричным образом.

Спектр симметричный, потому что при половине ширины выполняется теорема отсчетов. Например, ДПФ с 2048 точками для источника сигнала с частотой дискретизации 48 кГц может представлять значения только до 24 кГц, и это значение представлено на половине ширины.

Также для справки взгляните на Анализ спектра с использованием дискретного преобразования Фурье .

...