[DSP/OT] funamental estimation from peak frequencies?

AudioMatt's icon

Does anyone know how I can get an f0 estimation from a list of... say... 5 peak frequencies of a real world signal?

Example:

Input: 101Hz 198.5Hz 303.2Hz 499.4Hz 601.1Hz
Output 100.276Hz

If I had exact harmonics, I could do greatest common divisor but... it doesn't work with real world peak frequencies which can be off by a percentage point.

Nick Holmes's icon

If (as per your example), one of your peaks is known to be very close to f0;

- determine the lowest value
- divide each by the lowest number, and round to the nearest integer
- divide each input by its corresponding integer from step 2
- average the results of step 3

For your example inputs, that returns exactly 100.276Hz.

AudioMatt's icon

I apologize... in absence of the fundamental?

Roman Thilenius's icon


i remember an old thread with a similar question... but cant remember if there was a solution... bascially you want to near the values which are closest to each other until they match...

it is a bit a stochastic process... try this, if it doesnt match try that other one... first round all values to steps of 0.25, then 0.5, 1.0, 2.0 ...

AudioMatt's icon

Come to think of it, it's almost like an autocorrelation problem similar to tempo/beat extraction.

Roman Thilenius's icon


yes that was it, we had it regarding equalizing timeframes for something.

nick´s appoach sounds great btw. (using relations instead of real values), but of course only if you already have the fundamental. (i needed a while to figure both your posts but now i get it.)