libfdk-aacのカットオフ周波数

ffmpegを使ってCDなどをAAC化する際、私はlibfdk_aacを使用するのですが、何も指定しないと15kHz以上の音がカットされている事に気づきました。(ただし、HE-AACでエンコードした場合カットされない。詳細後述)。Google先生に聞いてみるとどうやらcutoffというオプションがあるらしく、そこで最大20kHzまでの指定ができるそうです。

下の画像は「-acodec libfdk_aac -profile:a aac_low -ac 2 -ab 256k」のパラメーターでエンコードし、Audacitiyを使い描画したものです。その下はエンコード前のオリジナルです。

libfdk_aac_defaultorg

だいたい15kHz辺でカットオフ(ハイカット)されています。cutoffパラ メーターの上限値は20kHzなので、ひとまず上限の20kを指定して、「-acodec libfdk_aac -profile:a aac_low -ac 2 -ab 256k -cutoff 20k」というようにしてエンコードしてみます。

libfdk_aac_20kcut

 

今度はしっかり20kHzまでの音が残るようになりました。人間の耳で聞き取れる限界は20kHzだという事なのでこのぐらい出ていれば十分でしょう。ちなみにlibfdk-aacでは20kHzが設定上の上限でそれ以上を指定するとエラーになります。

fdk-aac以外のエンコーダーではどうか

さて、ここまではfdk-aacの話でしたが、ffmpegにはこれ以外にもAACエンコーダーを搭載しています。デフォルトのaacエンコーダーを利用した場合はどうなるでしょうか。

aac_256kデフォルトのaacエンコーダーにカット周波数を指定しないと、19kHz付近でカットオフされました。ちなみにビットレートを下げるとそれに応じてカットオフ周波数も自動的に下がっていくようです。このaacエンコーダーですが、試してみるとfdk-aacとは違い、20kHz以上の周波数を指定する事が可能です。カットオフ周波数を24kHzとしてエンコードした例が次の通りです。

aac_256k_cut24k先ほどに比べて20KHZまでしっかり音が残っています。今回の音源はCDなので、CDの上限値まで音が残っているようです。libfdk-aacが上限20kHzな事を考えると高レートなときはデフォルトのaacエンコーダーを使用した方がいいのかもしれません。

cutoffオプションはAAC以外で指定可能か

ハイカット周波数が異様に低い場合はcutoffを指定すればいい事がわかりました。ではこのcutoffオプションはAAC以外のエンコーダーでは利用可能なのでしょうか。手元にある環境で試した所、下記の通りでした。(順次追加)

cutoffオプション使用可能

  • aac
  • libfdk-aac(AAC-LCのみ)
  • libvorbis(ogg)
  • mp2
  • ac3

cutoffオプション使用不可(無視される)

  • libmp3lame(MP3)
  • wmav2(WindowsMediaAudio)
  • libspeex(ogg)
  • libopus(ogg)
  • 可逆圧縮系(flac等)

cutoffオプションが無視されるエンコーダーではlibfdk-aacのように異様に低い数値になっているという事はなく、大抵はビットレート相応の数値になるようです。

カットオフ周波数は高い方がいいのか?

カットオフ周波数が高いからと言って音質が良いかというと、一概には言えません。エンコードとはあくまで圧縮であり、基本原理は人間の耳に聞こえない部分をカットする事にあります。圧縮を行うのであれば情報量はなるべく少ない方が有利です。人間の耳に聞こえない高域を残そうとすると、その分中低域の音に使える帯域が小さくなり、たしかに高域は残るものの、それによって中低域が荒れてくる事も考えられます。中高域の荒れを気にするならカットオフ周波数はむしろ低めに設定すべきでしょう。

自分の耳のスペックが知りたい

このような高域の分析をしていると、そもそも自分が一体どこまでの高音が聞き取り可能なのかが気になってきます。可聴周波数域は下記のソフトでチェックする事ができます。WindowsXP時代のソフトですが、Windows7でも動作するのを確認しました。

可聴周波数域チェッカーhttp://masudayoshihiro.jp/software/mamimi.php

ただし15kHz以上の高音になってくるとスピーカーやヘッドフォンの特性によってはそもそもそんな高音は出せない物等があるのでなるべく良い環境でヘッドフォンで試すのが良さそうです。

HE-AACの場合はカットオフされない

前半にも書いた通り、libfdk-aacはHE-AACでエンコードした場合、カットオフが行われませんし、cutoffオプションで指定しても その数値は無視されます。これはHE-AACが低域から高域を予測する技術のためです。実際に調べてみると20KHzくらいまでは高音が残っています (残っているというより予測され復元されたと言った方が適切かもしれません)。余分な高音をカットした方が圧縮の際は有利な気もするのですが、この辺はま だ調査不足なのでよくわかっていません…。下の比較画像はAAC-HEv2 48kbpsでエンコードとオリジナルです。8kHz付近まではオリジナルとほぼ同じ形状をしていますが、それ以降は高音は残っているもののオリジナルとは随分違う形になっています。

libfdk_aac_he_v2org