Search code examples
c++signal-processingfftpitch

Multiple pitch detection: FFT or other?


I've researched fast fourier transforms and have not been able to see a way for them to decode multiple frequencies from one signal. Is there a way to decompose the result of an fft calculation so that we can see individual pitches in a chord, or maybe to calculate the most likely chord based on the result of the fft?

If not, is there another method of pitch detection that can detect multiple pitches in a live setting yet?

EDIT: I am trying to do no more than six pitches at a time, as the software I am writing deals with guitars; in the offhand chance that the program user has a seven string guitar, it would need to be able to pick up seven pitches max.

That being the case, is an FFT (or some other method) able to handle this from a single microphone signal or do I have to make a guitar pickup that reads each string individually?


Solution

  • There are two well known statistical techniques for parametric spectral estimation. One is MUSIC and the other one is ESPRIT. If you can express your signal as sum of weighted complex exponentials (i.e. sinusoidals) you can apply either of them. Moreover, the eigendecomposition of the correlation matrix will also tell you the number of frequencies in the signal so you are not even supposed to know that. ESPRIT is better than MUSIC since you are not supposed to do any search for peaks in frequency domain. The frequencies are given you directly as a result. However, MUSIC is known to be more robust.