From d15f940da6dbe6011e8309b139cdf60f44e26734 Mon Sep 17 00:00:00 2001 From: Theodor Chikin Date: Wed, 8 Oct 2025 15:55:22 +0300 Subject: [PATCH] implemented FFT_naive function. It just calculated DFT inside. But DFT should be substituted by FFT function (its only arg -- inp arr. It returns F(k)) --- naive_DFT.py | 54 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/naive_DFT.py b/naive_DFT.py index bcf45ce..f282378 100755 --- a/naive_DFT.py +++ b/naive_DFT.py @@ -5,7 +5,7 @@ from plotly.subplots import make_subplots FP_acc = 1e3 -INP_L = 1000 +INP_L = 1024 F_nyquist = INP_L//2 @@ -22,7 +22,7 @@ def abs_FP(re, im): return int(sqrt(re*re + im*im)) def sqrt_FP(val): - print(val) + #print(val) return int(sqrt(val)) def DFT_naive(inp, out): @@ -41,7 +41,7 @@ def DFT_naive(inp, out): def abs_FP(re, im): # return sqrt(re*re + im*im) - return int(sqrt(re*re + im*im)) + return int(sqrt(re*re + im*im)/FP_acc) trigon_debug = 0 @@ -89,7 +89,7 @@ def sin_FP(phi_fp): return sin_FP_constrained(phi_fp) -sin_05_debug = 1 +sin_05_debug = 0 def sin_FP_constrained(phi_fp): phi_trh = pi_FP/16 @@ -141,7 +141,7 @@ def DFT_naive_FP(inp_float, out): phi = 2*pi_FP*f*n/INP_L phi_sin = sin_FP(phi) phi_cos = cos_FP(phi) - print(phi, phi_sin, phi_cos) + #print(phi, phi_sin, phi_cos) val_re += inp[n] * phi_sin /INP_L val_im += inp[n] * phi_cos /INP_L @@ -149,21 +149,57 @@ def DFT_naive_FP(inp_float, out): print("F, val_abs:",f, val_abs) out[f] = val_abs + +def FFT_naive(inp, out): + for f in range(len(out)): + val_re = 0 + val_im = 0 + for n in range(len(inp)): + phi = 2*pi*f*n/INP_L + val_re += inp[n] * sin(phi) /INP_L + val_im += inp[n] * cos(phi) /INP_L + + val_abs = abs_f(val_re, val_im) + print("F, val_abs:",f, val_abs) + out[f] = val_abs + + +def FFT_tester(): + inp = [-1 + 0.01*i + sin(2*pi*i/10) + cos(2*pi*i/20) + sin(2*pi*i/250) + sin(2*pi*i/2.001) for i in range(INP_L)] +# inp = [sin(2*pi*i/2.001)for i in range(INP_L)] + out_DFT = [0 for i in range(F_nyquist + 1)] + out_FFT = [0 for val in range(F_nyquist + 1)] + DFT_naive(inp, out_DFT) + FFT_naive(inp, out_FFT) + Fourier_error = [] + for a,b in zip(out_FFT, out_DFT): + Fourier_error.append(a - b) + chart = make_subplots(rows=3, cols=1) + chart.add_trace(go.Scatter(x=[i for i in range(len(inp))], y=inp, name="inp", mode="markers+lines"), row=1, col=1) + chart.add_trace(go.Scatter(x=[i for i in range(len(out_DFT))], y=out_DFT, name="out_DFT", mode="markers+lines"), row=2, col=1) + chart.add_trace(go.Scatter(x=[i for i in range(len(out_FFT))], y=out_FFT, name="out_FFT", mode="markers+lines"), row=2, col=1) + chart.add_trace(go.Scatter(x=[i for i in range(len(Fourier_error))], y=Fourier_error, name="error", mode="markers+lines"), row=3, col=1) + chart.show() -def main(): + +def DFT_tester(): inp = [-1 + 0.01*i + sin(2*pi*i/10) + cos(2*pi*i/20) + sin(2*pi*i/250) + sin(2*pi*i/2.001) for i in range(INP_L)] # inp = [sin(2*pi*i/2.001)for i in range(INP_L)] out_float = [0 for i in range(F_nyquist + 1)] out_FP = [0 for val in out_float] DFT_naive(inp, out_float) DFT_naive_FP(inp, out_FP) - chart = make_subplots(rows=2, cols=1) + FP_error = [] + for a,b in zip(out_float, out_FP): + FP_error.append(a - b/FP_acc) + chart = make_subplots(rows=3, cols=1) chart.add_trace(go.Scatter(x=[i for i in range(len(inp))], y=inp, name="inp", mode="markers+lines"), row=1, col=1) chart.add_trace(go.Scatter(x=[i for i in range(len(out_float))], y=out_float, name="out_float", mode="markers+lines"), row=2, col=1) chart.add_trace(go.Scatter(x=[i for i in range(len(out_FP))], y=[val/FP_acc for val in out_FP], name="out_FP", mode="markers+lines"), row=2, col=1) + chart.add_trace(go.Scatter(x=[i for i in range(len(out_FP))], y=FP_error, name="FP_error", mode="markers+lines"), row=3, col=1) chart.show() @@ -196,4 +232,6 @@ def sin_tester(): if __name__ == "__main__": #main() - sin_tester() +# DFT_tester() + FFT_tester() + #sin_tester()