Может кто-нибудь объяснить, как этот код соответствует алгоритму HPS (спектр гармонических произведений)? - PullRequest
0 голосов
/ 23 декабря 2018

Для проекта я работаю над методами обнаружения основного тона и остановился на идее использования спектров гармонических продуктов.Я читал теорию и, поскольку у меня нет музыкального опыта, я нахожу это немного сложным для понимания.Я использую обработку с библиотекой minim и наткнулся на этот код онлайн.Я все понимаю, вплоть до сокращения.Я знаю, что нужно применить окно Ханнинга, затем FFT, затем уменьшить и умножить, сжимая образец.Я знаю это в теории, но я изо всех сил пытаюсь понять, как код ниже делает это.Если возможно, кто-то может пролить свет на то, как именно этот алгоритм реализует это, чтобы я мог адаптировать его и действительно понять, что я делаю.Спасибо, и я ценю любые отзывы.

class PitchDetectorHPS{

  FFT fft;
  int sampleRate;
  int fftLength;
  int harmonicSize;
  float[][] step;
  PitchDetectorHPS(int fftLength,int sampleRate,int harmonicSize){
    fft=new FFT(fftLength,sampleRate);
    this.sampleRate=sampleRate;
    //this.fftLength=fftLength;

    this.fftLength=fft.specSize();
    this.harmonicSize=harmonicSize;
    step=new float[harmonicSize][];
    for(int i=0;i<harmonicSize;i++){
      step[i]=new float[this.fftLength];
    }
   //fft.window(fft.HAMMING);
  }
  float detect(float[] frame){
    fft.forward(frame);
    //downsample
      for(int i=0;i<fftLength;i++){
        for(int j=1;j<=harmonicSize;j++){
           if(i%j==0)( step[j-1])[i/j]=fft.getBand(i);
        }
      }
     //HSP
      int index=0;
      float max;
      max=0;
      float tmp;;
      for(int i=0;i<fftLength;i++){
        tmp=1;
        for(int j=0;j<harmonicSize;j++){
          tmp*=step[j][i];
        }
        //println(tmp);
        if(tmp>max){
          max=tmp;
          index=i;
        }
      }
       if(index==0)return 1.0;
      return index*fft.getBandWidth();

  }
}

ETA: Я действительно пытался реализовать это, но получаю повторные значения 86.13281 при использовании электронной песни.Я предполагаю, что это не правильно.При использовании серии нот флейты, я получаю правильные частоты изначально, но никогда не получаю частоту выше 1K.

ETA: Хорошо, поэтому я экспериментировал еще немного.Я протестировал его, используя это видео https://www.youtube.com/watch?v=d7lJ_nyCDQA

Частоты на видео: 602 689, 732 818 904 990 1111, 2369

частоты, которые я получаю

613, 689, 732, 807, 915. 1022, 1098, и это не выходит за рамки этого.Все в значительной степени хорошо, пока высокие частоты.Кто-нибудь может дать некоторое понимание?

...