Patched FFT_arr_inplace(). Now it uses only simple arrays. re and im are stored like arr[2*i] = re, arr[2*i + 1] = im

This commit is contained in:
2025-10-08 18:12:16 +03:00
parent ae9868b233
commit fffe096312
2 changed files with 19 additions and 6 deletions

25
FFT.py
View File

@ -28,8 +28,19 @@ def FFT_real(inp):
# out = [2 for val in out] # out = [2 for val in out]
if (mode == 2): if (mode == 2):
tmp = []
out = FFT_arr_inplace([[val, 0] for val in inp]) for re in inp:
tmp.append(re)
tmp.append(0)
out = FFT_arr_inplace(tmp)
tmp = out.copy()
out = []
for i in range(len(tmp)//2):
out.append([tmp[2*i], tmp[2*i+1]])
#out = [val for val in np.abs(out)] #out = [val for val in np.abs(out)]
print("FFT_calculated!") print("FFT_calculated!")
print("output:", out) print("output:", out)
@ -93,7 +104,8 @@ 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)/2
N = len(buf)//2
# --- bit-reverse перестановка (чтобы бабочки шли последовательно) --- # --- bit-reverse перестановка (чтобы бабочки шли последовательно) ---
j = 0 j = 0
for i in range(1, N): for i in range(1, N):
@ -110,8 +122,8 @@ def FFT_arr_inplace(buf):
while m <= N: while m <= N:
half = m // 2 half = m // 2
# шаг угла Δ = 2π/m, базовый твиддл w_m = e^{-jΔ} => (cw, sw) # шаг угла Δ = 2π/m, базовый твиддл w_m = e^{-jΔ} => (cw, sw)
cΔ = math.cos(2.0 * math.pi / m) c_delta = cos(2.0 * math.pi / m)
sΔ = -math.sin(2.0 * math.pi / m) s_delta = -sin(2.0 * math.pi / m)
for start in range(0, N, m): for start in range(0, N, m):
# w = e^{-j*0*Δ} = 1 + j0 # w = e^{-j*0*Δ} = 1 + j0
@ -121,6 +133,7 @@ def FFT_arr_inplace(buf):
v_re, v_im = buf[(start + k + half)*2], buf[(start + k + half)*2 +1] v_re, v_im = buf[(start + k + half)*2], buf[(start + k + half)*2 +1]
# t = w * v # t = w * v
print("wr, v_re, wi, v_im:",wr, v_re, wi, v_im)
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
@ -132,7 +145,7 @@ def FFT_arr_inplace(buf):
# w *= w_m (поворот на Δ с помощью рекуррентной формулы) # w *= w_m (поворот на Δ с помощью рекуррентной формулы)
# (wr + j wi) * (cΔ + j sΔ) # (wr + j wi) * (cΔ + j sΔ)
wr, wi = wr * cΔ - wi * sΔ, wr * sΔ + wi * cΔ wr, wi = wr * c_delta - wi * s_delta, wr * s_delta + wi * c_delta
m <<= 1 m <<= 1
return buf return buf

Binary file not shown.