Может кто-нибудь объяснить, как этот код соответствует алгоритму HPS (спектр гармонических произведений)?
Для проекта я работаю над методами обнаружения основного тона и остановился на идее использования спектров гармонических продуктов. Я читал теорию и, поскольку у меня нет музыкального опыта, я нахожу это немного сложным для понимания. Я использую обработку с библиотекой 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 при использовании электронной песни. Я предполагаю, что это не правильно. При использовании серии нот флейты я получаю правильные частоты изначально, но никогда не получаю частоту выше 1К.
ЭТА: Хорошо, так что я экспериментировал еще немного. Я проверил это с помощью этого видео https://www.youtube.com/watch?v=d7lJ_nyCDQA
Частоты на видео 602 689, 732 818 904 990 111, 2369
частоты, которые я получаю
613, 689, 732, 807, 915. 1022, 1098, и это не выходит за рамки этого. Все в значительной степени хорошо, пока высокие частоты. Кто-нибудь может дать некоторое понимание?