diff --git a/FFT.py b/FFT.py index c733a7a..59c7884 100644 --- a/FFT.py +++ b/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 diff --git a/__pycache__/FFT.cpython-312.pyc b/__pycache__/FFT.cpython-312.pyc index c7e41bb..396ab2e 100644 Binary files a/__pycache__/FFT.cpython-312.pyc and b/__pycache__/FFT.cpython-312.pyc differ