---
name: "numm.spectral-analysis"
section: "7"
platform: "linux"
package: "python-numm"
version: "0.5-1"
release: "Debian 8 (Jessie)"
platforms: ["linux"]
url: "https://new.carta.tech/numm.spectral-analysis"
---

# numm.spectral-analysis(7)

perform realtime spectral analysis

## 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-run/1.md), [**numm.getting-started**(7)](/numm.getting-started/7.md), [**numm.one-bit-instrument**(7)](/numm.one-bit-instrument/7.md)
