我用这个站点的公式实现了2ddft和I DFT
http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm
我认为这些都是正确的,解释得很好。
实现方式如下:

    for(int i=0;i<inImage.width;i++)
    {
     for(int j=0;j<inImage.height;j++)
     {
      float ak=0;
      float bk=0;
          for(int ii=0;ii<inImage.width;ii++)
           {
             for(int jj=0;jj<inImage.height;jj++)
              {

               float x=-2.0*PI*i*ii/(float)inImage.width;
               float y=-2.0*PI*j*jj/(float)inImage.height;
            // ak+=inImage.pixels[i][j]*(cos(x)*cos(y)-sin(x)*sin(y));
           //  bk+=inImage.pixels[i][j]*(sin(x)*cos(y)+sin(y)*cos(x));
               ak+=inImage.pixels[i][j]*cos(x+y);
               bk+=inImage.pixels[i][j]*1.0*sin(x+y);
             }
           }
     DFTImageRE.pixels[i][j]=ak;
     DFTImageIM.pixels[i][j]=bk;
       }
     }

频域(sqrt(ak*ak+bk*bk))看起来不像它应该的那样,图像重建(忽略虚部)不会在原始图像附近产生任何东西[0][0]处的更多像素具有极高的值,没有像素的范围从0到255我做错什么了?
额外信息:
图像和DFT图像只是构造原始*.pgm图像的结构,保存和加载图像是有效的,
我不能使用任何类(比如虚数),因为这个实现是在GPU端的,
谢谢

最佳答案

我找到了解决问题的办法这只是索引问题。使用ii和jj求和,得到傅里叶变换

   for(int i=0;i<inImage.width;i++)
{
 for(int j=0;j<inImage.height;j++)
 {
  float ak=0;
  float bk=0;
      for(int ii=0;ii<inImage.width;ii++)
       {
         for(int jj=0;jj<inImage.height;jj++)
          {

           float x=-2.0*PI*i*ii/(float)inImage.width;
           float y=-2.0*PI*j*jj/(float)inImage.height;
           ak+=inImage.pixels[ii][jj]*cos(x+y);
           bk+=inImage.pixels[ii][jj]*1.0*sin(x+y);
         }
       }
 DFTImageRE.pixels[i][j]=ak;
 DFTImageIM.pixels[i][j]=bk;
   }
 }

关于c - C中的2D傅立叶变换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38542412/

10-10 12:42