0

1 秒あたりの平均サウンド分析に基づいてオーディオ ファイルからデータを収集していますが、分析中にオーディオを聞く必要がないため、速度を上げる方法があるかどうか疑問に思っています。しかし、Processing 固有の draw() ループでそれができるかどうかはわかりません。また、Minim ライブラリはリアルタイムでオーディオを処理するだけのようです。

4

3 に答える 3

1

Ess ライブラリを見たことがありますか? AudioFile.read() メソッドを使用すると、すべてのサンプルを一度に取得できるようです。次に、好きなサイズのチャンクで処理できます。

于 2011-12-09T19:21:26.663 に答える
0

Processing に付属する ForwardFFT サンプルでは、​​フレームごとに 1 回呼び出されるため、データを取得するためにセットアップで関数を複数回fft.forward()呼び出すことを妨げるものは何もありません。データを取得するために ForwardFFT サンプルにfft.forward()追加する方法は次のとおりです。setup()

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を1秒に1回サンプリングするだけで十分なデータが得られると確信していますか?

于 2011-12-10T11:50:35.883 に答える