AAC変換する時にビットレートを低く(オプション)設定すると劣化量がどの程度に増加するものなのか?ネットで調べても具体例が無く、その特性を知りたくなりました。
そこで、今回はFFmpegAACエンコーダの、NativeAAC (24bit入力)と高品質と言われるlibfdk_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)を指定します。 その他のオプションはここをクリックして参照
libfdk_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値を現しています。
評価に当たって
- 周波数を横軸に絶対誤差を縦軸にした絶対誤差グラフ(散布図)を作成します。
- エンコーダの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の可逆圧縮では無劣化であることが確認できました。 逆説的に、今回の「差分スペクトル(絶対誤差)」評価方法の妥当性が確認できたと考えます。
NativeAACのビットレートと絶対誤差(劣化量)
ビットレートを、320kbps,256kbps,192kbps,160kbps,128kbpsの5種類で指定したAACファイルの絶対誤差を調べました。
NativeAACの絶対誤差グラフ(散布図)
少なくも、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 |
統計データの範囲:夫々のビットレートのCut-Offに対して余裕を見て2khzダウンした周波数にしています。
レンジについて:バラツキの最大値から最小値を引いたもの(max - min )がレンジです。
劣化レベルの数値化:劣化量を比較するための指標として3σレンジ [(x+3σ)-(x-3σ)] としました。
ビットレート種別:MediaInfoで表示された種別を示します。 NativeAACエンコーダは192khz以下でCBRになる様です。
ビットレート:MediaInfoで表示されたビットレートを示します。
libfdk_aacのビットレートと絶対誤差(劣化量)
ビットレートを、320kbps,256kbps,192kbps,160kbps,128kbpsの5種類で指定したAACファイルの絶対誤差を調べました。
libfdk_aacの絶対誤差グラフ(散布図)
コマンドラインのCut-Offオプションについて:
FFmpegサイトのlibfdk_aacの説明によりますと、「高い設定は、全体的な品質を低下させる可能性がある」との注意書きがあります。 今回の実験は、この注意を無視してCut-Offオプションを最大の20khzに指定(-cutoff 20000)していますので、ビットレートに関わらず再生できる上限周波数が、19,992hzになっています。(Cut-Offオプションを指定せずにテストした所、128kbpsで劣化量は0.79db(3σレンジ)になり多少の改善が確認されましたが、再生上限周波数が15.5khzに低下しました。 厳密に劣化を下げたい場合は、Cut-Offオプションの周波数を調整する必要があります。)
libfdk_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 |
ビットレート種別:MediaInfoで表された種別を示します。 全てのビットレートでCBRになっています。 このため、NativeAACより256kbps、320kbpsでのFile sizeが大きくなっています。
FFmpeg AAC エンコーダのビットレートをパラメータにした劣化特性
横軸にビットレート、縦軸に劣化量(3σレンジ)にして、ビットレートをパラメータにNativeAACとlibfdk_aacの劣化特性をグラフ化しました。
ビットレート | 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は、ビットレートが192Kbps付近から劣化量が大きく悪化すると言う問題点が浮かび上がりました。
- libfdk_aacは、今回の実験を通して、流石に高品質と言われているだけあり、ビットレートが低くなっても安定して音の劣化量が少ないことが確認できました。(ただ、残念なことに、16bit入力なので、ハイレゾ(24bit)のAAC変換には不向きな点です)
FFmpegAACエンコーダの特性を生かした使い方
- CD(16bit)音源をAAC変換するなら劣化量の少ない 16bit入力の libfdk_aac を選ぶ
- ハイレゾ(24bit)音源をAAC変換するなら量子化ノイズが少ない24bit入力のnativeAACで且つ、256Kbps以上のビットレートを設定する