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 4

    sehe ich
    4 3
    2 1

    das ä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


Anmelden zum Antworten