Обратный Дискретный Фурье

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

void DiscreteFourier2D::reconstruct(
int M, int N,
std::complex<float> const *spectrum,
std::complex<float> *reconstruction) {

float A = (1.f / sqrt(M * N));
for (int k = 0; k <= M - 1; k++) {
for (int l = 0; l <= N - 1; l++) {

std::complex<float> total(0.f, 0.f);

for (int m = 0; m <= M - 1; m++) {
for (int n = 0; n <= N - 1; n++) {
//std::complex<float> fourier = spectrum[m * (M) + n];
std::complex<float> fourier = *spectrum;
spectrum++;
std::complex<float> i(0.f, 1.f);
float mM = (float) m / (float) M;
float nN = (float) n / (float) N;
float e_1 = 2.f * M_PI * k * (mM - 0.5);
float e_2 = 2.f * M_PI * l * (nN - 0.5);
total += fourier * exp(e_1 * i) * exp(e_2 * i);
}
}

reconstruction[(k*M)+l]=total*A;
//(*reconstruction) = A * total;
//reconstruction++;
}
}
}

Выходное изображение в оттенках серого

Вывод выглядит так, как будто правильные значения пикселей рассчитаны, но сохранены в неправильной позиции.
Оба указателя, переданные методу, указывают на объект Vector, который имеет одинаковый размер и находится в макете мэра строки. Значит, формула индекса (k * M + l) должна быть верной?

M — ширина, N — высота изображения.

Спасибо!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]