请教如何传递参数!!//能有图象的傅立叶变换demo给三百分
定义tcomplex=record
     real :double ;
     image:double;
    end;
Tcomplexarray=aray[0..0] of Tcomplex;
pcomplexarray =^Tcomplexarray ;
finbuffer:Pcomplexarray;
data1:Tcomplexarray;
我想让finbuffer的 指针指向data1的首地址。
即让finbuffer[i].real等于data1[i].real;
另外,谁能做出图象的傅立叶变换,给三百分

解决方案 »

  1.   

    给你个傅立叶变换的工程代码(转贴):program Project1;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas';{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    ------------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      F:TextFile;
    implementationuses
      unit2;
      {$R *.DFM}
    procedure PRNTFT(DATA:array of real;  NN2:integer);
    const
      s1 = '%13.6f'; s2 = '#0';
    var
      NN,N,M,MM:integer;
    begin
      Writeln(F,'   n    Real H(n)     Imag H(n)   Real H(N-n)  Imag H(N-n)');
      Writeln(F,'  ',FormatFloat('0',0),Format(s1,[DATA[1]]),
        Format(s1,[DATA[2]]),Format(s1,[DATA[1]]),Format(s1,[DATA[2]]));
      For NN:=2 To (((NN2 div 2) + 2) div 2) do
      begin
        N:= 2 * NN -1;
        M:= (N-1) div 2;
        MM:=NN2 + 2 - N;
        Writeln(F,'  ',FormatFloat(s2,M),Format(s1,[DATA[N]]),
          Format(s1,[DATA[N+1]]),Format(s1,[DATA[MM]]),Format(s1,[DATA[MM+1]]));
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    const
      s1='%13.6f'; s2 = '##';
      N = 32;  N2 = 2 * N;  PER = 8;  PI = 3.1415926;
    var
      DATA1,DATA2:array[0..32] of real;  FFT1,FFT2:array[0..64] of real;
      I,II,ISIGN,J:integer;    X:real;
    begin
      //输出计算结果到文件
      AssignFile(F, 'd10r2.dat');
      Rewrite(F);
      For I:=1 To N do
      begin
        X:= 2* PI * I / PER;
        DATA1[I]:= Round(Cos(X));
        DATA2[I]:= Round(Sin(X));
      end;
      TWOFFT(DATA1, DATA2, FFT1, FFT2, N);
      Writeln(F, 'Fourier transform of first function:');
      PRNTFT(FFT1, N2);
      Writeln(F, 'Fourier transform of second function:');
      PRNTFT(FFT2, N2);
      //Invert transform
      ISIGN:= -1;
      FOUR1(FFT1, N, ISIGN);
      Writeln(F, 'Inverted transform = first function:');
      PRNTFT(FFT1, N2);
      FOUR1(FFT2, N, ISIGN);
      Writeln(F, 'Inverted transform = second function:');
      PRNTFT(FFT2, N2);
      CloseFile(F);
      //屏幕显示计算结果
      memo1.Lines.LoadFromFile('d10r2.dat');
    end;end.
    -----------------------
    unit Unit2;interface  Procedure FOUR1(var DATA:array of real; NN, ISIGN:integer);
      Procedure TWOFFT(DATA1, DATA2:array of real;
                                 var FFT1, FFT2:array of real; N:integer);
    implementationProcedure FOUR1(var DATA:array of real; NN, ISIGN:integer);
    var
        N,J,JJ,I,M,II,MM,ISTEP,MMAX:integer;
        THETA,WR,WI,WPR,SUM,WTEMP,Y1,Y2,TEMPR,TEMPI,WPI:real;
    begin
        N:=2 * NN;
        J:=1;
        For II:=1 To NN do
        begin
            I:= II * 2 - 1;
            If J > I Then
            begin
                TEMPR:=DATA[J];
                TEMPI:=DATA[J + 1];
                DATA[J]:=DATA[I];
                DATA[J + 1]:=DATA[I + 1];
                DATA[I]:=TEMPR;
                DATA[I + 1]:=TEMPI;
            end; 
            M:=N div 2;
            While (M >= 2) And (J > M) do
            begin
                J:=J - M;
                M:=M div 2;
            end;
            J:=J + M;
        end; 
        MMAX:=2;
        While N > MMAX do
        begin
            ISTEP:=2 * MMAX;
            THETA:=6.28318530717959 / (ISIGN * MMAX);
            WPR:=-2 * Sqr(Sin(0.5 * THETA));
            WPI:=Sin(THETA);
            WR:=1;
            WI:=0;
            For II:=1 To (MMAX div 2) do
            begin
                M:= II * 2 - 1;
                For JJ:=0 To ((N-M) div ISTEP) do
                begin
                    I:= M + JJ*ISTEP ;
                    J:=I + MMAX;
                    TEMPR:=WR * DATA[J] - WI * DATA[J + 1];
                    TEMPI:=WR * DATA[J + 1] + WI * DATA[J];
                    DATA[J]:=DATA[I] - TEMPR;
                    DATA[J + 1]:=DATA[I + 1] - TEMPI;
                    DATA[I]:=DATA[I] + TEMPR;
                    DATA[I + 1]:=DATA[I + 1] + TEMPI;
                end; 
                WTEMP:=WR;
                WR:=WR * WPR - WI * WPI + WR;
                WI:=WI * WPR + WTEMP * WPI + WI;
            end; 
            MMAX:=ISTEP;
        end;
    end;Procedure TWOFFT(DATA1, DATA2:array of real;
                                 var FFT1, FFT2:array of real; N:integer);
    var
        C1R,C1I,C2R,C2I,CONJR,CONJI,H1R,H1I,H2R,H2I:real;  N2,J,J2:integer;
    begin
        C1R:=0.5;
        C1I:=0;
        C2R:=0;
        C2I:=-0.5;
        For J:=1 To N do
        begin
            FFT1[2 * J - 1]:=DATA1[J];
            FFT1[2 * J]:=DATA2[J];
        end;
        FOUR1(FFT1, N, 1);
        FFT2[1]:=FFT1[2];
        FFT2[2]:=0;
        FFT1[2]:=0;
        N2:=2 * (N + 2);
        For J:=2 To ((N div 2) + 1) do
        begin
            J2:=2 * J;
            CONJR:=FFT1[N2 - J2 - 1];
            CONJI:=-FFT1[N2 - J2];
            H1R:=C1R * (FFT1[J2 - 1] + CONJR) - C1I * (FFT1[J2] + CONJI);
            H1I:=C1I * (FFT1[J2 - 1] + CONJR) + C1R * (FFT1[J2] + CONJI);
            H2R:=C2R * (FFT1[J2 - 1] - CONJR) - C2I * (FFT1[J2] - CONJI);
            H2I:=C2I * (FFT1[J2 - 1] - CONJR) + C2R * (FFT1[J2] - CONJI);
            FFT1[J2 - 1]:=H1R;
            FFT1[J2]:=H1I;
            FFT1[N2 - J2 - 1]:=H1R;
            FFT1[N2 - J2]:=-H1I;
            FFT2[J2 - 1]:=H2R;
            FFT2[J2]:=H2I;
            FFT2[N2 - J2 - 1]:=H2R;
            FFT2[N2 - J2]:=-H2I;
        end;
    end; end.