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()