音量の正規化(ノーマライズ:normalize)

 音量の正規化とはピーク音量(最大音量)を平均化しバランスを整える処理です。
通常は CD 等ではピーク音量は 0dB になっているはずですが曲によっては 0dB に満たない曲が存在します。
その場合にピーク音量を 0dB に合わせる事で平均化を行う事が出来ます。
この処理を行う事によって曲毎にバラバラな音量を整える事が出来るので聞きやすくなったりします。
 フリーソフトでもこれ(正規化)が出来るソフトは多数ありますが大抵はダイナミックレンジ一杯に広げて正規化するのが主流だと思います。(ピーク音量を 0dB に合わせるんだから当たり前だろうけど…)
まぁこの程度の処理ならフリーソフトを使ったらすぐなんですが一応ソースをご紹介…。
/**
 *  @param [in,out] data 波形データ
 *  @param [in] len 波形データのサンプル数
 *
 *  16bit リニア PCM の正規化を開始します。
 *  @p data に正規化元のデータを指定し正規化後はここに格納されます。
 *
 *  @p len に指定される値はバイト数ではなく波形データのサンプル数になる事に注意して下さい。
 *
 */
void  normalize (short * data, int len)
{
  short peak = 0;

  // ピーク値の取得
  for (int i = 0; i < len; ++i) {
    short  sample = abs (data [i]);
    if (peak < sample) {
      peak = sample;
    }
  }

  // ピーク値から乗算値を求める
  float  mul = (32767.0f / peak);

  for (int i = 0; i < len; ++i) {
    data [i] = static_cast <short> (data [i] * mul);
  }
} // normalize
 たったこれだけです。
ちなみに上の正規化元の音声は 16bit PCM に限ります。
流れは以下の様な感じです。
  1. 指定された波形データからピーク値を検索する
  2. 検索されたピーク値と最大値との割合を求める
  3. 全ての要素に割合をかけてダイナミックレンジ一杯に広げる
以上がこのプログラムの流れになります。
16bit リニア PCM の場合 -32768 〜 32767(signed) までの範囲が有効範囲で 0 が無音になります。
それでピーク値を 32767 に合わせるように全ての波形要素を引き上げます。
また 8bit リニア PCM の場合は 0 〜 255(unsigned) までで 128 が無音になります。