Nächste Seite: 9.7 Unit FFTU
Aufwärts: 9. Programmlisting
Vorherige Seite: 9.5 Unit ConvertU
  Inhalt
{-------------------------------------------------------------------}
{ 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 }
{-------------------------------------------------------------------}
Nächste Seite: 9.7 Unit FFTU
Aufwärts: 9. Programmlisting
Vorherige Seite: 9.5 Unit ConvertU
  Inhalt
Udo Becker
2000-01-02