Комплексные числа и простое преобразование Фурье (C++)

Я пытаюсь заставить работать преобразования Фурье, я должен сделать это для задания, и я думаю, что у меня есть это там, где оно должно работать, и я не уверен, почему это не так. Я думаю, что это как-то связано с комплексными числами, поскольку здесь задействовано «i». Я просмотрел много ссылок и понимаю формулу, но у меня проблемы с ее программированием. это то, что у меня есть до сих пор

void NaiveDFT::Apply( Image & img )
{
    //make the fourier transform using the naive method and set that to the image.
    Image dft(img);
    Pixel ** dftData = dft.GetImageData();
    Pixel ** imgData = img.GetImageData();
    for(unsigned u = 0; u < img.GetWidth(); ++u)
    {
        for(unsigned v = 0; v < img.GetHeight(); ++v)
        {
            std::complex<double> sum = 0;
            for(unsigned x = 0; x < img.GetWidth(); ++x)
            {
                for(unsigned y = 0; y < img.GetHeight(); ++y)
                {
                    std::complex<double> i = sqrt(std::complex<double>(-1));
                    std::complex<double> theta = 2 * M_PI * (((u * x) / img.GetWidth()) + ((v * y) / img.GetHeight()));
                    sum += std::complex<double>(imgData[x][y]._red) * cos(theta) + (-i * sin(theta));
                    //sum += std::complex<double>(std::complex<double>(imgData[x][y]._red) * pow(EULER, -i * theta));

                }
            }
            dftData[u][v] = (sum.imag() / (img.GetWidth() * img.GetHeight()));
        }
    }
    img = dft;
}

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

Я также пробовал сумму e ^ (-i * 2 * PI * (x * u * ширина + y * v * высота) * 1/ширина * высота, которая дает тот же результат, что и ожидалось, хотя это все еще не желаемое выход.

Я также пробовал число sum.real(), и это тоже не выглядит правильно.

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

Спасибо.


person user2013535    schedule 18.11.2013    source источник
comment
i это всего лишь std::complex< >(0,1).   -  person MSalters    schedule 18.11.2013


Ответы (1)


Я думаю, что может быть проблема во время умножения со сложным членом. Линия:

sum += std::complex<double>(imgData[x][y]._red) * cos(theta) + (-i * sin(theta));

должно быть:

sum += std::complex<double>(imgData[x][y]._red) * ( cos(theta) + -i * sin(theta));

Кроме того, при вычислении тета вам нужно использовать двойную точность:

std::complex<double> theta = 2 * M_PI * ((((double)u * x) / (double)(img.GetWidth())) + (((double)v * y) / (double)(img.GetHeight())));
person fatihk    schedule 18.11.2013
comment
Спасибо за ответ. Я попробовал это, и я получаю тот же результат. Я думаю, что это как-то связано с умножением на сложный член. imgData[x][y]._red — это число с плавающей запятой, изображение имеет только оттенки серого, поэтому все значения цвета должны быть одинаковыми, поэтому я использую только красное значение. я также использую значения без знака для вычисления тета, и я не уверен, что это не так. - person user2013535; 18.11.2013
comment
применив эти вещи к двойнику, они выглядели по-другому! но я пока не думаю, что это правильно. Благодарность! - person user2013535; 18.11.2013
comment
@user2013535, user2013535, интерпретация fft изображения сложна, если просто посмотреть. Обычно вы должны видеть несколько светлых областей по углам и темные области посередине. - person fatihk; 18.11.2013
comment
да, я вижу кое-что, но я тестирую изображение, результат которого мне известен, оно выглядит близко, так что, может быть, я правильно понял? я не совсем уверен - person user2013535; 18.11.2013
comment
@user2013535 user2013535, возможно, это правильно, если вы возьмете обратное БПФ, вы должны получить исходное изображение. Это критерий. - person fatihk; 18.11.2013
comment
Я взял инверсию и применил это, и я получил изображение, близкое к оригиналу, но не совсем. это выглядело так, как будто была копия, повернутая на 180 градусов и переведенная вниз и вправо. - person user2013535; 19.11.2013