📄 d10r7.frm
字号:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 4725
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form1"
ScaleHeight = 4725
ScaleWidth = 4680
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton Command1
Caption = "Command1"
Height = 375
Left = 3120
TabIndex = 0
Top = 4080
Width = 1215
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Command1_Click()
'PROGRAM D10R7
'Driver for routine CORREL
N = 64
N2 = 128
PI = 3.1415926
Dim DATA1(64), DATA2(64), ANS(128)
For I = 1 To N
DATA1(I) = 0#
If I > (N / 2 - N / 8) And I < (N / 2 + N / 8) Then
DATA1(I) = 1#
End If
DATA2(I) = DATA1(I)
Next I
Call CORREL(DATA1(), DATA2(), N, ANS())
'Caculate directly
Print
Print Tab(5); " n CORREL Direct Calc"
For I = 0 To 16
CMP = 0#
For J = 1 To N
CMP = CMP + DATA1(((I + J - 1) Mod N) + 1) * DATA2(J)
Next J
Print Tab(5); I, Format$(ANS(I + 1), "##.#####0"),
Print Format$(CMP, "##.#####0")
Next I
End Sub
Sub CORREL(DATA1(), DATA2(), N, ANS())
Dim FFT(128)
Call TWOFFT(DATA1(), DATA2(), FFT(), ANS(), N)
NO2 = N / 2#
For I = 1 To NO2 + 1
DUM = ANS(2 * I - 1)
DUM1 = FFT(2 * I - 1) * DUM + FFT(2 * I) * ANS(2 * I)
ANS(2 * I - 1) = DUM1 / CSng(NO2)
DUM2 = FFT(2 * I) * DUM - FFT(2 * I - 1) * ANS(2 * I)
ANS(2 * I) = DUM2 / CSng(NO2)
Next I
ANS(2) = ANS(N + 1)
Call REALFT(ANS(), NO2, -1)
Erase FFT
End Sub
Sub TWOFFT(DATA1(), DATA2(), FFT1(), FFT2(), N)
C1R = 0.5
C1I = 0#
C2R = 0#
C2I = -0.5
For J = 1 To N
FFT1(2 * J - 1) = DATA1(J)
FFT1(2 * J) = DATA2(J)
Next J
Call FOUR1(FFT1(), N, 1)
FFT2(1) = FFT1(2)
FFT2(2) = 0#
FFT1(2) = 0#
N2 = 2 * (N + 2)
For J = 2 To N / 2 + 1
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
Next J
End Sub
Sub REALFT(DATA(), N, ISIGN)
THETA = 6.28318530717959 / 2# / N
C1 = 0.5
If ISIGN = 1 Then
C2 = -0.5
Call FOUR1(DATA(), N, 1)
Else
C2 = 0.5
THETA = -THETA
End If
WPR = -2# * Sin(0.5 * THETA) ^ 2
WPI = Sin(THETA)
WR = 1# + WPR
WI = WPI
N2P3 = 2 * N + 3
For I = 2 To N / 2 + 1
I1 = 2 * I - 1
I2 = I1 + 1
I3 = N2P3 - I2
I4 = I3 + 1
WRS = CSng(WR)
WIS = CSng(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
Next I
If ISIGN = 1 Then
H1R = DATA(1)
DATA(1) = H1R + DATA(2)
DATA(2) = H1R - DATA(2)
Else
H1R = DATA(1)
DATA(1) = C1 * (H1R + DATA(2))
DATA(2) = C1 * (H1R - DATA(2))
Call FOUR1(DATA(), N, -1)
End If
End Sub
Sub FOUR1(DATA(), NN, ISIGN)
N = 2 * NN
J = 1
For I = 1 To N Step 2
If J > I Then
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 If
M = N / 2
While M >= 2 And J > M
J = J - M
M = M / 2
Wend
J = J + M
Next I
MMAX = 2
While N > MMAX
ISTEP = 2 * MMAX
THETA = 6.28318530717959 / (ISIGN * MMAX)
WPR = -2# * Sin(0.5 * THETA) ^ 2
WPI = Sin(THETA)
WR = 1#
WI = 0#
For M = 1 To MMAX Step 2
For I = M To N Step ISTEP
J = I + MMAX
TEMPR = CSng(WR) * DATA(J) - CSng(WI) * DATA(J + 1)
TEMPI = CSng(WR) * DATA(J + 1) + CSng(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
Next I
WTEMP = WR
WR = WR * WPR - WI * WPI + WR
WI = WI * WPR + WTEMP * WPI + WI
Next M
MMAX = ISTEP
Wend
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -