FFTW: Verschobene Werte, Datentypen
-
Ich habe mir für FFTW einen Wrapper gebastelt der inzwischen auch sehr schön FFTs rechnet. Allerdings habe ich damit zwei Probleme.
void CFFTW::FFT2D(CComplex* InArray, CComplex* OutArray) { if (m_Init != true) return; for (int ix=0; ix < m_size.x; ix++) { for (int iy=0; iy < m_size.y; iy++) { in[ArrPos(ix,iy)][0] = InArray[ArrPos(ix,iy)].re; in[ArrPos(ix,iy)][1] = InArray[ArrPos(ix,iy)].im; } } fftw_execute(plan); for (int ix=0; ix < m_size.x; ix++) { for (int iy=0; iy < m_size.y; iy++) { OutArray[ArrPos(ix,iy)].re = out[ArrPos(ix,iy)][0]; OutArray[ArrPos(ix,iy)].im = out[ArrPos(ix,iy)][1]; } } Cycle2D(OutArray, m_size.x); }Zum einen habe ich eine Klasse CComplex die nicht gleich std::Complex ist. Daher kopiere ich im Moment die Arrays mit den for Schleifen um.
1. Kann man das effizienter machen
2. Wenn ich CComplex von std::Complex ableiten würde könnte ich dann das Array direkt verwenden obwohl es den Typ CComplex hat ?Zum anderen wird das Ergebnis der FFT verschoben dargestellt, also statt
1 2
3 4sehe ich
4 3
2 1das ändere ich mit Cycle2D - auch hier wäre die Frage ob man das schneller bewerkstelligen könnte, bzw warum die FFT das so ausgibt.
// ********************************* // Cycle changes 012 345 to 345 012 // ********************************* void CFFTW::Cycle(CComplex *A1,long N) { Cycle(A1,N,N/2); } void CFFTW::Cycle(CComplex *A1,long N,long del) { long i; CComplex *D; D=new CComplex [N]; if (del>=N) del-=N; if (del<=-N) del+=N; if(del>0 && del<N) { for (i=N-del;i<N;i++) D[i-N+del]=A1[i]; for (i=N-1;i>=del;i--) A1[i]=A1[i-del]; for (i=0;i<del;i++) A1[i]=D[i]; } else if(del<0 && del > -N) { del=-del; for (i=0;i<del;i++) D[i]=A1[i]; for (i=0;i<N-del;i++) A1[i]=A1[i+del]; for (i=N-del;i<N;i++) A1[i]=D[i-N+del]; } delete [] D; } // ************************************** // 1 2 4 3 // 3 4 -> 2 1 // ************************************** void CFFTW::Cycle2D(CComplex *A,long N) { CComplex swap; long ix,iy; for (ix=0;ix<N;ix++) Cycle(A+ix*N,N); // Spalten shiften for (iy=0;iy<N;iy++) // Zeilen einzeln shiften for (ix=0;ix<N/2;ix++) { swap=A[(ix+N/2)*N+iy]; A[(ix+N/2)*N+iy]=A[ix*N+iy]; A[ix*N+iy]=swap; } }Matthias