<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[FFTW: Verschobene Werte, Datentypen]]></title><description><![CDATA[<p>Ich habe mir für FFTW einen Wrapper gebastelt der inzwischen auch sehr schön FFTs rechnet. Allerdings habe ich damit zwei Probleme.</p>
<pre><code class="language-cpp">void CFFTW::FFT2D(CComplex* InArray, CComplex* OutArray)
{		
	if (m_Init != true)
		return;		

	for (int ix=0; ix &lt; m_size.x; ix++)
	{
		for (int iy=0; iy &lt; 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 &lt; m_size.x; ix++)
	{
		for (int iy=0; iy &lt; 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);
}
</code></pre>
<p>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.<br />
1. Kann man das effizienter machen<br />
2. Wenn ich CComplex von std::Complex ableiten würde könnte ich dann das Array direkt verwenden obwohl es den Typ CComplex hat ?</p>
<p>Zum anderen wird das Ergebnis der FFT verschoben dargestellt, also statt<br />
1 2<br />
3 4</p>
<p>sehe ich<br />
4 3<br />
2 1</p>
<p>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.</p>
<pre><code class="language-cpp">// *********************************
// 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&gt;=N) del-=N;
	if (del&lt;=-N) del+=N;

	if(del&gt;0 &amp;&amp; del&lt;N)
	{
		for (i=N-del;i&lt;N;i++)	D[i-N+del]=A1[i];
		for (i=N-1;i&gt;=del;i--) A1[i]=A1[i-del];
		for (i=0;i&lt;del;i++)	A1[i]=D[i];
	}
	else if(del&lt;0	&amp;&amp;	del &gt; -N)
	{
		del=-del;
		for (i=0;i&lt;del;i++)	D[i]=A1[i];
		for (i=0;i&lt;N-del;i++) A1[i]=A1[i+del];
		for (i=N-del;i&lt;N;i++) A1[i]=D[i-N+del];
	}
	delete [] D;
}

// **************************************
// 1 2      4 3
// 3 4  -&gt;  2 1
// **************************************

void CFFTW::Cycle2D(CComplex *A,long N)  
{						
CComplex swap;						
long ix,iy;						

	for (ix=0;ix&lt;N;ix++)	Cycle(A+ix*N,N);	// Spalten shiften 
	for (iy=0;iy&lt;N;iy++)	// Zeilen einzeln shiften
		for (ix=0;ix&lt;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;
		}
}
</code></pre>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182866/fftw-verschobene-werte-datentypen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 01:58:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182866.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 May 2007 08:45:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to FFTW: Verschobene Werte, Datentypen on Wed, 30 May 2007 08:45:43 GMT]]></title><description><![CDATA[<p>Ich habe mir für FFTW einen Wrapper gebastelt der inzwischen auch sehr schön FFTs rechnet. Allerdings habe ich damit zwei Probleme.</p>
<pre><code class="language-cpp">void CFFTW::FFT2D(CComplex* InArray, CComplex* OutArray)
{		
	if (m_Init != true)
		return;		

	for (int ix=0; ix &lt; m_size.x; ix++)
	{
		for (int iy=0; iy &lt; 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 &lt; m_size.x; ix++)
	{
		for (int iy=0; iy &lt; 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);
}
</code></pre>
<p>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.<br />
1. Kann man das effizienter machen<br />
2. Wenn ich CComplex von std::Complex ableiten würde könnte ich dann das Array direkt verwenden obwohl es den Typ CComplex hat ?</p>
<p>Zum anderen wird das Ergebnis der FFT verschoben dargestellt, also statt<br />
1 2<br />
3 4</p>
<p>sehe ich<br />
4 3<br />
2 1</p>
<p>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.</p>
<pre><code class="language-cpp">// *********************************
// 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&gt;=N) del-=N;
	if (del&lt;=-N) del+=N;

	if(del&gt;0 &amp;&amp; del&lt;N)
	{
		for (i=N-del;i&lt;N;i++)	D[i-N+del]=A1[i];
		for (i=N-1;i&gt;=del;i--) A1[i]=A1[i-del];
		for (i=0;i&lt;del;i++)	A1[i]=D[i];
	}
	else if(del&lt;0	&amp;&amp;	del &gt; -N)
	{
		del=-del;
		for (i=0;i&lt;del;i++)	D[i]=A1[i];
		for (i=0;i&lt;N-del;i++) A1[i]=A1[i+del];
		for (i=N-del;i&lt;N;i++) A1[i]=D[i-N+del];
	}
	delete [] D;
}

// **************************************
// 1 2      4 3
// 3 4  -&gt;  2 1
// **************************************

void CFFTW::Cycle2D(CComplex *A,long N)  
{						
CComplex swap;						
long ix,iy;						

	for (ix=0;ix&lt;N;ix++)	Cycle(A+ix*N,N);	// Spalten shiften 
	for (iy=0;iy&lt;N;iy++)	// Zeilen einzeln shiften
		for (ix=0;ix&lt;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;
		}
}
</code></pre>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295004</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Wed, 30 May 2007 08:45:43 GMT</pubDate></item></channel></rss>