How to implement my own HPS algorithm?

2.3k Views Asked by At

I'm starting a project on Python where I need to develop a pitch-detection system, basically what I have to do is to record a sound coming from a guitar string, then Identify which is the tone of that sound.

I have read and searched through websites (including stackoverflow) so I can understand the main ideas of important things like: FFT, Time-domaing, Frecuency-domain, Harmonics, pitch detection algorithms, octave-errors and so on.

After my research I found that I could use HPS (Harmonic Product Spectrum) Algorithm and that algorithm belongs to a frecuency-domain approach, that means that I have to (In general steps):

  1. Record the sound from the guitar (avoid external noises).
  2. Use FFT function so I can transform that audio from a time-domain to a frecuency-domain (that's what FFT does).
  3. After I get that data (an array) then I have to use HPS so I can find the highest tone which it will be the tone string sound.

My problem starts in the last step, I have read the ecuation of the HPS and some lectures about that, but I still can't understand it and develop my own function.

Am I missing something or something that I don't understand and I think I do? I just can't find a way to program my own HPS algorithm.

2

There are 2 best solutions below

0
hotpaw2 On BEST ANSWER

In the HPS quesion here:

How to get the fundamental frequency using Harmonic Product Spectrum? ,

the number of harmonics considered is 5 (R = 5); and the 5 harmonic spectrums are in hps2 thru hps5 (plus the original FFT spectrum) after downsampling by sequential harmonic ratios.

Then the 5 downsampled spectrums are summed.

Then the entire HPS summing array length is searched to find where the peak or maxima in the summed 5 harmonics is located.

The downsampling and search for the optimal HPS estimate might not be done optimally in that example. But that's a different Q&A (some of which is already in the answers to the above SO question).

2
Alexander On

I've done this before in few ways (either FFT which is working in Frequency domain or Autocorrelation and AMDF which are working in Time domain). For me personally Autocorrelation is favourite since it's simple and clear to implement and in your use case, analyzing guitar strings, worked with 100% accuracy. So I can recommend it to you. I've shared my code before and you can find it fully explained on the following link: Android: Finding fundamental frequency of audio input