広告 MP3、AAC音質関連

Pink-noiseでAACのビットレートと再生帯域内の劣化量の関係を調べてみました。(FFmpeg AAC)

スポンサーリンク

 

AAC変換する時にビットレートを低く(オプション)設定すると劣化量がどの程度に増加するものなのか?ネットで調べても具体例が無く、その特性を知りたくなりました。 

そこで、今回はFFmpegAACエンコーダの、NativeAAC (24bit入力)と高品質と言われるlibefdk_aac (16bit入力)の2つについて、AAC(-LC)のビットレートと劣化量の関係をPink-noise音源を使ってスペクトルの差分(絶対誤差)で深掘って調べてみました。

注意して頂きたいのは、一般的に不可逆圧縮は、ビットレートに従って高域をカットするのが普通です。 ここで言う劣化量は、エンコーダで高域がカットされる周波数を除いた再生周波数帯域内の劣化量を指します。

不可逆圧縮

AACはご存知の通り不可逆圧縮です。 Wikipediaによれば、「非可逆圧縮では、圧縮により一部のデータは欠落するが、人間の感覚に伝わりにくい部分は情報を大幅に減らし、伝わりやすい部分の情報を多く残すことで、劣化を目立たなくする。」と記述されています。 この様に、不可逆圧縮は極力元の音質を損なわないで圧縮させるので、一般的に聞き取り難い高域部分をビットレートのファクターによって高域をカットして圧縮率を高めています。 ここでは、高域がカットされる周波数を除いた再生帯域について劣化が伴うものか?を対象にしています。

 

評価用のFFmpegAACコマンドライン

以下のコマンドラインをmacOSのターミナルから実行して、Pink-noiseをAACファイルに変換しました。 Pink-noiseは、WaveGeneで5秒間生成し、Pink-noiseのファイル名は、「2448k _pink -20db加算.WAV」File size:1,440KB(24bit 48khz wav)です。

NativeAAC用コマンドライン

 command
ffmpeg -i "2448k _pink -20db加算.WAV" -aac_coder twoloop -vn -ar 48000 -ab 320k "out_file_.m4a"
ーーーー
赤字の-abオプションはビットレート(この例は320kbps)を指定します。
その他のオプションはここをクリックして参照

libefdk_aac用コマンドライン

 command
ffmpeg -i "2448k _pink -20db加算.WAV" -acodec libfdk_aac -vn -ar 48000 -ab 128k -cutoff 20000 "out_file_m4a"
ーーーー
赤字の-abオプションはビットレート(この例は128kbps)を指定します。
-cutoff 20000 は、最大の20khzでカットオフします。 ビットレートを下げても20khzのカットオフが維持されます。
その他のオプションはここをクリックして参照 

 

差分スペクトル(絶対誤差)による評価方法について

当ブログでは、過去に差分スペクトル(絶対誤差)による評価を色々行って来ましたので、ご存知の方は、以下を読み飛ばしてください。 以降、差分スペクトルの表現を省略して、絶対誤差と表現します。

基準となるPink-noise(wav)と夫々のAACファイルをAudacityに取込み周波数解析(条件:hann window  size16384)を行います。

周波数解析を行う時にチョットしたテクニックが必要です。 AAC変換すると若干のディレイを伴う場合があり、このディレイを取り除く作業が必要です。 基準となる波形の先頭を見極めて、この先頭と一致させる様にディレイ部分を削除します。 わかり易くする為に波形を拡大しておき、時間軸をズームしてディレイ部分を削除します。 その後、トラックの全選択を行って 解析 > スペクトル表示 を選択し周波数解析を行います。

Audacityの周波数解析は、周波数とレベルのtextデータが書き出せるので、NumbersやExcelなどの表計算ソフトを起動した後、書き出したtextファイルを開き周波数とレベルのデータを全選択コピーして、表計算ソフトにペーストします。 周波数に対する AACレベルからPink-noise(wav)音源レベルを引き算すれば、その値がAACの周波数に対する絶対誤差(劣化量)になります。 数式で表すと、

絶対誤差=測定値ー真値=【AACレベル】ー【Pink-noise音源レベル】
なお、この絶対誤差は、周波数に対するPink-noise5秒間に含まれるPeak値を現しています。

