History

add demo-tempo scripts add demo-tempo scripts

Paul Brossier committed 20 years ago

Commit aa3637a1 parent 742c9b82 files · +491 −0Browse files

Showing the changes to python/test (2 of 2 files). Show all

Unified · Split

2 files
  1. python/test/bench/tempo/demo-tempo +321 −0
  2. python/test/bench/tempo/demo-tempo-acf +170 −0
python/test/bench/tempo/demo-tempo+321−0
@@ -0,0 +1,321 @@
1+#! /usr/bin/python
2+
3+""" this file was written by Paul Brossier
4+ it is released under the GNU/GPL license.
5+"""
6+
7+import sys,time
8+from aubio.task import taskbeat,taskparams
9+from aubio.aubioclass import fvec, aubio_autocorr
10+from aubio.gnuplot import gnuplot_create
11+from aubio.aubiowrapper import *
12+from math import exp,log
13+
14+usage = "usage: %s [options] -i soundfile" % sys.argv[0]
15+
16+def parse_args():
17+ from optparse import OptionParser
18+ parser = OptionParser(usage=usage)
19+ parser.add_option("-i","--input",
20+ action="store", dest="filename",
21+ help="input sound file")
22+ parser.add_option("-n","--printframe",
23+ action="store", dest="printframe", default=-1,
24+ help="make a plot of the n_th frame")
25+ parser.add_option("-x","--xsize",
26+ action="store", dest="xsize", default=1.,
27+ type='float', help="define xsize for plot")
28+ parser.add_option("-y","--ysize",
29+ action="store", dest="ysize", default=1.,
30+ type='float', help="define ysize for plot")
31+ parser.add_option("-O","--outplot",
32+ action="store", dest="outplot", default=None,
33+ help="save plot to output.{ps,png}")
34+ (options, args) = parser.parse_args()
35+ if not options.filename:
36+ print "no file name given\n", usage
37+ sys.exit(1)
38+ return options, args
39+
40+def plotdata(x,y,plottitle="",**keyw):
41+ import Gnuplot
42+ return Gnuplot.Data(x, y, title="%s" % plottitle,**keyw)
43+
44+options, args = parse_args()
45+filename = options.filename
46+xsize = float(options.xsize)
47+ysize = float(options.ysize)
48+
49+printframe = int(options.printframe)
50+
51+if options.outplot and printframe > 0:
52+ extension = options.outplot.split('.')[-1]
53+ outplot = '.'.join(options.outplot.split('.')[:-1])
54+else:
55+ extension = ''
56+ outplot = None
57+f = gnuplot_create(outplot=outplot,extension=extension)
58+
59+params = taskparams()
60+params.onsetmode = 'specdiff'
61+task = taskbeat(filename,params=params)
62+
63+hopsize = params.hopsize
64+bufsize = params.bufsize
65+btstep = task.btstep
66+winlen = task.btwinlen
67+laglen = winlen/4
68+step = winlen/4
69+
70+timesig = 0
71+maxnumelem = 4
72+gp = 0
73+counter = 0
74+flagconst = 0
75+constthresh = 3.901
76+g_var = 3.901
77+rp = 0
78+rp1 = 0
79+rp2 = 0
80+g_mu = 0
81+
82+rayparam = 48/512.*winlen
83+
84+#t = [i for i in range(hopsize)]
85+#tlong = [i for i in range(hopsize*(btstep-1))]
86+#tall = [i for i in range(hopsize*btstep)]
87+#a = [0 for i in range(hopsize*btstep)]
88+dfx = [i for i in range(winlen)]
89+dfframe = [0 for i in range(winlen)]
90+dfrev = [0 for i in range(winlen)]
91+acframe = [0 for i in range(winlen)]
92+
93+localacf = [0 for i in range(winlen)]
94+inds = [0 for i in range(maxnumelem)]
95+
96+acx = [i for i in range(laglen)]
97+acfout = [0 for i in range(laglen)]
98+
99+phwv = [0 for i in range(2*laglen)]
100+phwvx = [i for i in range(2*laglen)]
101+
102+dfwvnorm = exp(log(2.0)*(winlen+2.)/rayparam);
103+dfwv = [exp(log(2.)*(i+1.)/rayparam)/dfwvnorm for i in range(winlen)]
104+
105+gwv = [exp(-.5*(j+1.-g_mu)**2/g_var**2) for j in range(laglen)]
106+rwv = [(i+1.)/rayparam**2 * exp(-(i+1.)**2 / (2.*rayparam)**2)
107+ for i in range(0,laglen)]
108+acf = fvec(winlen,1)
109+
110+nrframe = 0
111+while (task.readsize == params.hopsize):
112+ task()
113+ #print task.pos2
114+ #a[:-hopsize] = [i for i in a[-(btstep-1)*hopsize:]]
115+ #a[-hopsize:] = [task.myvec.get(i,0) for i in t]
116+
117+ #g('set xrange [%f:%f]' % (t[0],t[-1]))
118+ #time.sleep(.2)
119+ if task.pos2==btstep-1:
120+ nrframe += 1
121+ dfframe = [task.dfframe.get(i,0) for i in range(winlen)]
122+ if printframe == nrframe or printframe == -1:
123+ d = [[plotdata(range(-winlen,0),dfframe,plottitle="onset detection", with='lines')]]
124+ # start beattracking_do
125+ for i in range(winlen):
126+ dfrev[winlen-1-i] = 0.
127+ dfrev[winlen-1-i] = dfframe[i]*dfwv[i]
128+ aubio_autocorr(task.dfframe(),acf());
129+ acframe = [acf.get(i,0) for i in range(winlen)]
130+ if not timesig:
131+ numelem = 4
132+ else:
133+ numelem = timesig
134+
135+ old = 0
136+ acfout = [0 for i in range(winlen/4)]
137+ for i in range(1,laglen-1):
138+ for a in range(1,numelem+1):
139+ for b in range (1-a,a):
140+ acfout[i] += acframe[a*(i+1)+b-1] * 1./(2.*a-1.)*rwv[i]
141+ if old < acfout[i]:
142+ old = acfout[i]
143+ maxi = i
144+ rp = max(maxi,1);
145+
146+ if printframe == nrframe or printframe == -1:
147+ rwvs = [rwv[i]*max(acframe) for i in range(len(rwv))]
148+ d += [[plotdata(acx,acfout,plottitle="comb filterbank", with='lines', axes='x1y1'),
149+ plotdata([rp,rp],[1.2*old,min(acfout)],plottitle="period", with='impulses', axes='x1y1'),
150+ plotdata(acx,rwvs,plottitle="L_w", with='lines', axes='x1y1')]]
151+
152+ # getperiod
153+ inds = [0 for i in range(maxnumelem)]
154+ localacf = [0 for i in range(winlen)]
155+ period = 0
156+ for a in range(1,4+1):
157+ for b in range(1-a,a):
158+ localacf[a*rp+b-1] = acframe[a*rp+b-1]
159+ for i in range(numelem):
160+ maxindex = 0
161+ maxval = 0.0
162+ for j in range(rp*(i+1)+i):
163+ if localacf[j] > maxval:
164+ maxval = localacf[j]
165+ maxind = j
166+ localacf[j] = 0
167+ inds[i] = maxind
168+ for i in range(numelem):
169+ period += inds[i]/(i+1.)
170+ period = period/numelem
171+ #print "period", period
172+
173+ # checkstate
174+ if gp:
175+ # context dependant model
176+ acfout = [0 for i in range(winlen/4)]
177+ old = 0
178+ for i in range(laglen-1):
179+ for a in range(timesig):
180+ for b in range(1-a,a):
181+ acfout[i] += acframe[a*(i+1)+b-1] * gwv[i]
182+ if old < acfout[i]:
183+ old = acfout[i]
184+ maxi = i
185+ gp = maxi
186+ else:
187+ # general model
188+ gp = 0
189+ #print "gp", gp
190+ if printframe == nrframe or printframe == -1:
191+ gwvs = [gwv[i]*max(acfout) for i in range(len(gwv))]
192+ d += [[plotdata(acx,acfout,plottitle="comb filterbank", with='lines', axes='x1y1'),
193+ plotdata(gp,old,plottitle="period", with='impulses', axes='x1y1'),
194+ plotdata(acx,gwvs,plottitle="L_{gw}", with='lines', axes='x1y1')]]
195+
196+ if counter == 0:
197+ # initial step
198+ if abs(gp-rp) > 2.*constthresh:
199+ flagstep = 1
200+ counter = 3
201+ else:
202+ flagstep = 0
203+ #print "flagstep", flagstep
204+ #print "rp2,rp1,rp", rp2,rp1,rp
205+ acfw = [dfframe[i]*dfwv[i] for i in range(winlen)]
206+
207+ if counter == 1 and flagstep == 1:
208+ # "3rd frame after flagstep set"
209+ if abs(2.*rp-rp1- rp2) < constthresh:
210+ flagconst = 1
211+ counter = 0
212+ else:
213+ flagconst = 0
214+ counter = 2
215+ elif counter > 0:
216+ counter -= 1
217+
218+ rp2 = rp1; rp1 = rp
219+
220+ if flagconst:
221+ # "first run of new hypothesis"
222+ gp = rp
223+ g_mu = gp
224+ timesig = 4 #FIXME
225+ gwv = [exp(-.5*(j+1.-g_mu)**2/g_var**2) for j in range(laglen)]
226+ flagconst = 0
227+ bp = gp
228+ phwv = [1 for i in range(2*laglen)]
229+ elif timesig:
230+ # "contex dependant"
231+ bp = gp
232+ if step > lastbeat:
233+ phwv = [exp(-.5*(1.+j-step+lastbeat)**2/(bp/8.)) for j in range(2*laglen)]
234+ else:
235+ print "NOT using phase weighting"
236+ phwv = [1 for i in range(2*laglen)]
237+ else:
238+ # "initial state"
239+ bp = rp
240+ phwv = [1 for i in range(2*laglen)]
241+
242+ while bp < 25:
243+ print "WARNING, doubling the beat period"
244+ bp *= 2
245+
246+ #
247+ phout = [0. for i in range(winlen)]
248+
249+ kmax = int(winlen/float(bp));
250+
251+ old = 0
252+ for i in range(bp):
253+ phout[i] = 0.
254+ for k in range(kmax):
255+ phout[i] += dfrev[i+bp*k] * phwv[i]
256+ if phout[i] > old:
257+ old = phout[i]
258+ maxi = i
259+ maxindex = maxi
260+ if (maxindex == winlen - 1): maxindex = 0
261+ phase = 1 + maxindex
262+ i = 1
263+ beat = bp - phase
264+ beats= []
265+ if beat >= 0: beats.append(beat)
266+ while beat+bp < step:
267+ beat += bp
268+ beats.append(beat)
269+ lastbeat = beat
270+ #print beats,
271+ #print "the lastbeat is", lastbeat
272+
273+ # plot all this
274+ if printframe == nrframe or printframe == -1:
275+ phwvs = [phwv[i]*max(phout) for i in range(len(phwv))]
276+ d += [[plotdata(range(-laglen,0),phwvs[laglen:0:-1],plottitle="A_{gw}", with='lines',axes='x1y1'),
277+ plotdata(range(-laglen,0),phout[laglen:0:-1],plottitle="df", with='lines'),
278+ plotdata(-phase,old,plottitle="phase", with='impulses', axes='x1y1'),
279+ plotdata([i for i in beats],[old for i in beats],plottitle="predicted", with='impulses')
280+ ]]
281+ #d += [[plotdata(dfx,dfwv,plottitle="phase weighting", with='lines', axes='x1y2'),
282+ # plotdata(dfx,dfrev,plottitle="df reverse", with='lines', axes='x1y1')]]
283+ #d += [[plotdata(dfx,phout,plottitle="phase", with='lines', axes='x1y2')]]
284+ #d += [[plotdata(dfx,dfwv,plottitle="phase weighting", with='lines', axes='x1y2'),
285+ # plotdata(dfx,dfrev,plottitle="df reverse", with='lines', axes='x1y1')]]
286+ #d += [[plotdata(dfx,phout,plottitle="phase", with='lines', axes='x1y2')]]
287+
288+ f('set lmargin 4')
289+ f('set rmargin 4')
290+ f('set size %f,%f' % (1.0*xsize,1.0*ysize) )
291+ f('set key spacing 1.3')
292+ f('set multiplot')
293+
294+ f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
295+ f('set orig %f,%f' % (0.0*xsize,0.66*ysize) )
296+ f('set xrange [%f:%f]' % (-winlen,0) )
297+ f.title('Onset detection function')
298+ f.xlabel('time (df samples)')
299+ f.plot(*d[0])
300+ f('set size %f,%f' % (0.5*xsize,0.33*ysize) )
301+ f('set orig %f,%f' % (0.0*xsize,0.33*ysize) )
302+ f('set xrange [%f:%f]' % (0,laglen) )
303+ f.title('Period detection: Rayleygh weighting')
304+ f.xlabel('lag (df samples)')
305+ f.plot(*d[1])
306+ f('set size %f,%f' % (0.5*xsize,0.33*ysize) )
307+ f('set orig %f,%f' % (0.5*xsize,0.33*ysize) )
308+ f('set xrange [%f:%f]' % (0,laglen) )
309+ f.title('Period detection: Gaussian weighting')
310+ f.xlabel('lag (df samples)')
311+ f.plot(*d[2])
312+ f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
313+ f('set orig %f,%f' % (0.0*xsize,0.00*ysize) )
314+ f('set xrange [%f:%f]' % (-laglen,laglen) )
315+ f.title('Phase detection and predicted beats')
316+ f.xlabel('time (df samples)')
317+ f.plot(*d[3])
318+ f('set nomultiplot')
319+ if printframe == -1: a = sys.stdin.read()
320+ elif 0 < printframe and printframe < nrframe:
321+ break
python/test/bench/tempo/demo-tempo-acf+170−0
@@ -0,0 +1,170 @@
1+#! /usr/bin/python
2+
3+""" this file was written by Paul Brossier
4+ it is released under the GNU/GPL license.
5+"""
6+
7+import sys,time
8+from aubio.task import taskbeat,taskparams
9+from aubio.aubioclass import fvec, aubio_autocorr
10+from aubio.gnuplot import gnuplot_create
11+from aubio.aubiowrapper import *
12+from math import exp,log
13+
14+usage = "usage: %s [options] -i soundfile" % sys.argv[0]
15+
16+def parse_args():
17+ from optparse import OptionParser
18+ parser = OptionParser(usage=usage)
19+ parser.add_option("-i","--input",
20+ action="store", dest="filename",
21+ help="input sound file")
22+ parser.add_option("-n","--printframe",
23+ action="store", dest="printframe", default=-1,
24+ help="make a plot of the n_th frame")
25+ parser.add_option("-x","--xsize",
26+ action="store", dest="xsize", default=1.,
27+ type='float', help="define xsize for plot")
28+ parser.add_option("-y","--ysize",
29+ action="store", dest="ysize", default=1.,
30+ type='float', help="define ysize for plot")
31+ parser.add_option("-O","--outplot",
32+ action="store", dest="outplot", default=None,
33+ help="save plot to output.{ps,png}")
34+ (options, args) = parser.parse_args()
35+ if not options.filename:
36+ print "no file name given\n", usage
37+ sys.exit(1)
38+ return options, args
39+
40+def plotdata(x,y,plottitle="",**keyw):
41+ import Gnuplot
42+ return Gnuplot.Data(x, y, title="%s" % plottitle,**keyw)
43+
44+options, args = parse_args()
45+filename = options.filename
46+xsize = float(options.xsize)
47+ysize = float(options.ysize)
48+
49+printframe = int(options.printframe)
50+
51+if options.outplot and printframe > 0:
52+ extension = options.outplot.split('.')[-1]
53+ outplot = '.'.join(options.outplot.split('.')[:-1])
54+else:
55+ extension = ''
56+ outplot = None
57+f = gnuplot_create(outplot=outplot,extension=extension)
58+
59+params = taskparams()
60+params.onsetmode = 'specdiff'
61+task = taskbeat(filename,params=params)
62+
63+hopsize = params.hopsize
64+bufsize = params.bufsize
65+btstep = task.btstep
66+winlen = task.btwinlen
67+laglen = winlen/4
68+step = winlen/4
69+
70+timesig = 0
71+maxnumelem = 4
72+gp = 0
73+counter = 0
74+flagconst = 0
75+constthresh = 3.901
76+g_var = 3.901
77+rp = 0
78+rp1 = 0
79+rp2 = 0
80+g_mu = 0
81+
82+rayparam = 48/512.*winlen
83+
84+t = [i for i in range(hopsize)]
85+#tlong = [i for i in range(hopsize*(btstep-1))]
86+#tall = [i for i in range(hopsize*btstep)]
87+sig = [0 for i in range(hopsize*btstep)]
88+dfx = [i for i in range(winlen)]
89+dfframe = [0 for i in range(winlen)]
90+dfrev = [0 for i in range(winlen)]
91+acframe = [0 for i in range(winlen/2)]
92+
93+localacf = [0 for i in range(winlen)]
94+inds = [0 for i in range(maxnumelem)]
95+
96+acx = [i for i in range(laglen)]
97+acfout = [0 for i in range(laglen)]
98+
99+phwv = [0 for i in range(2*laglen)]
100+phwvx = [i for i in range(2*laglen)]
101+
102+dfwvnorm = exp(log(2.0)*(winlen+2.)/rayparam);
103+dfwv = [exp(log(2.)*(i+1.)/rayparam)/dfwvnorm for i in range(winlen)]
104+
105+gwv = [exp(-.5*(j+1.-g_mu)**2/g_var**2) for j in range(laglen)]
106+rwv = [(i+1.)/rayparam**2 * exp(-(i+1.)**2 / (2.*rayparam)**2)
107+ for i in range(0,laglen)]
108+acf = fvec(winlen,1)
109+
110+if options.outplot and printframe > 0:
111+ extension = options.outplot.split('.')[-1]
112+ outplot = '.'.join(options.outplot.split('.')[:-1])
113+else:
114+ extension = ''
115+ outplot = None
116+f = gnuplot_create(outplot=outplot,extension=extension)
117+nrframe = 0
118+while (task.readsize == params.hopsize):
119+ task()
120+ #print task.pos2
121+ sig[:-hopsize] = [i for i in sig[-(btstep-1)*hopsize:]]
122+ sig[-hopsize:] = [task.myvec.get(i,0) for i in t]
123+
124+ #g('set xrange [%f:%f]' % (t[0],t[-1]))
125+ #time.sleep(.2)
126+ if task.pos2==btstep-1:
127+ nrframe += 1
128+ dfframe = [task.dfframe.get(i,0) for i in range(winlen)]
129+ # start beattracking_do
130+ for i in range(winlen):
131+ dfrev[winlen-1-i] = 0.
132+ dfrev[winlen-1-i] = dfframe[i]*dfwv[i]
133+ aubio_autocorr(task.dfframe(),acf());
134+ acframe = [acf.get(i,0) for i in range(winlen/2)]
135+ if printframe == nrframe or printframe == -1:
136+ d = [[plotdata(range(btstep*hopsize),sig,plottitle="input signal", with='lines')]]
137+ d += [[plotdata(range(-winlen,0),dfframe,plottitle="onset detection", with='lines')]]
138+ d += [[plotdata(range(winlen/2),acframe,plottitle="autocorrelation", with='lines')]]
139+
140+ # plot all this
141+ if printframe == nrframe or printframe == -1:
142+
143+ f('set lmargin 4')
144+ f('set rmargin 4')
145+ f('set size %f,%f' % (1.0*xsize,1.0*ysize) )
146+ f('set key spacing 1.3')
147+ f('set multiplot')
148+
149+ f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
150+ f('set orig %f,%f' % (0.0*xsize,0.66*ysize) )
151+ f('set xrange [%f:%f]' % (0,btstep*hopsize) )
152+ f.title('Input signal')
153+ f.xlabel('time (samples)')
154+ f.plot(*d[0])
155+ f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
156+ f('set orig %f,%f' % (0.0*xsize,0.33*ysize) )
157+ f('set xrange [%f:%f]' % (-winlen,0) )
158+ f.title('Onset detection function')
159+ f.xlabel('time (df samples)')
160+ f.plot(*d[1])
161+ f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
162+ f('set orig %f,%f' % (0.0*xsize,0.00*ysize) )
163+ f('set xrange [%f:%f]' % (0,winlen/2) )
164+ f.title('Autocorrelation')
165+ f.xlabel('lag (df samples)')
166+ f.plot(*d[2])
167+ f('set nomultiplot')
168+ if printframe == -1: a = sys.stdin.read()
169+ elif 0 < printframe and printframe < nrframe:
170+ break

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t