FFT for Spectrograms in Python

How would I go about using Python to read the frequency peaks from a WAV PCM file and then be able to generate an image of it, for spectogram analysis?

I'm trying to make a program that allows you to read any audio file, converting it to WAV PCM, and then finding the peaks and frequency cutoffs.


Solution 1:

Python's wave library will let you import the audio. After that, you can use numpy to take an FFT of the audio.

Then, matplotlib makes very nice charts and graphs - absolutely comparable to MATLAB.

It's old as dirt, but this article would probably get you started on almost exactly the problem you're describing (article in Python of course).

Solution 2:

Loading WAV files is easy using audiolab:

from audiolab import wavread
signal, fs, enc = wavread('test.wav')

or for reading any general audio format and converting to WAV:

from audiolab import Sndfile
sound_file = Sndfile('test.w64', 'r')
signal = wave_file.read_frames(wave_file.nframes)

The spectrogram is built into PyLab:

from pylab import *
specgram(signal)

Specifically, it's part of matplotlib. Here's a better example.

Solution 3:

from pylab import *
specgram(signal)

is the easiest. Also quite handy in this context:

subplot

But be warned: Matplotlib is very slow but it creates beautiful images. You should not use it for demanding animation, even less when you are dealing with 3D

Solution 4:

If you need to convert from PCM format to integers, you'll want to use struct.unpack.