3

C++ (ライブラリ libsndfile) を使用して、WAV ファイルの最大音量レベルの値を取得したいですか? それを行う方法に関する提案はありますか?

4

1 に答える 1

7

サンプル バッファー内のサンプルの絶対値の中で、最も高い単一のサンプル値 (ピーク) を簡単に見つけることができます。これは一般的な形式を取ります:

t_sample PeakAmplitude(const t_sample* const buffer, const size_t& count) {
  t_sample highest(0);
  for (size_t idx(0); idx < count; ++idx) {
    // or fabs if fp
    highest = std::max(highest, abs(buffer[idx]));
  }
  return highest;
}

平均を取得するには、RMS 関数を使用できます。図:

t_sample RMSAmplitude(const t_sample* const buffer, const size_t& count) {
  t_sample s2(0);
  for (size_t idx(0); idx < count; ++idx) {
    // mind your sample types and ranges
    s2 += buffer[idx] * buffer[idx];
  }
  return sqrt(s2 / static_cast<double>(count));
}

RMS 計算は、Peak よりも人間の知覚に近いものです。

人間の知覚をさらに深く掘り下げるには、計量フィルターを使用できます。

于 2011-11-22T12:46:03.087 に答える