gpt4 book ai didi

c - C 中的二维傅里叶变换

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:12 24 4
gpt4 key购买 nike

我使用此站点中的方程式实现了 2D DFT 和 IDFT 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 范围内的像素。我做错了什么?

额外信息:

  • inImage 和 DFTImages 只是构建普通 *.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 中的二维傅里叶变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38542412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com