From fffe09631295032580302c387f6fb580a75fc5b2 Mon Sep 17 00:00:00 2001 From: Theodor Chikin Date: Wed, 8 Oct 2025 18:12:16 +0300 Subject: [PATCH] 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 --- FFT.py | 25 +++++++++++++++++++------ __pycache__/FFT.cpython-312.pyc | Bin 7502 -> 8236 bytes 2 files changed, 19 insertions(+), 6 deletions(-) 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 c7e41bbd0320e7986aa2b19f56946fb11398e29b..396ab2e2758da4a32390e6b1ddea8fcbfef67499 100644 GIT binary patch delta 2347 zcmai0T})F~96#rNwe*vIAc&yUmO+I&iTFL8h~U>|R?#^Tb(LF$3J9lFCtlW)ZCRNl zUUE%V78C2Thc>tc!V5kPmMy`VY`syJ=7t9zjLTk@TFnyou+eiSFEgm#vkc)+&wA9nyEq9_eq!1$9z2 zTNC6weSO|uUNJT|A3fti=uB5{U$>{-t1#^s`mQJ}^7NkbDs;EE*Qr8!oLOOdF7RGt zz$_w#Q|LfXpF$z80=xVwtf*KVsE`=dBrWoKx={rdNs#|Ku4f1=6lg+@Bqzn$uYwC2 zU8pf>Fr@*-TEkS5EBM?u4`cRbLqNdw3_!!Vb^E_xzxw0*QX(inwN+ig19aGM=Fm@rl8A92+w z8aqGN09GS?$Q`WP3A9x&(j2h3UZnAqTVABAG4+%0cBiaq7c*O;ZKl;fu(oD3^OM2W zte1Z0zF^m4^QNgwDlY}MPR$n_V2+?wScO&)Qc4Iz2>xsU(S(qEah(D`Le)fc60(kv zT0&|tQJ_bGXBF74Kpw5Z3TePl3HMG#4GYj+fMt^BSp?HBK_ClMjEI*&T7=agUMH!?8Pdht2H8lIN!7nVa>`lGNmhy!!*0s^%t<>4g&fnMg3mGT}POdH;8 z-tR3uRbE>3%j&Y(mq`sE?=sTI03PC#$_ns2E~5xhy})L7#sx?@GlORWT#omtrG&az zx?w6T*5-7tus<=CnJ59`)1IvjuEs;jVy+B+k87gC3oa0J@r<`%Y%kNeLe!8 z&)38)wJeD)95e>V0m}?4&j}jAC}@Sk@$3d6kS>^atjF1NhwLYmF!oj?@dF1vphwm*p=lX>*7`2U#Vb zwIVoRxr}NnF5xp?TXDIIa9usyajVDxzm)h9%;Tov33M(&z78v$7KJ{0u_J?h1^P1Z z#+t5x0(%su)6?CdsM^o)-tK@$QTekB>koKPK%p)p{B$8$BmHS@vXzjD2ZY?F_-$t|Z68&ApHhERLh7H$}}4|R&P*dTgF8*x`@ z8r9^w%GmyBd(0MVh}&bHc;(l=lu<>WhAAshsYAA;x*+ThUgMHlod}0FhxR@;m_++c z=9X$qHR_7mWV8K&!4cXwZ#0V=Z(45^j}?#ZjMm8(#{*+!!cZC7_t>;T?2p(YZfSKI zSlNRx%q|#ySL?JX zermcwcI}j%yTW{!$vg6L>AF~hywW8Xt)HMLj!nBKPs~{5O-(cXa{c}}n_PcL-tZ2I zdCq|XL&9K>?ujw6vlEVo>Mcp5N%F051gmRf{Ozk@I($rY51)v@;ddi-vaU>4mnW-g zUTeZpfw=Z%lvUQ3NBU)51>U{RA*(Bs|L2fW1G7~;H`-hlrJ~1g>ts_cUf7m+_w zRE-E+GmuvFxqGtX0y@+9+OCc^NRy?dnnNUxkZ-3RmHrHmY$53k3fp_Jr|$|<6YDlY zNcUNCIgmDn$d5+m)NwivuO=jo1&Kt~LFBToL-NiRL3=UKe>J8RnQQ4O<&Bqrf}Nwj2j<#{kH&3Y3`{9g#SNQMegM z4zScDa#uOR$PA9#_MD|RrvQbeYm%YT;cbSY>s${9WH!euyaM0#0H8u-R(P46A&2FJ zEG@1!#)W^R`YLl-4u|Yf$m3OA3-?rgzSRJ7;(tfvOF z|8lel+s-)D7!7{Tfw@HvklL9U(tGtAL5vFLNKU6gM8HbpV*`B# zItY+{PGm=SG)Ba(vBT3NwU*G}IND1c+2OIQ1}8OcG%+!rDIfeq*>pZsCNl&40hRn=k^5A)}sRs@Eg8!4zyl+Ej$otj}7S*cuT{%<*4QvQ6 zID2=aU8BrIA8X^<5sRNYv+5m+PY5e6@YHUER0nxanMQ&L1g7 z%l5#UKA0a^H%M1wvoUpGF>o`y5T1Xn)K_){*9@VD`cQu07i*JxzUV8S!p~KKo$o2| z8AE54)|$