2016-07-23 3 views
2

Я реализовал 2D DFT и IDFT, используя уравнение с этого сайта http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Я думаю, что это правильно и хорошо объяснено. реализация выглядит следующим образом:2D преобразование Фурье в C

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 (ак * ак + Ьк * Б.К.)) не смотрит, как должно, и восстановление изображения (не обращая внимания на мнимые части) не делает ничего рядом с оригиналом образ. Более того, пиксель в [0] [0] имеет чрезвычайно высокое значение, а ни один пиксель не находится в диапазоне от 0 до 255 в качестве исходного. Что я делаю не так?

Дополнительная информация:

  • inImage и DFTImages только STRUCT из которых oridinary * .pgm изображения являются construted, сохранение и загрузка изображений работы,
  • я не могу использовать любые классы (как мнимых чисел), так как это реализация будет на стороне GPU,

Благодаря

+1

Вы должны выполнить некоторую отладку. –

+2

@squeamishossifrage: Почему компилятор предупреждает о преобразовании в тип с более высокой точностью? Также '-Wall' не включает (все) преобразования. – Olaf

+0

что-то не так с моей реализацией? – Kedriik

ответ

0

я нашел решение для моей проблемы. Это была просто проблема индексации. Используйте 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; 
    } 
} 
Смежные вопросы