Fast Fourier transform: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
No edit summary |
||
Line 4,605: | Line 4,605: | ||
0.000e+00+0.000e+00j, |
0.000e+00+0.000e+00j, |
||
1.000e+00+2.414e+00j>)</pre> |
1.000e+00+2.414e+00j>)</pre> |
||
=={{header|VBA}}== |
|||
{{works with|VBA}} |
|||
Written and tested in Microsoft Visual Basic for Applications 7.1 under Office 365 Excel; but is probably useable under any recent version of VBA. |
|||
<syntaxhighlight lang="vba">Option Base 0 |
|||
Private Type Complex |
|||
re As Double |
|||
im As Double |
|||
End Type |
|||
Private Function cmul(c1 As Complex, c2 As Complex) As Complex |
|||
Dim ret As Complex |
|||
ret.re = c1.re * c2.re - c1.im * c2.im |
|||
ret.im = c1.re * c2.im + c1.im * c2.re |
|||
cmul = ret |
|||
End Function |
|||
Public Sub FFT(buf() As Complex, out() As Complex, begin As Integer, step As Integer, N As Integer) |
|||
Dim i As Integer, t As Complex, c As Complex, v As Complex |
|||
If step < N Then |
|||
FFT out, buf, begin, 2 * step, N |
|||
FFT out, buf, begin + step, 2 * step, N |
|||
i = 0 |
|||
While i < N |
|||
t.re = Cos(-WorksheetFunction.Pi() * i / N) |
|||
t.im = Sin(-WorksheetFunction.Pi() * i / N) |
|||
c = cmul(t, out(begin + i + step)) |
|||
buf(begin + (i \ 2)).re = out(begin + i).re + c.re |
|||
buf(begin + (i \ 2)).im = out(begin + i).im + c.im |
|||
buf(begin + ((i + N) \ 2)).re = out(begin + i).re - c.re |
|||
buf(begin + ((i + N) \ 2)).im = out(begin + i).im - c.im |
|||
i = i + 2 * step |
|||
Wend |
|||
End If |
|||
End Sub |
|||
' --- test routines: |
|||
Private Sub show(r As Long, txt As String, buf() As Complex) |
|||
Dim i As Integer |
|||
r = r + 1 |
|||
Cells(r, 1) = txt |
|||
For i = LBound(buf) To UBound(buf) |
|||
r = r + 1 |
|||
Cells(r, 1) = buf(i).re: Cells(r, 2) = buf(i).im |
|||
Next |
|||
End Sub |
|||
Sub testFFT() |
|||
Dim buf(7) As Complex, out(7) As Complex |
|||
Dim r As Long, i As Integer |
|||
buf(0).re = 1: buf(1).re = 1: buf(2).re = 1: buf(3).re = 1 |
|||
r = 0 |
|||
show r, "Input (real, imag):", buf |
|||
FFT out, buf, 0, 1, 8 |
|||
r = r + 1 |
|||
show r, "Output (real, imag):", out |
|||
End Sub |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre>Input (real, imag): |
|||
1 0 |
|||
1 0 |
|||
1 0 |
|||
1 0 |
|||
0 0 |
|||
0 0 |
|||
0 0 |
|||
0 0 |
|||
Output (real, imag): |
|||
4 0 |
|||
1 -2,414213562 |
|||
0 0 |
|||
1 -0,414213562 |
|||
0 0 |
|||
1 0,414213562 |
|||
0 0 |
|||
1 2,414213562</pre> |
|||
=={{header|Vlang}}== |
=={{header|Vlang}}== |