moved python3 prototyping to the python folder

This commit is contained in:
2025-10-09 13:47:29 +03:00
parent aa5945e8b2
commit e7cec37ac5
8 changed files with 65037 additions and 65037 deletions

124
python/naive_DFT.py Executable file
View File

@ -0,0 +1,124 @@
#!/usr/bin/python3
from math import sin, cos, pi, sqrt
import plotly.graph_objs as go
from plotly.subplots import make_subplots
from FFT import FFT_real
from FP_trigonometry import *
INP_L = 1024
F_nyquist = INP_L//2
def abs_f(re, im):
return sqrt(re*re + im*im)
def DFT_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 DFT_naive_FP(inp_float, out):
inp = [val*FP_acc for val in inp_float]
for f in range(len(out)):
val_re = 0
val_im = 0
for n in range(len(inp)):
phi = 2*pi_FP*f*n/INP_L
phi_sin = sin_FP(phi)
phi_cos = cos_FP(phi)
#print(phi, phi_sin, phi_cos)
val_re += inp[n] * phi_sin /INP_L
val_im += inp[n] * phi_cos /INP_L
val_abs = abs_FP(val_re, val_im)
#print("F, val_abs:",f, val_abs)
out[f] = val_abs
def FFT_naive(inp, out):
fft_out = FFT_real(inp)
for i in range(len(fft_out)):
val = fft_out[i]/len(inp)
if (i < len(out)):
out[i] = val
else:
pass
#out.append(val)
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.update_xaxes(matches="x2", row=3, col=1)
chart.show()
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)
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.update_xaxes(matches="x2", row=3, col=1)
chart.show()
if __name__ == "__main__":
#main()
# DFT_tester()
FFT_tester()
#sin_tester()