「MDCT 2048」で検索するとMDCT(Modified-DCT)は可逆ですか?というのが出てきます。正解は可逆なのですが、正解は不可逆のように誤解されていて、さらにそれが検索上位に出てきてしまっているので、僻地ながらここで訂正をしようと思います。

質問は”MDCT-IMDCTをすると音が戻らない。MDCTは可逆変換か?”というもので、回答は”低周波域で計測される周波数の間隔が2倍に粗くなってしまう。だから低周波域の情報が欠落していてもおかしくない。”というものです。その回答に対して、質問者は”MDCTはDCTに比べて周波数領域での観測できるスペクトルが2倍間隔になるから、特に低音で音がなくなっている。”と理解されました。

ですが、MDCTは可逆です。確かに、窓幅2048に対して周波数成分の数は1024ですが、半分ずつオーバラップして周波数変換を行うので、周波数成分の合計数は時間波形成分の合計数と一致します。次元は退化していませんので、ちゃんと元の波形に戻ります。

確かに、1窓で比べると、MDCTとDFTの周波数成分の間隔は2倍違いますが、直交性は残っています。それに、 ”低周波域で計測される周波数の間隔が2倍に粗くなってしまう。”というわけではなく、全周波数が均等に荒くなります。

質問者の実装で音が戻らないのは、窓関数をかけていないためだと思います。DFTでは音が戻ると書かれていますが、窓関数をかけてからDFTを行うと、当然IDFTした結果も窓関数のかかった値となって元には戻らないので、質問者は窓関数をかけていないのでしょう。しかしMDCTは、その直交性の前提としてPrincen-Bradley条件を満たす窓関数を要求します。ですので、ちゃんとSin窓やVorbis窓や修正KBD窓などをかけてからMDCTを行い、IMDCTの結果に窓関数をかけてやらないと元の音には戻りません。

また、”AAC等のコーデックでは低音のことをかんがえて十分な窓幅をとっている。”わけではなく、単にまとめて処理する単位を大きくした方が圧縮効率がいいからです。MDCTは窓幅8でも直交性が存在します。