<?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[Bug in FFT-Routine]]></title><description><![CDATA[<p>Hallo Leute<br />
Ich habe mich nun seit einiger Zeit mit dem FFT beschäftigt. Um mit meinem rechner den fft benützen zu können habe ich die funktionen von <a href="http://teacher.schule.at/krammer/mist.htm" rel="nofollow">http://teacher.schule.at/krammer/mist.htm</a> heruntergeladen. danach habe ich den code nach c++ portiert, damit ich das selbe auch auf meinem PC machen kann.<br />
Nun ist mein problem, dass die Resultate von denen meines rechners abweichen. es muss sich beim portieren ein fehler eingeschleicht haben, den ich nicht finde.</p>
<p>hier ist der code in c++ (sorry wegen dem etwas chaotischen stil):</p>
<pre><code class="language-cpp">void fft(unsigned const int n, double *inreal, double *inimag);
void fftw(unsigned int anz, double *wreal, double *wimag);
void fftrev(unsigned const int n, double *inreal, double *inimag);

void fft(unsigned const int n, double *inreal, double *inimag)
{
	fftrev(n, inreal, inimag);

	int a = 1;
	int b = n;
	int d = 0, c = 0, i = 0, k = 0;
	double t;

	double *wreal = new double[n/2];
	double *wimag = new double[n/2];
	fftw(n, wreal, wimag);

	while (a&lt;n)
	{
		c = a+a;
		b = b/2;
		d = 1;
		for (int m = 1; m&lt;=a; m++)
		{
			i = m;
			while (i&lt;=n)
			{
				k = i+a;
				t = wreal[d-1]*inreal[k-1];
				inreal[k-1] = inreal[i-1]-t;
				inreal[i-1] = inreal[i-1]+t;

				t = wimag[d-1]*inimag[k-1];
				inimag[k-1] = inimag[i-1]-t;
				inimag[i-1] = inimag[i-1]+t;

				i = i+c;
			}
			d = d+b;
		}
		a = c;
	}
	for (i=0; i&lt;n;i++)
	{
		inreal[i] = inreal[i]/(n);
		inimag[i] = inimag[i]/(n);
	}
	delete wreal;
	delete wimag;
}

void fftrev(unsigned const int n, double *inreal, double *inimag)
{
	unsigned int i;
	unsigned int j=1;
	unsigned int m=0;

	double temp;

	for (i=1; i&lt;n; i++)
	{
		if(j&gt;i)
		{
			temp = inreal[j-1];
			inreal[j-1] = inreal[i-1];
			inreal[i-1] = temp;

			temp = inimag[j-1];
			inimag[j-1] = inimag[i-1];
			inimag[i-1] = temp;
		}
		m = n/2;
		while (m&gt;=2 &amp;&amp; j&gt;m)
		{
			j = j-m;
			m = m/2;
		}
		j = j+m;
	}
}

void fftw(unsigned int anz, double *wreal, double *wimag)
{
	/*anz ist die Anzahl Elemente. 
	Es gibt doch bloss anz/2 Elemente bei wreal und wimag. 
	Für den IFFT muss wimag mit -1 multipliziert werden.*/

	unsigned int i;
	double c;
	const double PI = 3.1415926535;

	anz = anz/2.0;
	c = PI/anz;

	for (i=0;i&lt;anz; i++)
	{
		wreal[i] = cos(c*i);
		wimag[i] = -sin(c*i);
	}
}
</code></pre>
<p>ich habe also 3 funktionen. fftw verlangt die anzahl elemente und 2 zeiger auf ein array mit double werten. diese werte werden dann geschrieben und stellen den realteil und den imaginärteil der drehwerte dar.</p>
<p>fftrev ist zuständig für das bitreversing.</p>
<p>fft ist die hauptfunktion.</p>
<p>ich habe bereits etwas herumexperimentiert und die werte aus fftrev und fftw sind fehlerfrei.<br />
wenn ich in der fft-funktion das:</p>
<pre><code class="language-cpp">k = i+a;
				t = wreal[d-1]*inreal[k-1];
				inreal[k-1] = inreal[i-1]-t;
				inreal[i-1] = inreal[i-1]+t;

				t = wimag[d-1]*inimag[k-1];
				inimag[k-1] = inimag[i-1]-t;
				inimag[i-1] = inimag[i-1]+t;
</code></pre>
<p>zu:</p>
<pre><code class="language-cpp">k = i+a;
				t = 1.0*inreal[k-1];
				inreal[k-1] = inreal[i-1]-t;
				inreal[i-1] = inreal[i-1]+t;

				t = 1.0*inimag[k-1];
				inimag[k-1] = inimag[i-1]-t;
				inimag[i-1] = inimag[i-1]+t;
</code></pre>
<p>ändere sind die resultate die selben wie auf meinem rechner(der code auf dem rechner wurde auch dementsprechend verändert).</p>
<p>der fehler muss also in dieser multiplikation sein. inreal[] und inimag[] sind die einganswerte und diese sind logischerweise nicht für den fehler verantwortlich.</p>
<p>ich vermute, dass vielleicht rundungsfehler entstehen und diese ausreichen um meine resultate dementsprechend zu verfälschen.</p>
<p>seht ihr gerade woran es liegt?<br />
danke vielmals für die hilfe!<br />
grs Grave</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171846/bug-in-fft-routine</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Jul 2026 11:16:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171846.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Jan 2007 22:12:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bug in FFT-Routine on Mon, 29 Jan 2007 22:12:28 GMT]]></title><description><![CDATA[<p>Hallo Leute<br />
Ich habe mich nun seit einiger Zeit mit dem FFT beschäftigt. Um mit meinem rechner den fft benützen zu können habe ich die funktionen von <a href="http://teacher.schule.at/krammer/mist.htm" rel="nofollow">http://teacher.schule.at/krammer/mist.htm</a> heruntergeladen. danach habe ich den code nach c++ portiert, damit ich das selbe auch auf meinem PC machen kann.<br />
Nun ist mein problem, dass die Resultate von denen meines rechners abweichen. es muss sich beim portieren ein fehler eingeschleicht haben, den ich nicht finde.</p>
<p>hier ist der code in c++ (sorry wegen dem etwas chaotischen stil):</p>
<pre><code class="language-cpp">void fft(unsigned const int n, double *inreal, double *inimag);
void fftw(unsigned int anz, double *wreal, double *wimag);
void fftrev(unsigned const int n, double *inreal, double *inimag);

void fft(unsigned const int n, double *inreal, double *inimag)
{
	fftrev(n, inreal, inimag);

	int a = 1;
	int b = n;
	int d = 0, c = 0, i = 0, k = 0;
	double t;

	double *wreal = new double[n/2];
	double *wimag = new double[n/2];
	fftw(n, wreal, wimag);

	while (a&lt;n)
	{
		c = a+a;
		b = b/2;
		d = 1;
		for (int m = 1; m&lt;=a; m++)
		{
			i = m;
			while (i&lt;=n)
			{
				k = i+a;
				t = wreal[d-1]*inreal[k-1];
				inreal[k-1] = inreal[i-1]-t;
				inreal[i-1] = inreal[i-1]+t;

				t = wimag[d-1]*inimag[k-1];
				inimag[k-1] = inimag[i-1]-t;
				inimag[i-1] = inimag[i-1]+t;

				i = i+c;
			}
			d = d+b;
		}
		a = c;
	}
	for (i=0; i&lt;n;i++)
	{
		inreal[i] = inreal[i]/(n);
		inimag[i] = inimag[i]/(n);
	}
	delete wreal;
	delete wimag;
}

void fftrev(unsigned const int n, double *inreal, double *inimag)
{
	unsigned int i;
	unsigned int j=1;
	unsigned int m=0;

	double temp;

	for (i=1; i&lt;n; i++)
	{
		if(j&gt;i)
		{
			temp = inreal[j-1];
			inreal[j-1] = inreal[i-1];
			inreal[i-1] = temp;

			temp = inimag[j-1];
			inimag[j-1] = inimag[i-1];
			inimag[i-1] = temp;
		}
		m = n/2;
		while (m&gt;=2 &amp;&amp; j&gt;m)
		{
			j = j-m;
			m = m/2;
		}
		j = j+m;
	}
}

void fftw(unsigned int anz, double *wreal, double *wimag)
{
	/*anz ist die Anzahl Elemente. 
	Es gibt doch bloss anz/2 Elemente bei wreal und wimag. 
	Für den IFFT muss wimag mit -1 multipliziert werden.*/

	unsigned int i;
	double c;
	const double PI = 3.1415926535;

	anz = anz/2.0;
	c = PI/anz;

	for (i=0;i&lt;anz; i++)
	{
		wreal[i] = cos(c*i);
		wimag[i] = -sin(c*i);
	}
}
</code></pre>
<p>ich habe also 3 funktionen. fftw verlangt die anzahl elemente und 2 zeiger auf ein array mit double werten. diese werte werden dann geschrieben und stellen den realteil und den imaginärteil der drehwerte dar.</p>
<p>fftrev ist zuständig für das bitreversing.</p>
<p>fft ist die hauptfunktion.</p>
<p>ich habe bereits etwas herumexperimentiert und die werte aus fftrev und fftw sind fehlerfrei.<br />
wenn ich in der fft-funktion das:</p>
<pre><code class="language-cpp">k = i+a;
				t = wreal[d-1]*inreal[k-1];
				inreal[k-1] = inreal[i-1]-t;
				inreal[i-1] = inreal[i-1]+t;

				t = wimag[d-1]*inimag[k-1];
				inimag[k-1] = inimag[i-1]-t;
				inimag[i-1] = inimag[i-1]+t;
</code></pre>
<p>zu:</p>
<pre><code class="language-cpp">k = i+a;
				t = 1.0*inreal[k-1];
				inreal[k-1] = inreal[i-1]-t;
				inreal[i-1] = inreal[i-1]+t;

				t = 1.0*inimag[k-1];
				inimag[k-1] = inimag[i-1]-t;
				inimag[i-1] = inimag[i-1]+t;
</code></pre>
<p>ändere sind die resultate die selben wie auf meinem rechner(der code auf dem rechner wurde auch dementsprechend verändert).</p>
<p>der fehler muss also in dieser multiplikation sein. inreal[] und inimag[] sind die einganswerte und diese sind logischerweise nicht für den fehler verantwortlich.</p>
<p>ich vermute, dass vielleicht rundungsfehler entstehen und diese ausreichen um meine resultate dementsprechend zu verfälschen.</p>
<p>seht ihr gerade woran es liegt?<br />
danke vielmals für die hilfe!<br />
grs Grave</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219477</guid><dc:creator><![CDATA[GraveCH]]></dc:creator><pubDate>Mon, 29 Jan 2007 22:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to Bug in FFT-Routine on Wed, 31 Jan 2007 18:24:06 GMT]]></title><description><![CDATA[<p>das problem hat sich erledigt.<br />
da es beim fft eine KOMPLEXE multiplikation benötigt kann ich nicht sagen, dass x*y = real(x)*real(y) + imag(x)*imag(y)*i --&gt; x und y sind komplexe zahlen</p>
<p>die komplexe multiplikation geht folgendermassen:<br />
x*y = (real(x)*real(y) - (imag(x)*imag(y))) + (real(x)*imag(y) + imag(x)*real(y))*i</p>
<p>ein wirklich dummer fehler, der mir viele nerven gekostet hat....<br />
danke trotzdem. falls jemand gerne nähere informationen haben möchte, wie nun meine funktionen funktionieren ( <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ) darf sich gerne bei mir melden.<br />
grs grave</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220696</guid><dc:creator><![CDATA[GraveCH]]></dc:creator><pubDate>Wed, 31 Jan 2007 18:24:06 GMT</pubDate></item></channel></rss>