implemented in-place FFT c-style. (by ChatGPT)
This commit is contained in:
16
FFT.py
16
FFT.py
@ -93,7 +93,7 @@ def FFT_arr_inplace(buf):
|
|||||||
In-place radix-2 DIT FFT для списка buf длины N=2^m, где каждый элемент — [re, im].
|
In-place radix-2 DIT FFT для списка buf длины N=2^m, где каждый элемент — [re, im].
|
||||||
Без массивов twiddle: твиддл на уровне обновляется рекуррентно.
|
Без массивов twiddle: твиддл на уровне обновляется рекуррентно.
|
||||||
"""
|
"""
|
||||||
N = len(buf)
|
N = len(buf)/2
|
||||||
# --- bit-reverse перестановка (чтобы бабочки шли последовательно) ---
|
# --- bit-reverse перестановка (чтобы бабочки шли последовательно) ---
|
||||||
j = 0
|
j = 0
|
||||||
for i in range(1, N):
|
for i in range(1, N):
|
||||||
@ -103,7 +103,7 @@ def FFT_arr_inplace(buf):
|
|||||||
bit >>= 1
|
bit >>= 1
|
||||||
j |= bit
|
j |= bit
|
||||||
if i < j:
|
if i < j:
|
||||||
buf[i], buf[j] = buf[j], buf[i]
|
buf[i*2], buf[i*2+1], buf[j*2], buf[j*2+1] = buf[j*2], buf[j*2+1], buf[i*2], buf[i*2+1]
|
||||||
|
|
||||||
# --- уровни бабочек ---
|
# --- уровни бабочек ---
|
||||||
m = 2
|
m = 2
|
||||||
@ -117,18 +117,18 @@ def FFT_arr_inplace(buf):
|
|||||||
# w = e^{-j*0*Δ} = 1 + j0
|
# w = e^{-j*0*Δ} = 1 + j0
|
||||||
wr, wi = 1.0, 0.0
|
wr, wi = 1.0, 0.0
|
||||||
for k in range(half):
|
for k in range(half):
|
||||||
u_re, u_im = buf[start + k]
|
u_re, u_im = buf[(start + k)*2], buf[(start + k)*2 +1]
|
||||||
v_re, v_im = buf[start + k + half]
|
v_re, v_im = buf[(start + k + half)*2], buf[(start + k + half)*2 +1]
|
||||||
|
|
||||||
# t = w * v
|
# t = w * v
|
||||||
t_re = wr * v_re - wi * v_im
|
t_re = wr * v_re - wi * v_im
|
||||||
t_im = wr * v_im + wi * v_re
|
t_im = wr * v_im + wi * v_re
|
||||||
|
|
||||||
# верх/низ
|
# верх/низ
|
||||||
buf[start + k][0] = u_re + t_re
|
buf[(start + k)*2 +0] = u_re + t_re
|
||||||
buf[start + k][1] = u_im + t_im
|
buf[(start + k)*2 +1] = u_im + t_im
|
||||||
buf[start + k + half][0] = u_re - t_re
|
buf[(start + k + half)*2 + 0] = u_re - t_re
|
||||||
buf[start + k + half][1] = u_im - t_im
|
buf[(start + k + half)*2 + 1] = u_im - t_im
|
||||||
|
|
||||||
# w *= w_m (поворот на Δ с помощью рекуррентной формулы)
|
# w *= w_m (поворот на Δ с помощью рекуррентной формулы)
|
||||||
# (wr + j wi) * (cΔ + j sΔ)
|
# (wr + j wi) * (cΔ + j sΔ)
|
||||||
|
|||||||
Reference in New Issue
Block a user