Search code examples
pythonfftaudio-recordingpyaudio

Get frequency of a PyAudio block


I'm writing a program that involves PyAudio. I already capture a block using stream.read() and get its amplitude using an RMS function from elsewhere on StackOverflow. However, I'd like to also be able to get the (average?) frequency of that block. I think I'll need to use a (fast?) Fourier transform, since my understanding is that it can "interpolate periodic functions," which sounds like exactly what I need. The issue is that I have no idea how I would go around implementing this. Ideally, I'd have a function that takes in a block and spits out a frequency in Hz.

EDIT: Thanks to @MSalters, I now know that this question is not quite possible. Correction: Ideally, I'd have a function that would take a block and spit out an array of frequencies (or other descriptive values).


Solution

  • The frequency probably does not exist - the audio fragment may contain a chord with multiple notes, or percussion instruments. But as you suspected, the FFT is the correct tool. It will tell you the amplitude for each individual frequency.