Provided by: python-numm_0.5-1_all bug

NAME

       spectral analysis - perform realtime spectral analysis

SYNOPSIS

       numm-run FILE

DESCRIPTION

       Frequency  makes for a meaningful description of many audio signals.  We can use numpy's fourier analysis
       to compute spectra from the microphone and display the results visually.  We will break down the  process
       into smaller parts: baby steps...

       First, create and save a skeletal file that moves a line across the screen:

              idx = 0
              def video_out(a):
                  global idx
                  a[:,idx] = 255
                  idx = (idx + 1) % a.shape[1]
              def audio_in(a):
                  pass

       Save this snippet and run it with numm-run.

       We  will  use  the  numpy.fft  module  for  our analysis.  First we define a function to get a particular
       frequency from the fourier transform:

              import numpy as np
              def get_freq(fourier, frequency):
                  freqs = np.fft.fftfreq(len(fourier), 1/44100.0)
                  nearest = (abs(freqs - frequency)).argmin()
                  return abs(fourier[nearest])

       Next, we hook up this function to audio input from the microphone.  A frequency bin is chosen  on  a  log
       scale for each row on the screen to display a spectogram.  In total:

              import numpy as np
              idx = 0
              recent_audio = np.zeros(4096, np.int16)
              recent_video = np.zeros((240,320,3), np.uint8)
              freq_bins = np.exp2(np.linspace(np.log2(27000),np.log2(27),240))

              def get_freq(fourier, frequency):
                  freqs = np.fft.fftfreq(len(fourier), 1/44100.0)
                  nearest = (abs(freqs - frequency)).argmin()
                  return abs(fourier[nearest])

              def video_out(a):
                  global idx
                  fourier=np.fft.fft(recent_audio)
                  values =np.array([get_freq(fourier,X) for X in freq_bins])
                  recent_video[:,idx,1] = (values/10000).clip(0,255)
                  idx = (idx + 1) % a.shape[1]
                  a[:] = np.roll(recent_video, -idx, axis=1)

              def audio_in(a):
                  recent_audio[:] = np.roll(recent_audio, len(a))
                  recent_audio[:len(a)] = a.mean(axis=1)

SEE ALSO

       numm-run(1), numm.getting-started(7), numm.one-bit-instrument(7)

numm                                              February 2012                             spectral-analysis(7)