History

python/demos/demo_pitch.py: add plotting

Paul Brossier committed 12 years ago

Commit c54b2c01 parent 3f27a981 file · +74 −10Browse files

Showing the changes to python (1 of 1 file). Show all

Unified · Split

python/demos/demo_pitch.py+74−10
@@ -1,10 +1,7 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3import sys3import sys
4from aubio import source, pitch4from aubio import source, pitch, freqtomidi
5
6win_s = 1024 # fft size
7hop_s = win_s # hop size
8 5
9if len(sys.argv) < 2:6if len(sys.argv) < 2:
10 print "Usage: %s <filename> [samplerate]" % sys.argv[0]7 print "Usage: %s <filename> [samplerate]" % sys.argv[0]
@@ -12,26 +9,93 @@ if len(sys.argv) < 2: · 1 unmodified line
12 9
13filename = sys.argv[1]10filename = sys.argv[1]
14 11
15samplerate = 012downsample = 1
13samplerate = 44100 / downsample
16if len( sys.argv ) > 2: samplerate = int(sys.argv[2])14if len( sys.argv ) > 2: samplerate = int(sys.argv[2])
17 15
16win_s = 4096 / downsample # fft size
17hop_s = 512 / downsample # hop size
18
18s = source(filename, samplerate, hop_s)19s = source(filename, samplerate, hop_s)
19samplerate = s.samplerate20samplerate = s.samplerate
20 21
21pitch_o = pitch("default", win_s, hop_s, samplerate)22tolerance = 0.8
22pitch_o.set_unit("midi")
23 23
24pitches = []24pitch_o = pitch("yin", win_s, hop_s, samplerate)
25pitch_o.set_unit("freq")
26pitch_o.set_tolerance(tolerance)
25 27
28pitches = []
29confidences = []
26 30
27# total number of frames read31# total number of frames read
28total_frames = 032total_frames = 0
29while True:33while True:
30 samples, read = s()34 samples, read = s()
31 pitch = pitch_o(samples)[0]35 pitch = pitch_o(samples)[0]
32 print "%f %f" % (total_frames / float(samplerate), pitch)36 #pitch = int(round(pitch))
33 #pitches += [pitches]37 confidence = pitch_o.get_confidence()
38 #if confidence < 0.8: pitch = 0.
39 print "%f %f %f" % (total_frames / float(samplerate), pitch, confidence)
40 pitches += [pitch]
41 confidences += [confidence]
34 total_frames += read42 total_frames += read
35 if read < hop_s: break43 if read < hop_s: break
36 44
45if 0: sys.exit(0)
46
37#print pitches47#print pitches
48from numpy import array, ma
49import matplotlib.pyplot as plt
50from demo_waveform_plot import get_waveform_plot, set_xlabels_sample2time
51
52skip = 1
53
54pitches = array(pitches[skip:])
55confidences = array(confidences[skip:])
56times = [t * hop_s for t in range(len(pitches))]
57
58fig = plt.figure()
59ax1 = fig.add_subplot(311)
60ax1 = get_waveform_plot(filename, samplerate = samplerate, block_size = hop_s, ax = ax1)
61ax1.set_xticklabels([])
62
63def array_from_text_file(filename, dtype = 'float'):
64 import os.path
65 from numpy import array
66 filename = os.path.join(os.path.dirname(__file__), filename)
67 return array([line.split() for line in open(filename).readlines()],
68 dtype = dtype)
69
70ax2 = fig.add_subplot(312, sharex = ax1)
71import sys, os.path
72ground_truth = os.path.splitext(filename)[0] + '.f0.Corrected'
73if os.path.isfile(ground_truth):
74 ground_truth = array_from_text_file(ground_truth)
75 true_freqs = ground_truth[:,2]
76 true_freqs = ma.masked_where(true_freqs < 2, true_freqs)
77 true_times = float(samplerate) * ground_truth[:,0]
78 ax2.plot(true_times, true_freqs, 'r')
79 ax2.axis( ymin = 0.9 * true_freqs.min(), ymax = 1.1 * true_freqs.max() )
80# plot raw pitches
81ax2.plot(times, pitches, '--g')
82# plot cleaned up pitches
83cleaned_pitches = pitches
84#cleaned_pitches = ma.masked_where(cleaned_pitches < 0, cleaned_pitches)
85#cleaned_pitches = ma.masked_where(cleaned_pitches > 120, cleaned_pitches)
86cleaned_pitches = ma.masked_where(confidences < tolerance, cleaned_pitches)
87ax2.plot(times, cleaned_pitches, '.-')
88#ax2.axis( ymin = 0.9 * cleaned_pitches.min(), ymax = 1.1 * cleaned_pitches.max() )
89#ax2.axis( ymin = 55, ymax = 70 )
90ax2.set_xticklabels([])
91
92# plot confidence
93ax3 = fig.add_subplot(313, sharex = ax1)
94# plot the confidence
95ax3.plot(times, confidences)
96# draw a line at tolerance
97ax3.plot(times, [tolerance]*len(confidences))
98ax3.axis( xmin = times[0], xmax = times[-1])
99plt.show()
100set_xlabels_sample2time(ax3, times[-1], samplerate)
101#plt.savefig(os.path.basename(filename) + '.png', dpi=200)

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