#!/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()