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 task,taskparams |
---|
9 | from aubio.aubioclass import fvec |
---|
10 | from aubio.gnuplot import gnuplot_create |
---|
11 | from aubio.aubiowrapper import * |
---|
12 | |
---|
13 | usage = "usage: %s [options] -i soundfile" % sys.argv[0] |
---|
14 | |
---|
15 | def parse_args(): |
---|
16 | from optparse import OptionParser |
---|
17 | parser = OptionParser(usage=usage) |
---|
18 | parser.add_option("-i","--input", |
---|
19 | action="store", dest="filename", |
---|
20 | help="input sound file") |
---|
21 | parser.add_option("-n","--printframe", |
---|
22 | action="store", dest="printframe", default=-1, |
---|
23 | help="make a plot of the n_th frame") |
---|
24 | parser.add_option("-x","--xsize", |
---|
25 | action="store", dest="xsize", default=1., |
---|
26 | help="define xsize for plot") |
---|
27 | parser.add_option("-y","--ysize", |
---|
28 | action="store", dest="ysize", default=1., |
---|
29 | help="define ysize for plot") |
---|
30 | parser.add_option("-O","--outplot", |
---|
31 | action="store", dest="outplot", default=None, |
---|
32 | help="save plot to output.{ps,png}") |
---|
33 | (options, args) = parser.parse_args() |
---|
34 | if not options.filename: |
---|
35 | print "no file name given\n", usage |
---|
36 | sys.exit(1) |
---|
37 | return options, args |
---|
38 | |
---|
39 | def plotdata(x,y,plottitle="",**keyw): |
---|
40 | import Gnuplot |
---|
41 | return Gnuplot.Data(x, y, title="%s" % plottitle,**keyw) |
---|
42 | |
---|
43 | options, args = parse_args() |
---|
44 | filename = options.filename |
---|
45 | xsize = float(options.xsize) |
---|
46 | ysize = float(options.ysize)*2 |
---|
47 | |
---|
48 | printframe = int(options.printframe) |
---|
49 | if printframe == -1: |
---|
50 | print "Will wait for ^D to skip to next plot" |
---|
51 | print "Press enter before to print to file" |
---|
52 | |
---|
53 | |
---|
54 | g = gnuplot_create() |
---|
55 | params = taskparams() |
---|
56 | params.hopsize = 2048 # 512 |
---|
57 | params.bufsize = params.hopsize #2048 |
---|
58 | taskfile = task(filename,params=params) |
---|
59 | |
---|
60 | yin = fvec(params.bufsize/2,1) |
---|
61 | |
---|
62 | t = [i for i in range(params.bufsize)] |
---|
63 | a = [0 for i in range(params.bufsize)] |
---|
64 | |
---|
65 | while (taskfile.readsize == params.hopsize): |
---|
66 | taskfile() |
---|
67 | |
---|
68 | n = [i for i in range(params.bufsize/2)] |
---|
69 | a = [taskfile.myvec.get(i,0) for i in range(params.hopsize/2)] |
---|
70 | aubio_pitchyin_diff(taskfile.myvec(),yin()) # compute d[t] |
---|
71 | c = [yin.get(i,0) for i in range(params.bufsize/2)] |
---|
72 | aubio_pitchyin_getcum(yin()) # compute d'[t] |
---|
73 | y = [yin.get(i,0) for i in range(params.bufsize/2)] |
---|
74 | thresh = [0.1 for i in range(params.bufsize/2)] |
---|
75 | #t.append((i/float(params.hopsize)+taskfile.frameread)*params.step),t.pop(0) |
---|
76 | d = [plotdata(n,a,plottitle="signal", with='lines'), |
---|
77 | plotdata(n,c,plottitle="d[t]",axes='x1y2', with='lines lt 1'), |
---|
78 | plotdata(n,y,plottitle="d'[t]",axes='x1y1', with='lines lt 2'), |
---|
79 | plotdata(n,thresh,plottitle="threshold",axes='x1y1', with='lines lt 3')] |
---|
80 | #g('set xrange [%f:%f]' % (t[0],t[-1])) |
---|
81 | #time.sleep(.2) |
---|
82 | g.reset() |
---|
83 | g('set yrange [-1:3]') |
---|
84 | g('set xrange [0:%d]' % (params.bufsize/2)) |
---|
85 | g('set title \"%s\"' % "Example of period detection using YIN") |
---|
86 | if printframe == -1: |
---|
87 | g.replot(*d) |
---|
88 | a = sys.stdin.read() |
---|
89 | if a == "\n" or printframe == taskfile.frameread: |
---|
90 | from os.path import basename |
---|
91 | outplot = "_".join([basename(sys.argv[0]),'_'.join(basename(filename).split('.')),"%d" % taskfile.frameread]) |
---|
92 | print outplot |
---|
93 | f = gnuplot_create(outplot=outplot,extension='ps') |
---|
94 | f('set size %f,%f;' % (xsize,ysize) ) |
---|
95 | f('set lmargin %f' % (15*xsize)) |
---|
96 | f('set rmargin %f' % (10*xsize)) |
---|
97 | #f('set title \"%s\"' % "Example of period detection using YIN") |
---|
98 | f('set multiplot') |
---|
99 | f.ylabel('amplitude',offset=(+.5,0)) |
---|
100 | f.xlabel('time (samples)') |
---|
101 | f('set size %f,%f;' % (xsize,ysize*0.4) ) |
---|
102 | f('set orig %f,%f;' % (0,ysize*0.6) ) |
---|
103 | sigmax = max(abs(min(a)),abs(max(a))) |
---|
104 | f('set yrange [%f:%f]' % (-1.3*sigmax,1.3*sigmax)) |
---|
105 | f('set xrange [0:%d]' % (params.bufsize/2)) |
---|
106 | f.plot(d[0]) |
---|
107 | |
---|
108 | f.ylabel('') |
---|
109 | f.xlabel('lag (samples)') |
---|
110 | f('set bmargin %f' % (4*ysize)) |
---|
111 | f('set size %f,%f;' % (xsize,ysize*0.6) ) |
---|
112 | f('set orig %f,%f;' % (0,0) ) |
---|
113 | f('set autoscale') |
---|
114 | f('set xrange [0:%d]' % (params.bufsize/2)) |
---|
115 | f('set notitle') |
---|
116 | f('set y2tics') |
---|
117 | f('set ytics nomirror') |
---|
118 | f('set noytics') |
---|
119 | f('set key right') |
---|
120 | f.plot(d[1]) |
---|
121 | |
---|
122 | f.ylabel('amplitude') |
---|
123 | f.xlabel('') |
---|
124 | f('set y2tics nomirror') |
---|
125 | f('set ytics nomirror') |
---|
126 | f('set noy2tics') |
---|
127 | f('set noxtics') |
---|
128 | f('set ytics') |
---|
129 | f('set key left') |
---|
130 | f.plot(d[2],d[3]) |
---|
131 | #f('set yrange [-1:3]') |
---|
132 | #f.plot(*d) |
---|
133 | print "saved plot", outplot, 'ps' |
---|
134 | elif printframe < taskfile.frameread: |
---|
135 | break |
---|