Fourier Transformation Fehler [gelöst]



  • Hi C++ und Mathe Profis,
    ich hoffe das ich hier richtig bin.
    Ich schreibe ein Programm in dem eine Fourier Transformation an einer Sprungfunktion durchgeführt werden soll.
    Die Höhe der Amplitude (A), die Anzahl der Perioden (T) und die Anzahl der Sinusschwingungen (x) der Fouriertransformation sollen gewählt werden können.
    Die Ausgabe der Ergebnisse erfolgt in einer Datei.
    Das Programm besteht bis jetzt im wesentlichem aus einer Äußeren Schleife die durch die Schrittweite auf der Zeitachse bestimmt wird (Δt=T/(10*x-1) und einer Inneren Schleife zur Berechnung der Summenanteile der Transformation.

    Bis jetzt konnte ich herausfinden das es wohl an der Sinusfunktion liegt das viel zu hohe Werte ausgegeben werden.
    Die ausgegebenen Werte sollten ja zwischen 0 und dem Amplitudenwert liegen.

    Ich hoffe das der Quelltext soweit gut genug gekürzt ist und jemand Rat weiß...
    vielen dank schonmal!

    #include <iostream>
    #include <fstream>
    #include <math.h>
    #include <iomanip>
    
    using namespace std;
    
    const float pi=3.14159;
    double A,B,T,F,y,t=0.0,i,x;
    int n;
    
    int main()
    {
    
    	std::fstream fstreamobj;
    
    	fstreamobj.open("ausgabe.txt",std::ios::out|std::ios::trunc);
    
    	//Wertabfrage und Eingabe
    	cout<<"geben sie einen Amplitudenwert ein"<<endl;
    	cin>>A;
    	cout<<"geben sie einen Periodenwert ein"<<endl;
    	cin>>T;
    	cout<<"geben sie die Anzahl der Schwingungen ein"<<endl;
    	cin>>x;
    
    	fstreamobj<<setw(15)<<"Amplitude"<<setw(15)<<"Zeitschritt"<<std::endl
    <<"=============================="<<std::endl;
    
    	//Schleife zur Berechnung der y(t) Werte
    	for (;t<=2.0*T;t+=(T/(10.0*(2.0*x-1.0))))
    	{
    
    	i=1.0;
    
    	for(n=1;n<=x;n+=1)
    {
    
    	//Fourier Transformation Summenanteil
    	B+=((1.0/i)*sin(i*(2*pi/T)*t));
    
    	//cout<<B<<endl;
    	i+=2.0;
    
    }
    
    	//Fouriertransformation 
    	y=(A/2.0)+((2.0*A)/pi)*B;
    
    	//Bildschirmausgabe
    	cout<<setw(10)<<y<<";"<<setw(10)<<t<<";"<<endl;
    
    	//Dateiausgabe
    	fstreamobj<<setw(14)<<y<<";"<<setw(14)<<t<<";"<<std::endl;
    }
    
    	//Prüfung ob bei durchgeführten Stream-operationen ein Fehler aufgetreten ist
    	std::cout<<"Ausgabe Stream Fehler: "<<fstreamobj.fail()<<std::endl;
    
    	//Lösen der Filestreamobjekte vom Stream (Schließen)
    	fstreamobj.close();
    
    	return 0;
    	}
    


  • Welchen Wert hat B in Zeile 42?

    Deine Formatierung ist nicht schön.
    Warum ist pi ein float (und kein double )?



  • Entschuldige das bitte,
    ich bin noch stark am lernen das ist etwa mein 10. Programm.

    Bei pi habe ich das noch nicht geändert da ich dachte das würde mich nicht so viel Zeit bei solch einem Programm kosten oder ist das schon schlimm?

    B hat noch keinen Wert doch auch wenn ich ihm in der Deklaration 0 zuweise ändert das leider nichts 😕



  • Jetzt muss ich mich natürlich wieder mal entschuldigen bei Ihnen!
    Klar ich muss in der ersten Schleife B immer wieder auf = 0 setzen... 😡

    so gehts...

    vielen dank für den Denkanstoß! 👍

    #include <iostream>
    #include <fstream>
    #include <math.h>
    #include <iomanip>
    
    using namespace std;
    
    const float pi=3.14159;
    double A,B=0,T,F,y,t=0.0,i,x;
    int n;
    
    int main()
    {
    
    	std::fstream fstreamobj;
    
    	fstreamobj.open("ausgabe.txt",std::ios::out|std::ios::trunc);
    
    	//Wertabfrage und Eingabe
    	cout<<"geben sie einen Amplitudenwert ein"<<endl;
    	cin>>A;
    	cout<<"geben sie einen Periodenwert ein"<<endl;
    	cin>>T;
    	cout<<"geben sie die Anzahl der Schwingungen ein"<<endl;
    	cin>>x;
    
    	fstreamobj<<setw(15)<<"Amplitude"<<setw(15)<<"Zeitschritt"<<std::endl
    			<<"=============================="<<std::endl;
    
    		//Schleife zur Berechnung der y(t) Werte
    		for (;t<=2.0*T;t+=(T/(10.0*(2.0*x-1.0))))
    		{
    
    		i=1.0;
    		B=0;
    
    			for(n=1;n<=x;n+=1)
    			{
    
    				//Fourier Transformation Summenanteil
    				B+=((1.0/i)*sin(i*(2*pi/T)*t));
    
    				//cout<<B<<endl;
    				i+=2.0;
    
    			}
    
    		//Fouriertransformation 
    		y=(A/2.0)+((2.0*A)/pi)*B;
    
    		//Bildschirmausgabe
    		cout<<setw(10)<<y<<";"<<setw(10)<<t<<";"<<endl;
    
    		//Dateiausgabe
    		fstreamobj<<setw(14)<<y<<";"<<setw(14)<<t<<";"<<std::endl;
    		}
    
    	//Prüfung ob bei durchgeführten Stream-operationen ein Fehler aufgetreten ist
    	std::cout<<"Ausgabe Stream Fehler: "<<fstreamobj.fail()<<std::endl;
    
    	//Lösen der Filestreamobjekte vom Stream (Schließen)
    	fstreamobj.close();
    
    	return 0;
    	}
    


  • 1.4matze schrieb:

    B hat noch keinen Wert doch auch wenn ich ihm in der Deklaration 0 zuweise ...

    Das ist dann eine Definition mit Initialsierung.

    Bei einer Deklaration kann man keinen Wert zuweisen (, da dabei kein Speicher belegt wird).
    Die Definition schließt die Deklaration mit ein, aber nicht umgekehrt.



  • ok aber das ist reine Formulierungssache?

    Wenn ich einer Variablen bei der Deklaration einen Wert zuweise dann heisst es nur Definition?



  • Eine Deklaration ist nur die Bekanntmachung des Namens. Eine Definition ist eine Deklaration mit Belegung des Speichers. Wenn auch gleich ein Wert mitgegeben wird ist das eine Initialisierung, also eine Definition mit Initialisierung.


Log in to reply