demo_spectrogram.py: clarify, use log10(norm)
authorPaul Brossier <piem@piem.org>
Fri, 27 Jul 2012 16:36:29 +0000 (10:36 -0600)
committerPaul Brossier <piem@piem.org>
Fri, 27 Jul 2012 16:36:29 +0000 (10:36 -0600)
interfaces/python/demo_spectrogram.py

index 52402c866d67b5a7b6bed9edd660c28eff25d380..2801ee0bd18afb43e2c8c96f24bf2db2bec7d1b2 100755 (executable)
@@ -3,29 +3,30 @@
 import sys
 from aubio import pvoc, source
 from numpy import array, arange, zeros, shape, log10, vstack
-from pylab import imshow, show, gray, autumn, axis, ylabel, xlabel, xticks, yticks
+from pylab import imshow, show, cm, axis, ylabel, xlabel, xticks, yticks
 
 def get_spectrogram(filename):
-  win_s = 512                 # fft size
-  hop_s = win_s / 2           # hop size
-  fft_s = win_s / 2 + 1       # number of spectrum bins
-  samplerate = 16000
-  specgram = zeros([0, fft_s], dtype='float32')
-  a = source(filename, samplerate, hop_s)                 # mono 8kHz only please
+  samplerate = 44100
+  win_s = 512                                        # fft window size
+  hop_s = win_s / 2                                  # hop size
+  fft_s = win_s / 2 + 1                              # spectrum bins
+
+  a = source(filename, samplerate, hop_s)            # source file
   pv = pvoc(win_s, hop_s)                            # phase vocoder
+  specgram = zeros([0, fft_s], dtype='float32')      # numpy array to store spectrogram
+
+  # analysis
   while True:
     samples, read = a()                              # read file
-    #specgram = vstack((specgram,1.-log10(1.+pv(samples).norm)))   # store new norm vector
     specgram = vstack((specgram,pv(samples).norm))   # store new norm vector
     if read < a.hop_size: break
 
-  autumn()
-  from pylab import gray
-  gray()
-  imshow(specgram.T, origin = 'bottom', aspect = 'auto')
+  # plotting
+  imshow(log10(specgram.T), origin = 'bottom', aspect = 'auto', cmap=cm.gray_r)
   axis([0, len(specgram), 0, len(specgram[0])])
   ylabel('Frequency (Hz)')
   xlabel('Time (s)')
+  # show axes in Hz and seconds
   time_step = hop_s / float(samplerate)
   total_time = len(specgram) * time_step
   ticks = 10
@@ -33,9 +34,12 @@ def get_spectrogram(filename):
       [x * total_time / float(ticks) for x in range(ticks) ] )
   yticks( arange(ticks) / float(ticks) * len(specgram[0]),
       [x * samplerate / 2. / float(ticks) for x in range(ticks) ] )
-  show()
 
-if len(sys.argv) < 2:
-  print "Usage: %s <filename>" % sys.argv[0]
-else:
-  [get_spectrogram(soundfile) for soundfile in sys.argv[1:]]
+if __name__ == '__main__':
+  if len(sys.argv) < 2:
+    print "Usage: %s <filename>" % sys.argv[0]
+  else:
+    for soundfile in sys.argv[1:]:
+      get_spectrogram(soundfile)
+      # display graph
+      show()