implemented FFT_naive function. It just calculated DFT inside. But DFT should be substituted by FFT function (its only arg -- inp arr. It returns F(k))
This commit is contained in:
54
naive_DFT.py
54
naive_DFT.py
@ -5,7 +5,7 @@ from plotly.subplots import make_subplots
|
|||||||
|
|
||||||
FP_acc = 1e3
|
FP_acc = 1e3
|
||||||
|
|
||||||
INP_L = 1000
|
INP_L = 1024
|
||||||
|
|
||||||
|
|
||||||
F_nyquist = INP_L//2
|
F_nyquist = INP_L//2
|
||||||
@ -22,7 +22,7 @@ def abs_FP(re, im):
|
|||||||
return int(sqrt(re*re + im*im))
|
return int(sqrt(re*re + im*im))
|
||||||
|
|
||||||
def sqrt_FP(val):
|
def sqrt_FP(val):
|
||||||
print(val)
|
#print(val)
|
||||||
return int(sqrt(val))
|
return int(sqrt(val))
|
||||||
|
|
||||||
def DFT_naive(inp, out):
|
def DFT_naive(inp, out):
|
||||||
@ -41,7 +41,7 @@ def DFT_naive(inp, out):
|
|||||||
|
|
||||||
def abs_FP(re, im):
|
def abs_FP(re, im):
|
||||||
# return sqrt(re*re + im*im)
|
# return sqrt(re*re + im*im)
|
||||||
return int(sqrt(re*re + im*im))
|
return int(sqrt(re*re + im*im)/FP_acc)
|
||||||
|
|
||||||
trigon_debug = 0
|
trigon_debug = 0
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ def sin_FP(phi_fp):
|
|||||||
return sin_FP_constrained(phi_fp)
|
return sin_FP_constrained(phi_fp)
|
||||||
|
|
||||||
|
|
||||||
sin_05_debug = 1
|
sin_05_debug = 0
|
||||||
|
|
||||||
def sin_FP_constrained(phi_fp):
|
def sin_FP_constrained(phi_fp):
|
||||||
phi_trh = pi_FP/16
|
phi_trh = pi_FP/16
|
||||||
@ -141,7 +141,7 @@ def DFT_naive_FP(inp_float, out):
|
|||||||
phi = 2*pi_FP*f*n/INP_L
|
phi = 2*pi_FP*f*n/INP_L
|
||||||
phi_sin = sin_FP(phi)
|
phi_sin = sin_FP(phi)
|
||||||
phi_cos = cos_FP(phi)
|
phi_cos = cos_FP(phi)
|
||||||
print(phi, phi_sin, phi_cos)
|
#print(phi, phi_sin, phi_cos)
|
||||||
val_re += inp[n] * phi_sin /INP_L
|
val_re += inp[n] * phi_sin /INP_L
|
||||||
val_im += inp[n] * phi_cos /INP_L
|
val_im += inp[n] * phi_cos /INP_L
|
||||||
|
|
||||||
@ -149,21 +149,57 @@ def DFT_naive_FP(inp_float, out):
|
|||||||
print("F, val_abs:",f, val_abs)
|
print("F, val_abs:",f, val_abs)
|
||||||
out[f] = val_abs
|
out[f] = val_abs
|
||||||
|
|
||||||
|
|
||||||
|
def FFT_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 FFT_tester():
|
||||||
|
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_DFT = [0 for i in range(F_nyquist + 1)]
|
||||||
|
out_FFT = [0 for val in range(F_nyquist + 1)]
|
||||||
|
DFT_naive(inp, out_DFT)
|
||||||
|
FFT_naive(inp, out_FFT)
|
||||||
|
Fourier_error = []
|
||||||
|
for a,b in zip(out_FFT, out_DFT):
|
||||||
|
Fourier_error.append(a - b)
|
||||||
|
chart = make_subplots(rows=3, 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_DFT))], y=out_DFT, name="out_DFT", mode="markers+lines"), row=2, col=1)
|
||||||
|
chart.add_trace(go.Scatter(x=[i for i in range(len(out_FFT))], y=out_FFT, name="out_FFT", mode="markers+lines"), row=2, col=1)
|
||||||
|
chart.add_trace(go.Scatter(x=[i for i in range(len(Fourier_error))], y=Fourier_error, name="error", mode="markers+lines"), row=3, col=1)
|
||||||
|
chart.show()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
|
def DFT_tester():
|
||||||
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 = [-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)]
|
# inp = [sin(2*pi*i/2.001)for i in range(INP_L)]
|
||||||
out_float = [0 for i in range(F_nyquist + 1)]
|
out_float = [0 for i in range(F_nyquist + 1)]
|
||||||
out_FP = [0 for val in out_float]
|
out_FP = [0 for val in out_float]
|
||||||
DFT_naive(inp, out_float)
|
DFT_naive(inp, out_float)
|
||||||
DFT_naive_FP(inp, out_FP)
|
DFT_naive_FP(inp, out_FP)
|
||||||
chart = make_subplots(rows=2, cols=1)
|
FP_error = []
|
||||||
|
for a,b in zip(out_float, out_FP):
|
||||||
|
FP_error.append(a - b/FP_acc)
|
||||||
|
chart = make_subplots(rows=3, 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(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_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.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.add_trace(go.Scatter(x=[i for i in range(len(out_FP))], y=FP_error, name="FP_error", mode="markers+lines"), row=3, col=1)
|
||||||
chart.show()
|
chart.show()
|
||||||
|
|
||||||
|
|
||||||
@ -196,4 +232,6 @@ def sin_tester():
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
#main()
|
#main()
|
||||||
sin_tester()
|
# DFT_tester()
|
||||||
|
FFT_tester()
|
||||||
|
#sin_tester()
|
||||||
|
|||||||
Reference in New Issue
Block a user