Я реализовал 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,
Благодаря
Вы должны выполнить некоторую отладку. –
@squeamishossifrage: Почему компилятор предупреждает о преобразовании в тип с более высокой точностью? Также '-Wall' не включает (все) преобразования. – Olaf
что-то не так с моей реализацией? – Kedriik