Быстрый анализ звука в обработке (библиотека Minim) - PullRequest
0 голосов
/ 09 декабря 2011

Я собираю данные из аудиофайлов на основе анализа звука, усредненного за секунду, и мне интересно, есть ли способ ускорить его, учитывая, что мне не нужно слушать аудио во время его анализа.Но я не знаю, может ли цикл draw (), специфичный для Processing, позволить мне сделать это.Кроме того, библиотека Minim, кажется, обрабатывает аудио только в режиме реального времени, поэтому я спрашиваю, знает ли кто-нибудь другое.

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Вы смотрели на библиотеку Ess?Похоже, что метод AudioFile.read () позволит вам получить все сэмплы одновременно.Затем вы можете обработать их в любом размере.

0 голосов
/ 22 июля 2015

Используйте ddf.minim.ugens.FilePlayer и patch(), чтобы применить к нему эффекты с другими уганами.В вашем случае вы можете создать ugen, который БПФ вводит, а затем еще один, который суммирует все входные данные, которые он получает со временем, и усредняет их, когда это сделано.Они должны расширять класс ddf.minim.UGen.

0 голосов
/ 10 декабря 2011

В примере ForwardFFT, который поставляется с Processing, fft.forward() вызывается один раз за кадр, поэтому ничто не мешает вам вызвать функцию fft.forward() несколько раз при настройке для получения ваших данных.Вот как я добавил бы в setup() образца ForwardFFT, чтобы получить данные:

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

  jingle = minim.loadFile("jingle.mp3", 2048);
  jingle.loop();
  // 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(jingle.bufferSize(), jingle.sampleRate());

  println("fft analysis  start");
  int now = millis();

  int trackLength = jingle.length();//length in millis
  int trackSeconds= (int)trackLength/1000; //length in seconds
  int specSize    = fft.specSize();  //how many fft bands
  float[][] fftData = new float[trackSeconds][specSize];//store fft bands here, for each time step
  for(int t = 0 ; t < trackSeconds; t++){//time step in seconds
    fft.forward(jingle.mix);//analyse fft
    for(int b = 0; b < specSize; b++){//loop through bands
      fftData[t][b] = fft.getBand(b);//store each band
    }
  } 

  println("fft analysis end, took: " + (millis()-now) + " ms");

  textFont(createFont("SanSerif", 12));
  windowName = "None";
}

Не уверен, что вы хотите сделать с данными, но вы уверены, что уверены, что выборка FFT один разв секунду даст вам достаточно данных?

...