Обнаружение заметок с обработкой и минимизацией

Я пытаюсь создать приложение для обработки, способное обнаруживать музыкальные ноты с инструмента (гитары). Если, например, воспроизводится открытая нота «А», я хотел бы сделать что-то на ее основе, например, показать ноту на экране или показать изображение.

Я застрял и не уверен, что я делаю это правильно или как действовать дальше. Как я понимаю, мне нужно получить основную частоту? Если да, то как мне это получить? Кажется, что когда я играю ноту прямо сейчас, скетч показывает кучу разных частот по мере развития ноты. Я должен попытаться получить только начало заметки или что-то в этом роде?

Если вы не можете сказать, я новичок, так что будьте осторожны ;) Вот что у меня есть на данный момент:

/* sketch to measure frequencies */

import ddf.minim.analysis.*;
import ddf.minim.*;

Minim minim;
AudioInput in;
FFT fft;

void setup()

{
  size(512, 200, P3D);
  minim = new Minim(this);

  in = minim.getLineIn(Minim.STEREO, 2048);

  // create an FFT object that has a time-domain buffer 
  // the same size as jingle's sample buffer
  // note that this needs to be a power of two 
  // and that it means the size of the spectrum
  // will be 512. see the online tutorial for more info.
  fft = new FFT(in.bufferSize(), 44100);
}

void draw()
{
  background(0);
  stroke(255);
  // perform a forward FFT on the audip that's coming in
  fft.forward(in.mix);
  for(int i = 0; i < fft.specSize(); i++)
  {
    // draw the line for frequency band i, scaling it by 4 so we can see it a bit better
    line(i, height, i, height - fft.getBand(i) * 4);
    //print out the frequency. Am I supposed to be multiplying the value by 2048?
    println( (fft.getFreq(i) * 2048)); 
  }

  fill(255);

}


void stop()
{
  // always close Minim audio classes when you finish with them
  in.close();
  minim.stop();
  super.stop();
}

person Roman Epicnerd Sharf    schedule 26.04.2013    source источник
comment
Я думаю, вам нужно провести дополнительное исследование основ обнаружения высоты тона. Попробуйте википедию, другие вопросы по SO или эту запись в блоге: blog.bjornroche.com/2012/07/   -  person Bjorn Roche    schedule 26.04.2013
comment
Спасибо, Бьорн. Это похоже на отличную статью. Я прочитаю ее и постараюсь выучить как можно больше теории. Однако я не пишу код на C. Можете ли вы дать мне какой-нибудь совет, который поможет мне продвинуться вперед в этом вопросе обработки?   -  person Roman Epicnerd Sharf    schedule 26.04.2013
comment
Примеры кода C в посте очень похожи на все, что вы делаете в Java/Processing, и концепции идентичны.   -  person Bjorn Roche    schedule 27.04.2013


Ответы (1)


Не используйте простое БПФ для оценки высоты тона гитары. Даже оконный. Не используйте сообщение в блоге bjorneroche выше.

Детектор пиков БПФ очень плохо работает со звуками, которые в основном состоят из обертонов (например, в большинстве музыкальных произведений). Вместо этого используйте более надежный метод обнаружения/оценки основного тона, такой как RAPT, YAAPT, варианты автокорреляции, спектр гармонического произведения или методы кепстраля/кепстра.

person hotpaw2    schedule 27.04.2013
comment
Привет Хотпау2! Можете ли вы привести конкретный пример обработки? Или обработка просто не та программа для этого? - person Roman Epicnerd Sharf; 27.04.2013