Zurück Vor +Ebene Home Inhalt Index Hilfe

Diskrete Fourier-Transformation

Programm zur numerische Berechnung der diskreten Fourier-Transformation.

Da in PASCAL die komplexe Arithmetik nicht unterstützt wird, muß die e-Funktion mit der Eulerschen Formel in Real- und Imaginärteil zerlegt werden:

program DiskreteFourierTransformation;

        {Berechnung einer diskreten Fouriertransformation am Beispiel
        y(x) = cos(3t) + sin(10t)}

    uses
        stdfile;

    const
        MaxArray = 1024; {<= 32767}

    var
        k, m, n:      integer;
        omega, angle: double;
        funkt:        array [0..MaxArray] of double; {Vorgegebene Funktion}
        realt:        array [0..MaxArray] of double; {Realteil}
        imagt:        array [0..MaxArray] of double; {Imaginaerteil}

    procedure init;
        var
            fName: string;
            f:     text;
        begin {init}
            writeln('Darstellung der Berechnung einer diskreten Fouriertransformation');
            writeln;
            write('In welcher Datei liegt die Funktion?');
            writeln('In dft.dat liegt als Beispiel: y(x) = cos(3t) + sin(10t) in 32 Intervallen von delta t = 2Pi/32');
            readln(fName);
            if StdOpen(f, fName) then begin
                n := -1;
                repeat
                    n := n + 1;
                    if n > MaxArray then begin
                        writeln('Die Datei "', fName, '" hat zu viele Punkte (mehr als ', MaxArray, ').');
                        halt
                    end; {if}
                until not StdRead(f, funkt[n]);
                n := n - 1
            end else begin {if}
                writeln('Die Datei "', fName, '" kann nicht geoeffnet werden.');
                halt
            end; {if}
            close(f);
            writeln('Insgesamt wurden ', n, ' Werte eingelesen.');
        end; {init}

    procedure result; 
	var
	    i: Integer;
        begin {result}
	    for i:=0 to n-1 do begin
		writeln(i:2,'   ', realt[i]:7:3,' +i* ', imagt[i]:6:3)
	    end {for}
	end; {result}

    begin {DFT}
        init;
        omega := 2.0*Pi/n;
        for k:=0 to n-1 do begin
            realt[k] := 0.0;
            imagt[k] := 0.0;
            for m:=0 to n-1 do begin
                angle := k*omega*m;
                realt[k] := realt[k] + funkt[m]*cos(angle);
                imagt[k] := imagt[k] - funkt[m]*sin(angle);
            end {for}
        end; {for}
        result
    end. {DFT}
Zurück Vor +Ebene Home Inhalt Index Hilfe

Copyright Verlag Harri Deutsch AG  Stöcker DeskTop Mathematik