105 lines
2.4 KiB
Python
Executable File
105 lines
2.4 KiB
Python
Executable File
#!/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()
|