評価に当たって

  1. 周波数を横軸に絶対誤差を縦軸にした絶対誤差グラフ(散布図)を作成します。
  2. エンコーダのCut-Off周波数を除いた再生可能周波数帯域内の絶対誤差(劣化)バラツキの標準編(σ)から、3σのレンジ [ (x+3σ)-(x-3σ)=2*3σ ] を算出した値で劣化量を評価します。

 

Pink-noiseをFlacに可逆圧縮したファイルの絶対誤差で評価の妥当性をみる。

Flacは可逆圧縮ですので、Pink-noise(wav)音源からの劣化は生じない筈です。 Pink-noise(wav)からFlac変換(24bit 48khz)にXLD(アプリ)で変換しPink-noise(wav)との絶対誤差がゼロになるか?調べてみました。

下のグラフの通り、24khzのナイキスト周波数の範囲で、オリジナルPink-noise(wav)とFlac(可逆圧縮)ファイルとの絶対誤差は「0db」でオリジナルPink-noise(wav)のレベルと完全に一致し、Flacの可逆圧縮では無劣化であることが確認できました。 逆説的に、今回の「差分スペクトル(絶対誤差)」評価方法の妥当性が確認できたと考えます。

blank

 

NativeAACのビットレートと絶対誤差(劣化量)

ビットレートを、320kbps,256kbps,192kbps,160kbps,128kbpsの5種類で指定したAACファイルの絶対誤差を調べました。

NativeAACの絶対誤差グラフ(散布図)

ビットレート毎の絶対誤差

blank

絶対誤差(劣化量)の全体スケール

blank

ビットレート毎の絶対誤差で示される様に、256kbpsと320kbps以外の低いビットレートでは、急激に劣化(絶対誤差)が悪化することが分かりました。 理由は不明ですが、NativeAACのコマンドラインは、CBRで設定しているのにも関わらず、256kbpsと320kbpsにあっては、Mediainfoで確認するとVBRになっています。 後段の「劣化レベルの数値化」データの表で示されるようにCBRに切り替わるタイミングでこの悪化事象が発現している様に見えます。
少なくも、NativeAACを使う上で、256kbps未満のビットレートは避けるべき様に思われます。

NativeAAC・劣化量の数値化

統計データ 320kbps 256kbps 192kbps 160kbps 128kbps
統計データ範囲 0hz〜20khz 0hz〜20khz  0hz〜17.5khz  0hz〜16khz  0hz〜15khz
x(平均) -0.15db -0.11db  -0.24db
-0.33db
-0.57db
σ(stdevp) 0.10db 0.07db
0.37db  0.49db  0.66db
x+3σ 0.14db 0.09db 0.88db  1.15db  1.40db
x-3σ -0.44db -0.31db -1.35db  -1.80db  -2.53db
3σレンジ(2*3σ) 0.59db 0.41db 2.23db  2.95db  3.93db
max 0.23db 0.14db 1.23db  1.09db  1.87db
min -0.59db -0.37db -2.87db -4.12db  -3.92db
レンジ
0.81db 0.52db 4.10db 5.21db   5.79db
file size(KB) 158.3KB 153.1KB 122,.KB  102.1KB  82.0KB 
ビットレート種別 VBR VBR CBR CBR CBR
Cut-Off 23,997hz 21,750hz 19,494hz 18,000hz 17,247hz
ビットレート 249 Kbps 241 Kbps 192Kbps 160 Kbps 128 Kbps
上の表は、NativeAAC・絶対誤差(劣化量)の基本統計量を調べたものです。
統計データの範囲:夫々のビットレートのCut-Offに対して余裕を見て2khzダウンした周波数にしています。
レンジについて:バラツキの最大値から最小値を引いたもの(max - min )がレンジです。
劣化レベルの数値化:劣化量を比較するための指標として3σレンジ [(x+3σ)-(x-3σ)] としました。
ビットレート種別:MediaInfoで表示された種別を示します。 NativeAACエンコーダは192khz以下でCBRになる様です。
ビットレート:MediaInfoで表示されたビットレートを示します。

 

libefdk_aacのビットレートと絶対誤差(劣化量)

ビットレートを、320kbps,256kbps,192kbps,160kbps,128kbpsの5種類で指定したAACファイルの絶対誤差を調べました。

libefdk_aacの絶対誤差グラフ(散布図)

