⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit2.pas

📁 《Delphi常用数值算法集》的配书源码
💻 PAS
字号:
unit Unit2;

interface
Procedure CORREL(DATA1,DATA2:array of real;N:integer;var ANS:array of real);

implementation
Procedure 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;

Procedure REALFT(var DATA:array of real; N, ISIGN:integer);
var
    I,I1,I2,I3,I4,N2P3:integer;
    WR,WI,C1,C2,THETA,WPR,WPI,WIS,WRS,WRI,H1R,H1I,H2R,H2I,WTEMP:real;
begin
    THETA:=6.28318530717959 / 2 / N;
    C1:=0.5;
    If ISIGN = 1 Then
    begin
        C2:=-0.5;
        FOUR1(DATA, N, 1);
    end
    Else
    begin
        C2:=0.5;
        THETA:=-THETA;
    end; 
    WPR:=-2* Sqr(Sin(0.5 * THETA));
    WPI:=Sin(THETA);
    WR:=1 + WPR;
    WI:=WPI;
    N2P3:= 2 * N + 3;
    For I:=2 To (N div 2) + 1 do
    begin
        I1:=2 * I - 1;
        I2:=I1 + 1;
        I3:=N2P3 - I2;
        I4:=I3 + 1;
        WRS:=WR;
        WIS:=WI;
        H1R:=C1 * (DATA[I1] + DATA[I3]);
        H1I:=C1 * (DATA[I2] - DATA[I4]);
        H2R:=-C2 * (DATA[I2] + DATA[I4]);
        H2I:=C2 * (DATA[I1] - DATA[I3]);
        DATA[I1]:=H1R + WRS * H2R - WIS * H2I;
        DATA[I2]:=H1I + WRS * H2I + WIS * H2R;
        DATA[I3]:=H1R - WRS * H2R + WIS * H2I;
        DATA[I4]:=-H1I + WRS * H2I + WIS * H2R;
        WTEMP:=WR;
        WR:=WR * WPR - WI * WRI + WR;
        WI:=WI * WPR + WTEMP * WPI + WI;
    end;
    If ISIGN = 1 Then
    begin
        H1R:=DATA[1];
        DATA[1]:=H1R + DATA[2];
        DATA[2]:=H1R - DATA[2];
    end
    Else
    begin
        H1R:=DATA[1];
        DATA[1]:=C1 * (H1R + DATA[2]);
        DATA[2]:=C1 * (H1R - DATA[2]);
        FOUR1(DATA, N, -1);
    end; 
end; 

Procedure CORREL(DATA1,DATA2:array of real;N:integer;var ANS:array of real);
var
    FFT:array[0..128] of real;
    NO2,I:integer;  DUM,DUM1,DUM2:real;
begin
    TWOFFT(DATA1, DATA2, FFT, ANS, N);
    NO2:=N div 2;
    For I:=1 To NO2 + 1 do
    begin
      DUM:=ANS[2 * I - 1];
      DUM1:=FFT[2 * I - 1] * DUM + FFT[2 * I] * ANS[2 * I];
      ANS[2 * I - 1]:=DUM1 / NO2;
      DUM2:=FFT[2 * I] * DUM - FFT[2 * I - 1] * ANS[2 * I];
      ANS[2 * I]:=DUM2 / NO2;
    end;
    ANS[2]:=ANS[N + 1];
    REALFT(ANS, NO2, -1);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -