DSPRelated.com
Forums

FFTW pointwise multiplication

Started by tcharles December 14, 2006
I use FFTW to perform DFT and I have problem execute the pointwise
multiplication, here is my code 

fftw_complex * fft::multiply(fftw_complex * A, fftw_complex * B) {
fftw_complex * R;
double scale = 1.0 / (nx * ny);

R = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) *nx * ny);
for(int i= 0; i < nx; i++)
for(int j= 0; j < ny/2+1; j++){
int ij = i*(ny/2+1) + j;
R[i][j].re = (A[ij].re * B[ij].re
- A[ij].im * B[ij].im) * scale;
R[i][j].im = (A[ij].re * B[ij].im
+ A[ij].im * B[ij].re) * scale;
}
return(R);
}

I receive such fault:
fft_l.C:118: request for member `re' in `*((((i * 2) + j) * 8) + R)',
which is
of non-aggregate type `double'
fft_l.C:118: request for member `re' in `*(A + (+(ij * 16)))', which is
of
non-aggregate type `double[2]'
fft_l.C:119: request for member `re' in `*(B + (+(ij * 16)))', which is
of
non-aggregate type `double[2]'
fft_l.C:119: request for member `im' in `*(A + (+(ij * 16)))', which is
of
non-aggregate type `double[2]'
pleased can you tell me what wrong with my code
Thanks
tcharles wrote:
> I use FFTW to perform DFT and I have problem execute the pointwise > multiplication, here is my code > > fftw_complex * fft::multiply(fftw_complex * A, fftw_complex * B) { > fftw_complex * R; > double scale = 1.0 / (nx * ny); > > R = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) *nx * ny); > for(int i= 0; i < nx; i++) > for(int j= 0; j < ny/2+1; j++){ > int ij = i*(ny/2+1) + j; > R[i][j].re = (A[ij].re * B[ij].re > - A[ij].im * B[ij].im) * scale; > R[i][j].im = (A[ij].re * B[ij].im > + A[ij].im * B[ij].re) * scale; > } > return(R); > } > > I receive such fault: > fft_l.C:118: request for member `re' in `*((((i * 2) + j) * 8) + R)', > which is > of non-aggregate type `double' > fft_l.C:118: request for member `re' in `*(A + (+(ij * 16)))', which is > of > non-aggregate type `double[2]' > fft_l.C:119: request for member `re' in `*(B + (+(ij * 16)))', which is > of > non-aggregate type `double[2]' > fft_l.C:119: request for member `im' in `*(A + (+(ij * 16)))', which is > of > non-aggregate type `double[2]' > pleased can you tell me what wrong with my code > Thanks
The problem is that the default FFTW interface has the following definition for the fftw_complex type: typedef double fftw_complex[2]; So, a fftw_complex is really just an array of two doubles, not a structure, so you can't treat it as if it has real and imaginary part members .re and .im. Use indices [0] and [1] instead. http://www.fftw.org/fftw3_doc/Complex-numbers.html Jason