ビットレート毎の絶対誤差

blank

絶対誤差(劣化量)の全体スケール

blank

NativeAACと比較して、ビットレートに関わらず劣化量が少ないことが分かりました。
コマンドラインのCut-Offオプションについて:
FFmpegサイトのlibfdk_aacの説明によりますと、「高い設定は、全体的な品質を低下させる可能性がある」との注意書きがあります。 今回の実験は、この注意を無視してCut-Offオプションを最大の20khzに指定(-cutoff 20000)していますので、ビットレートに関わらず再生できる上限周波数が、19,992hzになっています。(Cut-Offオプションを指定せずにテストした所、128kbpsで劣化量は0.79db(3σレンジ)になり多少の改善が確認されましたが、再生上限周波数が15.5khzに低下しました。 厳密に劣化を下げたい場合は、Cut-Offオプションの周波数を調整する必要があります。)

libefdk_aac・劣化量の数値化

統計データ 320kbps 256kbps 192kbps 160kbps 128kbps
統計データ範囲 0hz〜19khz 0hz〜19khz 0hz〜19khz 0hz〜19khz 0hz〜19khz
x(平均) -0.07db -0.07db -0.13db -0.16db -0.17db
σ(stdevp) 0.04db 0.04db 0.09db 0.14db 0.22db
x+3σ 0.06db 0.06db 0.15db 0.25db 0.49db
x-3σ -0.20db -0.20db -0.40db -0.57db -0.84db
3σレンジ(2*3σ) 0.26db 0.26db 0.55db 0.83db 1.32db
max 0.07db 0.07db 0.34db 0.38db 0.63db
min -0.24db -0.24db -0.49db -0.79db -1.07db
レンジ
0.31db 0.31db 0.83db 1.17db 1.70db
file size(KB) 203.9KB 163.5KB 123.1KB 102.8KB 82.8KB
ビットレート種別 CBR CBR CBR CBR CBR
Cut-Off 19,992hz 19,992hz 19,992hz 19,992hz 19,992hz
ビットレート 321 Kbps 257 Kbps 192Kbps 160 Kbps 128 Kbps
上の表は、libefdk_aac・絶対誤差(劣化量)の基本統計量を調べたものです。
ビットレート種別:MediaInfoで表された種別を示します。 全てのビットレートでCBRになっています。 このため、NativeAACより256kbps、320kbpsでのFile sizeが大きくなっています。

 

FFmpeg AAC エンコーダのビットレートをパラメータにした劣化特性

横軸にビットレート、縦軸に劣化量(3σレンジ)にして、ビットレートをパラメータにNativeAACとlibefdk_aacの劣化特性をグラフ化しました。

blank

ビットレート NativeAAC libfdk_aac
128kbps 3.93db 1.32db
160kbps 2.95db 0.83db
192kbps 2.23db 0.55db
256kbps 0.41db 0.26db
320kbps 0.59db 0.26db
ご覧の様に、NativeAACは、256kbpsで変曲し192kbsで劣化量が急上昇します。 一方のlibefdk_aacは、非常に素直にビットレートが下がるに従って緩やかに上昇します。

 

ビットレートと劣化量の関係(マトメ)

エンコーダの特性マトメ

  • NativeAAC、ビットレートが192Kbps付近から劣化量が大きく悪化すると言う問題点が浮かび上がりました。
  • libefdk_aacは、今回の実験を通して、流石に高品質と言われているだけあり、ビットレートが低くなっても安定して音の劣化量が少ないことが確認できました。(ただ、残念なことに、16bit入力なので、ハイレゾ(24bit)のAAC変換には不向きな点です)

FFmpegAACエンコーダの特性を生かした使い方

  • CD(16bit)音源をAAC変換するなら劣化量の少ない 16bit入力の libefdk_aac を選ぶ
  • ハイレゾ(24bit)音源をAAC変換するなら量子化ノイズが少ない24bit入力のnativeAACで且つ、256Kbps以上のビットレートを設定する

 

以上、Pink-noiseによる差分スペクトル(絶対誤差)でAACのビットレートと劣化量の関係でした。 今後、このPink-noiseによる絶対誤差(劣化量)を指標にして、他のAACエンコーダについても調べて行きたいと思っています。

 

スポンサーリンク

 

スポンサーリンク

 

t