I want to do rotation of image in Fourier space. In order to get a more precise result, I do upsampling for 2 factor in real space and do fft2 to get a larger size fft image.
Then I input this larger size fft image to texture memory, and do a rotation. I want to get the original size fft image. So I do downsampling afterwards in texture. But the results are not right. If the rotation angle is 0, pi/2, pi …, the output is right . But other angles are wrong. The wrong outputs all have a wrong center of the fft image.
My code is just like this:
texture<float2, 2, cudaReadModeElementType> tex;
Rotation_CropKernel( float2* g_odata, int width, int height, float Rotangle)
// calculate normalized texture coordinates unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; unsigned int y = blockIdx.y*blockDim.y + threadIdx.y; float u = x / (float) width; // normalization float v = y / (float) height; // transform coordinates u -= 0.5f; v -= 0.5f;
float theta = Rotangle;
float tu = u*cosf(theta) + v*sinf(theta) ; //rotate counter clockwise float tv = -u*sinf(theta) + v*cosf(theta) ; tu = 2* (tu + 0.5f) ; //downsampling tv = 2* (tv + 0.5f) ; // read from texture and write to global memory if ((y<width/2)&&(x<height/2)) g_odata[(y*width/2)+ x] = tex2D(tex, tu, tv);
g_odata is an output memory in device. Its size is width/2 * height/2
I attach two results here. The original image size is 64*64.
I am a beginner in CUDA programming. I do not know how to solve this problem, maybe it comes from a silly mistake. Could anyone can help me? Thank you very much.