initial commit. There is DFT and DFT_fixed_point implemented. Now fixed-point SIN is testing

This commit is contained in:
2025-10-07 16:42:47 +03:00
commit c067cab219
2 changed files with 148 additions and 0 deletions

104
naive_DFT.py Executable file
View File

@ -0,0 +1,104 @@
#!/usr/bin/python3
from math import sin, cos, pi, sqrt
import plotly.graph_objs as go
from plotly.subplots import make_subplots
FP_acc = 1e2
INP_L = 1000
F_nyquist = INP_L//2
pi_FP = 1* FP_acc
def abs_f(re, im):
return sqrt(re*re + im*im)
def abs_FP(re, im):
return int(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 abs_FP(re, im):
# return sqrt(re*re + im*im)
return int(sqrt(re*re + im*im))
def sin_FP(phi_fp):
return sin(pi*(phi_fp/FP_acc)/(pi_FP/FP_acc))
def cos_FP(phi_fp):
return sin_FP(phi_fp - pi_FP/2)
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
val_re += inp[n] * sin_FP(phi) /INP_L
val_im += inp[n] * cos_FP(phi) /INP_L
val_abs = abs_FP(val_re, val_im)
print("F, val_abs:",f, val_abs)
out[f] = val_abs
def main():
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)
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.show()
def sin_tester():
N = 400
angs = [(N/2 - i)/100 for i in range(N)]
res_f = []
res_FP = []
for phi in angs:
res_f.append(sin(phi*pi))
res_FP.append(sin_FP(phi*FP_acc*pi_FP))
chart = go.Figure()
chart.add_trace(go.Scatter(x = angs, y=res_f, name="sin_float", mode="markers+lines"))
chart.add_trace(go.Scatter(x = angs, y=res_f, name="sin_FP", mode="markers+lines"))
chart.show()
if __name__ == "__main__":
#main()
sin_tester()

44
plotter.py Executable file
View File

@ -0,0 +1,44 @@
#!/usr/bin/pypy3
import plotly.graph_objs as go
from decimal import *
from sys import argv
def main():
chart = go.Figure()
chart.add_trace(go.Scatter(x=[1,2,3], y=[1,2,3]))
chart.show()
if __name__ == "__main__":
if len(argv) == 1:
main()
else:
chart = go.Figure()
filenames = argv[1:]
all_data = {}
for filename in filenames:
f = open(filename, "rt")
data = {"X":[], "Y":[]}
all_data[filename] = data
for line in f:
try:
line_splt = line.split(",")
print(line_splt)
x = line_splt[0]
y = line_splt[1]
#print(x,y)
x = float(x)
y = float(y)
data["X"].append(x)
data["Y"].append(y)
except ValueError:
pass
except IndexError:
pass
f.close()
print("data samples:",len(data["X"]))
chart.add_trace(go.Scatter(x=data["X"], y=data["Y"], name=filename))
# chart.update_layout(title=argv[1])
chart.show()