Szybka transformata Fouriera
Ostatnio zmodyfikowano 2015-04-13 12:40
wrobi94 Temat założony przez niniejszego użytkownika |
Szybka transformata Fouriera » 2015-04-13 10:43:50 Witam, mam do napisania program który oblicza szybką transformatę Fouriera. Znalazłem algorytm jednak program się wykrzacza podejrzewam że względu na to iż wynik ma mieć postać zespoloną jednak nie mam pomysłu jak to zaimplementować. Mój kod wygląda: #include <iostream> #include <iostream> #include <fstream> #include <cstdlib> #include <string> #include <math.h> #include <algorithm>
using namespace std;
void four1( double * data, unsigned long nn ) { unsigned long n, mmax, m, j, istep, i; double wtemp, wr, wpr, wpi, wi, theta; double tempr, tempi; n = nn << 1; j = 1; for( i = 1; i < n; i += 2 ) { if( j > i ) { swap( data[ j - 1 ], data[ i - 1 ] ); swap( data[ j ], data[ i ] ); } m = nn; while( m >= 2 && j > m ) { j -= m; m >>= 1; } j += m; }; mmax = 2; while( n > mmax ) { istep = mmax << 1; theta = -( 2 * M_PI / mmax ); wtemp = sin( 0.5 * theta ); wpr = - 2.0 * wtemp * wtemp; wpi = sin( theta ); wr = 1.0; wi = 0.0; for( m = 1; m < mmax; m += 2 ) { for( i = m; i <= n; i += istep ) { j = i + mmax; tempr = wr * data[ j - 1 ] - wi * data[ j ]; tempi = wr * data[ j ] + wi * data[ j - 1 ]; data[ j - 1 ] = data[ i - 1 ] - tempr; data[ j ] = data[ i ] - tempi; data[ i - 1 ] += tempr; data[ i ] += tempi; } wtemp = wr; wr += wr * wpr - wi * wpi; wi += wi * wpr + wtemp * wpi; } mmax = istep; } }
int main() { string nazwa; int nr_lini = 1; string linia; double * wektor; wektor = new double; cout << "Podaj nazwe pliku: "; nazwa = "asd.txt"; ifstream dane; dane.open( nazwa.c_str() ); if( dane.good() == 0 ) { cout << "Plik nie isnieje lub nie ma go w odpowiednim folderze"; exit( 0 ); } while( getline( dane, linia ) ) { wektor[ nr_lini ] = atof( linia.c_str() ); nr_lini++; }; int x = 1, y = 0; while( x < nr_lini ) { cout << wektor[ x ] << endl; x++; y++; } four1( wektor, y ); x = 1; cout << endl; cout << endl; while( x < nr_lini ) { cout << wektor[ x ] << endl; x++; } delete[] wektor; return 0; }
Nazwę pliku wklepałem odrazu w programie aby nie wpisywać jej za każdym razem. Proszę o pomoc. [/i] |
|
Monika90 |
» 2015-04-13 12:10:34 Zamiast kombinować z new i wskaźnikami użyj std::vector<double> |
|
darko202 |
» 2015-04-13 12:40:15 |
|
« 1 » |