'defdbl a-z
'pi = 2*asin(1)
dim xx_r
(sw
-1), xx_i
(sw
-1)
x_r
(i
) = 100*sin(2*pi
*(sw
*2000/44000)*i
/sw
) + (100*rnd - 50)
'screenres sw, sh, 32
'plot signal
_printstring (0, 0), "2000 kHz signal with RND noise sampled at 44 kHz in 1024 samples"
rfft xx_r(), xx_i(), x_r(), sw
'plot its fft
pset (0, 50+3*sh
/4 - 0.005*sqr(xx_r
(0)*xx_r
(0) + xx_i
(0)*xx_i
(0)) ), _rgb(255,255,0) line -(i
*2, 50+3*sh
/4 - 0.005*sqr(xx_r
(i
)*xx_r
(i
) + xx_i
(i
)*xx_i
(i
)) ), _rgb(255,255,0)
'find peak
max = 0
m = 0
d
= 0.01*sqr(xx_r
(i
)*xx_r
(i
) + xx_i
(i
)*xx_i
(i
)) max = d
m = i
_printstring (0, sh
/2 + 16), "f_peak = m_peak * 44 kHz / 1024 samples = "+str$(m
*44000/1024)+" Hz"
'apply frequency correction, only works for some signals
u_r = xx_r(m - 1) - xx_r(m + 1)
u_i = xx_i(m - 1) - xx_i(m + 1)
v_r = 2*xx_r(m) - xx_r(m - 1) - xx_r(m + 1)
v_i = 2*xx_i(m) - xx_i(m - 1) - xx_i(m + 1)
c = (u_r*v_r + u_i*v_i)/(v_r*v_r + v_i*v_i)
sub rfft
(xx_r
(), xx_i
(), x_r
(), n
)
rev = 0
if i
and (2^j
) then rev
= rev
+ (2^(log2n
- 1 - j
))
xx_r(i) = x_r(2*rev)
xx_i(i) = x_r(2*rev + 1)
m = 2^i
w_r = 1
w_i = 0
p = j + k
q = p + (m \ 2)
u_r = w_r*xx_r(q) - w_i*xx_i(q)
u_i = w_r*xx_i(q) + w_i*xx_r(q)
v_r = xx_r(p)
v_i = xx_i(p)
xx_r(p) = v_r + u_r
xx_i(p) = v_i + u_i
xx_r(q) = v_r - u_r
xx_i(q) = v_i - u_i
u_r = w_r
u_i = w_i
w_r = u_r*wm_r - u_i*wm_i
w_i = u_r*wm_i + u_i*wm_r
xx_r(n/2) = xx_r(0)
xx_i(n/2) = xx_i(0)
xx_r(n/2 + i) = xx_r(n/2 - i)
xx_i(n/2 + i) = xx_i(n/2 - i)
xpr = (xx_r(i) + xx_r(n/2 + i)) / 2
xpi = (xx_i(i) + xx_i(n/2 + i)) / 2
xmr = (xx_r(i) - xx_r(n/2 + i)) / 2
xmi = (xx_i(i) - xx_i(n/2 + i)) / 2
xx_r
(i
) = xpr
+ xpi
*cos(2*pi
*i
/n
) - xmr
*sin(2*pi
*i
/n
) xx_i
(i
) = xmi
- xpi
*sin(2*pi
*i
/n
) - xmr
*cos(2*pi
*i
/n
)
'symmetry, complex conj
xx_r(n/2 + i) = xx_r(n/2 - 1 - i)
xx_i(n/2 + i) =-xx_i(n/2 - 1 - i)