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:
25
FFT.py
25
FFT.py
@ -28,8 +28,19 @@ def FFT_real(inp):
|
||||
# out = [2 for val in out]
|
||||
if (mode == 2):
|
||||
|
||||
|
||||
out = FFT_arr_inplace([[val, 0] for val in inp])
|
||||
tmp = []
|
||||
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)]
|
||||
print("FFT_calculated!")
|
||||
print("output:", out)
|
||||
@ -93,7 +104,8 @@ def FFT_arr_inplace(buf):
|
||||
In-place radix-2 DIT FFT для списка buf длины N=2^m, где каждый элемент — [re, im].
|
||||
Без массивов twiddle: твиддл на уровне обновляется рекуррентно.
|
||||
"""
|
||||
N = len(buf)/2
|
||||
|
||||
N = len(buf)//2
|
||||
# --- bit-reverse перестановка (чтобы бабочки шли последовательно) ---
|
||||
j = 0
|
||||
for i in range(1, N):
|
||||
@ -110,8 +122,8 @@ def FFT_arr_inplace(buf):
|
||||
while m <= N:
|
||||
half = m // 2
|
||||
# шаг угла Δ = 2π/m, базовый твиддл w_m = e^{-jΔ} => (cw, sw)
|
||||
cΔ = math.cos(2.0 * math.pi / m)
|
||||
sΔ = -math.sin(2.0 * math.pi / m)
|
||||
c_delta = cos(2.0 * math.pi / m)
|
||||
s_delta = -sin(2.0 * math.pi / m)
|
||||
|
||||
for start in range(0, N, m):
|
||||
# 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]
|
||||
|
||||
# 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_im = wr * v_im + wi * v_re
|
||||
|
||||
@ -132,7 +145,7 @@ def FFT_arr_inplace(buf):
|
||||
|
||||
# w *= w_m (поворот на Δ с помощью рекуррентной формулы)
|
||||
# (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
|
||||
return buf
|
||||
|
||||
Reference in New Issue
Block a user