0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

音量を下げてもクレストファクターは変わらない?−6 dBのWAVで確かめる

0
Posted at

「大きな音と小さな音の差を減らしたい」とき、音量を下げるだけでよいのでしょうか。一定のゲインを掛ける操作では、ピークも平均的な振幅も一緒に下がります。ピークとRMSの比であるクレストファクターは、クリッピングや丸め誤差などがなければ変わりません。

CreatuneチームのAlexです。この記事では自作の440 Hz正弦波を実際にWAVへ書き出し、数値を比較します。音楽の聴感評価やコンプレッサーの性能比較ではありません。

ピークとRMSの「差」を見る

サンプルをフルスケールで正規化した値を x とすると、ここでは次の定義を使います。

peak = max(abs(x))
rms  = sqrt(mean(x*x))
crest_dB = 20*log10(peak/rms)
         = peak_dBFS - rms_dBFS

このRMSのdBFS表記は、正規化振幅1を0 dBFSとする定義です。正弦波への補正値は加えていません。メーター間で数値を比較する際は、基準もそろえてください。

正弦波の理論値は約3.01 dBです。瞬間的な大きなピークがあり、残りが小さい信号は、同じピークでもより大きな値になり得ます。ただし、曲全体のクレストファクターだけで「ダイナミクスの良さ」や聴きやすさは判断できません。無音区間や測定窓によっても変わります。

自作音源を準備する

Python標準ライブラリだけで、2秒・44.1 kHz・16 bit・モノラルの音を作れます。元ファイルは上書きせず残します。

import math, struct, wave

rate = 44100
samples = [round(0.25 * 32767 * math.sin(2 * math.pi * 440 * n / rate))
           for n in range(rate * 2)]
with wave.open("tone440.wav", "wb") as w:
    w.setparams((1, 2, rate, 0, "NONE", "not compressed"))
    w.writeframes(struct.pack("<" + "h" * len(samples), *samples))

同じ音源に−6 dBだけを適用する

Creatuneの音量変更を開き、作ったファイルを選びます。2026年11月1日の未ログイン公開画面で確認した操作です。画面には、選んだ音声は端末内で処理されると表示されています。

2秒の自作音源を読み込み、音量が0 dBの状態

「音量(dB)」を−6 dBにし、保存形式をWAVへ変更してダウンロードします。波形の見た目だけで判断せず、表示値が−6 dBになっていることを確かめます。保存したファイルをここでは volume-minus6.wav と呼びます。

音量−6 dB、保存形式WAVを選択した公開画面

書き出し前後を測る

次のコードは16 bit PCM WAV用です。複数チャンネルではチャンネルごとに計算するので、片側だけに大きなピークがある音源も混ぜずに確認できます。

import math, struct, wave

for name in ["tone440.wav", "volume-minus6.wav"]:
    with wave.open(name, "rb") as w:
        assert w.getsampwidth() == 2, "16 bit PCM WAVを使用してください"
        channels, frames, rate = w.getnchannels(), w.getnframes(), w.getframerate()
        raw = w.readframes(frames)
    values = struct.unpack("<" + "h" * (len(raw) // 2), raw)
    for ch in range(channels):
        x = [v / 32768 for v in values[ch::channels]]
        peak = max(map(abs, x))
        rms = math.sqrt(sum(v * v for v in x) / len(x))
        if rms == 0:
            print(name, ch + 1, "silence")
            continue
        print(name, ch + 1, f"{frames/rate:.3f}s",
              f"peak={20*math.log10(peak):.3f}",
              f"rms={20*math.log10(rms):.3f}",
              f"crest={20*math.log10(peak/rms):.3f} dB")

今回の実測は以下です。書き出しは44.1 kHz・2秒のステレオとなり、左右の測定値は同じでした。

ファイル ピーク dBFS RMS dBFS クレスト dB
元のモノラル −12.041 −15.052 3.011
−6 dB後・左右それぞれ −18.041 −21.052 3.011

ゲインの振幅倍率は 10**(-6/20)、約0.501です。分子のピークと分母のRMSに同じ倍率が掛かるため、その比はほぼ一定です。末尾の小さな数値差は量子化などの影響を含みます。

どんな判断に使えるか

全体が大きすぎるだけなら、一定ゲインで下げる操作は目的に合います。一方、「強い一打だけを抑えたい」「小声と大声の差を縮めたい」は別の問題です。時間によってゲインを変えるコンプレッションや音量オートメーションを検討する場面で、ここで確認した音量変更をその代わりと考えないことが大切です。

クレストファクターはLUFSでも、サンプル間ピークを推定するtrue peakでもありません。今回は一つの定常正弦波・減衰設定の検証です。無音を含む音楽、強い増幅、圧縮音源への書き出しでは条件をそろえて再測定し、数値確認と実際の用途での試聴を分けて行ってください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?