реализация DFT в C ++ - PullRequest
       13

реализация DFT в C ++

4 голосов
/ 09 января 2012


Я хочу реализовать DFT на C ++ языке для обработки изображений .
formula for 1D DFT
Когда я изучал теорию, я узнал, что я могу разделить 2D DFT на две 1D DFT части. Во-первых, для каждой строки я выполняю 1D DFT, затем я делаю это для каждого столбца. Конечно, я должен сделать операции на комплексных числах .
Здесь возникают некоторые проблемы, потому что я не уверен, где использовать реальные, а где мнимая часть комплексного числа. Я где-то обнаружил, что значения пикселей входного изображения я должен рассматривать как реальную часть, а мнимую часть установить как 0.
Я сделал реализацию этого, но я полагаю, что изображение результата неверно.
lenaclenac_dft
Я был бы признателен, если бы кто-то мог помочь мне с этим.

Для чтения и сохранения изображений я использую библиотеку CImg.

void DFT (CImg<unsigned char> image)
{
    int w=512;
    int h=512;
    int rgb=3;
    complex <double> ***obrazek=new complex <double>**[w];
    for (int b=0;b<w;b++) //making 3-dimensional table to store DFT values
    {
        obrazek[b]=new complex <double>*[h];
        for (int a=0;a<h;a++)
        {
            obrazek[b][a]=new complex <double>[rgb];
        }
    }

    CImg<unsigned char> kopia(image.width(),image.height(),1,3,0);

    complex<double> sum=0;
    complex<double> sum2=0;
    double pi = 3.14;

    for (int i=0; i<512; i++){
    for (int j=0; j<512; j++){
    for (int c=0; c<3; c++){
        complex<double> cplx(image(i,j,c), 0);
        obrazek[i][j][c]=cplx;
    }}}

    for (int c=0; c<3; c++) //for rows
    {
            for (int y=0; y<512; y++)
            {
                sum=0;
                for (int x=0; x<512; x++)
                {
                    sum+=(obrazek[x][y][c].real())*cos((2*pi*x*y)/512)-(obrazek[x][y][c].imag())*sin((2*pi*x*y)/512);
                    obrazek[x][y][c]=sum;
                }
            }
    }

    for (int c=0; c<3; c++) //for columns
    {
            for (int y=0; y<512; y++)//r
            {
                sum2=0;
                for (int x=0; x<512; x++)
                {
                    sum2+=(obrazek[y][x][c].real())*cos((2*pi*x*y)/512)-(obrazek[y][x][c].imag())*sin((2*pi*x*y)/512);
                    obrazek[y][x][c]=sum2;
                }
            }
    }

    for (int i=0; i<512; i++){
    for (int j=0; j<512; j++){
    for (int c=0; c<3; c++){
        kopia(i,j,c)=obrazek[i][j][c].real();
    }}}

    CImgDisplay image_disp(kopia,"dft");

    while (!image_disp.is_closed() )
    {

        image_disp.wait();

    }
    saving(kopia);
}

Ответы [ 2 ]

0 голосов
/ 10 января 2012

Я предлагаю использовать пакет БПФ от Ooura:

http://www.kurims.kyoto -u.ac.jp / ~ ooura / fft.html

Это доказано годамииспользования в моих аудио-приложениях и быстро, как ад!

0 голосов
/ 10 января 2012

Посмотрите на эту страницу. Это может быть полезно:
http://paulbourke.net/miscellaneous/dft/

Есть реализация DFT (около 40 строк).

...