📄 unit2.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 + -