'defdbl a-z
'''
'''
'pi = 2*asin(1)
DIM x_r
(sw
- 1), x_i
(sw
- 1) DIM xx_r
(sw
- 1), xx_i
(sw
- 1)
'''
AudioFile$ = "01.mp3"
Left = _MEMSOUND(S, 1)
Right = _MEMSOUND(S, 2)
'''
'''
i = 0: j = 0 ' reset previous values
Position&
= _SNDGETPOS(S
) * _SNDRATE * 2 ' *2, because sound data are in INTEGER format and INTEGER is always 2 byte long IF Position&
> 1024 AND Position&
< Left.SIZE
- 1024 THEN 'current (actual playing) sound frame is in middle - in position Position& j& = Position& - 1022
i = i + 1
j& = j& + 2
test& = j& - Position&
'FOR i = 0 TO sw - 1
'x_r(i) = 100 * SIN(2 * pi * (sw * 20000 / 44000) * i / sw) + (100 * RND - 50) '_Vince's signal generator in original source code
'NEXT
i = 0
j& = 0
'''
'screenres sw, sh, 32
'SCREEN _NEWIMAGE(sw, sh, 32)
'plot signal
PSET (0, sh
/ 4 - x_r
(0)) LINE -(i
, sh
/ 4 - x_r
(i
)), _RGB(255, 0, 0)
' _PRINTSTRING (0, 0), "2000 Hz 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) LINE (0, 50 + 3 * sh
/ 4)-STEP(sw
, 0), _RGB(255, 255, 0), , &H5555
'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
' DIM c AS DOUBLE
' DIM u_r AS DOUBLE, u_i AS DOUBLE
' DIM v_r AS DOUBLE, v_i AS DOUBLE
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)
F
= (m
+ c
) * _SNDRATE / 1024 ' 1024 = number of samples _PRINTSTRING (0, sh
/ 2 + 2 * 16), "f_corrected = " + STR$(F
) '(m + c) * 44000 / 1024) + " Hz"
'If signal is contained in some range, add 30 pixels for Y coordinate (analyzer go up, its wroted as bottom - this value)
CASE 20 TO 125: Analyzer
(1) = Analyzer
(1) + 30 'areas set by picture on google... CASE 126 TO 300: Analyzer
(2) = Analyzer
(2) + 30 CASE 300 TO 500: Analyzer
(3) = Analyzer
(3) + 30 CASE 500 TO 1000: Analyzer
(4) = Analyzer
(4) + 30 CASE 1001 TO 2000: Analyzer
(5) = Analyzer
(5) + 30 CASE 2001 TO 4000: Analyzer
(6) = Analyzer
(6) + 30 CASE 4001 TO 8000: Analyzer
(7) = Analyzer
(7) + 30 CASE IS > 8001: Analyzer
(8) = Analyzer
(8) + 30
'analyzer overflow control
FOR analyze
= 1 TO 8 ' analyze 8 spectrums IF Analyzer
(analyze
) > 150 THEN Analyzer
(analyze
) = 100
'draw analyzer
AnC = 0
AnC = AnC + 1
FreqHeight = Analyzer(AnC) ' Y coordinate for drawing frequency analyzer, maximal size is 150 pixels
LINE (AnalyzatorX
- 4, 400)-(AnalyzatorX
+ 4, 400 - FreqHeight
), &HFFAD0000, BF
IF Analyzer
(AnC
) > 0 THEN Analyzer
(AnC
) = Analyzer
(AnC
) - 1 ' always, if analyzer contains some higher position than bottom, give one pixel out
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)