Для проекта я работаю над методами обнаружения основного тона и остановился на идее использования спектров гармонических продуктов.Я читал теорию и, поскольку у меня нет музыкального опыта, я нахожу это немного сложным для понимания.Я использую обработку с библиотекой 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, и это не выходит за рамки этого.Все в значительной степени хорошо, пока высокие частоты.Кто-нибудь может дать некоторое понимание?