MDX音質向上研究:GAMDX改造

前回の続きでMDX Player for iOSの音質向上を図ってみます。

まず前提として、X68内部ではFM音源は62500Hz, ADPCMは15625Hzで出力されています。

MDX Player for iOSではGAMDXエンジンを使用していて、FM音源とADPCM音源をミックスしています。GAMDXエンジンの内部では

  1. FM音源は62500Hzで生成、
  2. ADPCM音源を62500Hzになるよう4倍化した上でフィルタをかけて高音域に乗ったノイズを除去、
  3. FMとADPCMをミックスした上で目的の周波数(44100Hzとか)にダウンサンプル、

となっています。前回指摘したのは、このダウンサンプルのところでノイズが乗ってしまっているのでは、ということでした(周波数変換自体は非常に奥深い問題で、速度と品質のトレードオフなどもあり一筋縄では行きません。各種の周波数変換ルーチンの比較をするサイトもあります)。

前回、MDX Player for iOS v2.0では62.5KHzの出力にした時は、内部のダウンサンプルルーチンを使わずにAppleのダウンサンプルルーチンを使うようになっていて、その結果音質が向上していることを確認しました。その結果をふまえて、GAMDX 内部をいじってみて音質向上を図ってみます。v2.0にはせっかく22/44/48/62KHzと切り替える機能もついているので、内部的な周波数を変更できるようにしてみました。

まずGAMDXでは内部的に62500Hzに統一していますが、これを可変にしてみます。実はFM音源のエミュレートをしているFmgenは周波数が変わっても出力は可能(周波数が下がると音質も落ちますが)です。また、ADPCM音源のエミュレートはX68pcm8.cpp, pcm8.cppという2段階で行われていますが、何故かローパスフィルタを2回通っています。またローパスフィルタの係数は固定されているので、内部の周波数が変わったときにうまくいかなくなると思われます。ということで、改造したエンジンでは

  1.  FM音源は指定した周波数 xxHzで生成
  2. ADPCMをxxHzにアップサンプリングする。途中までは余計なフィルタは通さず、FM音源とミックスする直前にローパスフィルタ(指定の周波数xxHzによりパラメータを変更するタイプ)を通す
  3. 直接xxHzのデータをiOSに渡して再生してもらう;iOSの機能で必要に応じて44KHzや48KHzに周波数変換してくれるし、もし44KHzで生成すればダウンサンプリング不要となるのでそこでのロスがない

というかたちにしてみました。62KHzでは素のver2.0とほぼ同様です。22, 44, 48KHzの存在意義ですが、再生ルーチンの負担が軽くなるので62KHzに比べて22KHzではCPUにかかる負荷が半分くらいになるようです。なお、MMDSP風の画面更新は周波数に比例した頻度で行うので、22KHzだと画面はスローがかかったようにみえるかもしれません(Frame per secondがひくい)。

再生音質の比較をしたいのですが、わたしはiPhoneを1つしか持っていないので改造版ともとのやつを比較するのにXCodeでプロジェクトを切り替えてインストールして・・・を反復しないといけません。本来なら、GAMDXエンジンで62500Hzを44100Hzにダウンサンプルした場合と、はじめから44100Hzで生成してダウンサンプルしない場合とを比較した方がいいのでしょうが。

もう少し時間のあるときにいろいろ調べてみますが、今はとりあえず新規導入したADPCMのローパスフィルタの性能を評価してみました。ADPCMのみのパート(アサルト2ステージ出だしのドラムだけのところ)を周波数分析してみます:

1)ローパスフィルタを通さずにそのままま出力:15625Hzを中心にエイリアシング(折り返し雑音)が見られます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-05-16-00-14

2)もとのGAMDXのエンジン:ローパスフィルタが効いています。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-05-16-50-54

3)今回導入した可変ローパスフィルタ:7KHzより上の周波数は本来は雑音ということになるので2)のフィルタよりも少し性能は悪いかもしれませんが、2)のフィルタは前述の通り2回のフィルタ操作を通っているのでもう少し素直な音がしてくれることが期待できるかも・・・??

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-05-16-00-25

 

ということで、ここまでの変更はhttps://github.com/sinn246/MDXPlayer/tree/HiDefにあげておきます。

GAMDXの内部構造としてはローパスフィルタを別ルーチンにしたのでPCM周りは少しスッキリしたと思います。あとは優秀な周波数変換ルーチンがあればAndroidなどでも音質向上できるはずです(と言うか、私が加えた変更よりも周波数変換ルーチンの差し替えだけでも十分かもしれません)。

続きがあります

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中