next up previous contents
Nächste Seite: 9.7 Unit FFTU Aufwärts: 9. Programmlisting Vorherige Seite: 9.5 Unit ConvertU   Inhalt

9.6 Unit TransU


{-------------------------------------------------------------------}

{ Vorbereitungen zur Fast Fourier Transformation und zur inversen
  Fast Fourier Transformation }
unit TransU;

{-------------------------------------------------------------------}

interface

procedure FFTBerechnung;
procedure Synthese;

{-------------------------------------------------------------------}

implementation

uses
  ConvertU,    { Konvertierung von Plot-Daten }
  FFTU,        { (inverse) FFT ohne Coprozessor }
  Glob,        { Globale Deklarationen }
  LoadSave,    { Laden und Speichern von Dateien }
  XFFT;        { (inverse) FFT mit Coprozessor }

var
  FFTEnde : word;

{-------------------------------------------------------------------}

{ Ermitteln der Signalfrequenz und Abschneiden der FFT }
procedure FFTCut;

var
  i, FFTmin : word;
  tmp       : real;

begin
  i := 1;
  while Itrans^[i] < Itrans^[i - 1] do inc(i);
  FFTmin := i;

  tmp := Itrans^[FFTmin];
  FFTmax := FFTmin;
  for i := FFTmin + 1 to nmax div 2 do
    if Itrans^[i] > tmp then
    begin
      tmp := Itrans^[i];
      FFTmax := i;
    end;

  if FFTmax < nmax div 4 then FFTEnde := round(2 * FFTmax)
  else FFTEnde := 10;
  Tau := nmax / FFTmax;
end; { FFTCut }

{-------------------------------------------------------------------}

{ Vor- und Nachbereitungen der (inversen) FFT }
procedure Transformation(var h : boolean);

var
  i : word;

begin
  { Vorbereitung der Werte fuer die (inverse) FFT }
  if h then
    for i := 0 to nmax - 1 do
    begin
      IRe^[i] := Imes^[i];
      IIm^[i] := 0;
    end
  else
  begin
    FFTCut;
    for i := FFTEnde + 1 to nmax - FFTEnde - 1 do
    begin
      IRe^[i] := 0;
      IIm^[i] := 0;
    end;
  end;

{$IFDEF CPU87}

  { Berechnung der (inversen) FFT ohne Coprozessor ueber FFTU }
  CoSiTab(nmax);
  FFTAsm(IRe^, IIm^, nmax, round(ln(nmax) / ln(2)), h);

{$ELSE}

  { Berechnung der (inversen) FFT mit Coprozessor ueber XFFT }
  Tabelle(nmax);
  FFT(IRe^, IIm^, nmax, round(ln(nmax) / ln(2)), h);

{$ENDIF}

  { Betragsbildung }
  for i := 0 to nmax - 1 do
    Itrans^[i] := sqrt(sqr(IRe^[i]) + sqr(IIm^[i]));
  if h then Itrans^[0] := Itrans^[0] / 2;
end; { Transformation }

{-------------------------------------------------------------------}

{ Aufrufen der FFT }
procedure FFTBerechnung;

var
  FFThin : boolean;

begin
  if not Exists(copy(FileName, 0, Length(FileName) - 3) + ExtMess)
    then Convert
  else FileName := copy(FileName, 0, Length(FileName) - 3) + ExtMess;
  LoadFileI(Imes^, FileName);
  FFThin := true;
  Transformation(FFThin);
  FileName := copy(FileName, 0, Length(FileName) - 3) + ExtFFT;
end; { FFTBerechnung }

{-------------------------------------------------------------------}

{ Aufrufen der inversen FFT }
procedure Synthese;

var
  FFThin : boolean;

begin
  FFTBerechnung;
  FFThin := false;
  Transformation(FFThin);
  FileName := copy(FileName, 0, Length(FileName) - 3) + ExtKor;
end; { Synthese }

{-------------------------------------------------------------------}

end. { TransU }

{-------------------------------------------------------------------}

next up previous contents
Nächste Seite: 9.7 Unit FFTU Aufwärts: 9. Programmlisting Vorherige Seite: 9.5 Unit ConvertU   Inhalt
Udo Becker
2000-01-02