Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szybka transformata Fouriera

Ostatnio zmodyfikowano 2015-04-13 12:40
Autor Wiadomość
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:

C/C++
#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; //numer lini w pliku zaczynamy od jedynki bo czyta od jedynki
    string linia; // aktualnie pobrana 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]
P-130773
Monika90
» 2015-04-13 12:10:34
Zamiast kombinować z new i wskaźnikami użyj std::vector<double>
P-130780
darko202
» 2015-04-13 12:40:15
1.
jeśli masz komunikat błędu to umieszczaj go, bo jak mamy się do tego odnieść

2
może pomoże Ci
http://wazniak.mimuw.edu.pl​/index.php?title=MN10

http:/​/patrykgradys.blogspot.com/2015​/03​/pena-transformata-fouriera-z-filtrem.html
P-130786
« 1 »
  Strona 1 z 1