車輪の再発明的なローパスフィルタの話

前のやつの為にリサンプリング(サンプリングレート変換)のプログラムを初めて自分で書いたのですが、そのときの話。

リアルタイム変換とかではないので「音質にこだわって」CPUやメモリの使用量度外視でやってみました。

  1. オーバーサンプリング(間引いて間に0を埋めるだけ)
  2. 十分に長いsinc関数の畳み込み(ローパスフィルタ)
  3. 線形補完

最初で変換前後のサンプリングレートの最小公倍数になるようなオーバーサンプリングができれば、最後の補完は要らないのですが、中途半端な値にするのでこうなりました。真ん中は(用途がダウンサンプリングなので)変換後のサンプリングレートの半分の周波数まで通すローパスフィルタです。最後の線形補完を除けば理想的なリニアフェイズ・ブリックウォール・フィルタであると言えるでしょう。スペック厨も大満足。

実装後、処理はめちゃくちゃ重いですが、いろんな周波数のサイン波やホワイトノイズでテストをして、理論上の性能は十分であることを確認。

それで、目的の用途に使ってみたんですが、変換後の音を聴いてみると、なんというかあんまりいい音じゃないんですよね。

結局、いわゆるブリックウォールではなくて、(ナイキスト周波数より少し低い方から)なだらかに下がる特性にしてやった方がいい感じ。私、そんなに耳がいいわけじゃない(むしろ悪い)ですけど、これは明らかに違う。最終的には窓をかけて短くしたsinc関数を使いましたけど、FIRフィルタ(リニアフェイズ)ではない方式でも全然問題なさそうでした。

その後、MUCOM88 Windows の付属ツールのソースを見たところ、(ダウンサンプリングの場合)基本的にはサンプルの平均をとっているだけでした。細かい話を除けば要するに線形補完。これでも音が悪いという感じではなく十分なんですね。その後のADPCM変換でまた音変わっちゃいますし。

というわけで、「スペック厨の夢破れる」といった感じの結果でしたとさ。ふだん音をいじってる人からすれば常識なのかもしれませんが……。