commit c067cab219a0a3278b7d8c5f0bfe315195a137ea Author: Theodor Chikin Date: Tue Oct 7 16:42:47 2025 +0300 initial commit. There is DFT and DFT_fixed_point implemented. Now fixed-point SIN is testing diff --git a/naive_DFT.py b/naive_DFT.py new file mode 100755 index 0000000..2788976 --- /dev/null +++ b/naive_DFT.py @@ -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() diff --git a/plotter.py b/plotter.py new file mode 100755 index 0000000..fb928d4 --- /dev/null +++ b/plotter.py @@ -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() +