Search code examples
audiosignal-processingfftpitchpitch-tracking

How to implement my own HPS algorithm?


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.


Solution

  • 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).