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.