スポンサード リンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« 隙を生じぬ二段構え | トップページ | INIファイルを導入 »

音声系の変更は二つ

今は、Mirror-DTCの次バージョンを開発中で、ずっと映像系の変更を行っていたのだが、良い感じになったので、今日は音声系の変更を行った。変更点は二つあって、両方共、ADPCMの音質向上用なのだが、一つ目は良いとして、二つ目は賛否両論に分かれるかもしれない。

現行版のMirror-DTCでは、ADPCM圧縮が音声のデフォルト圧縮形式になっているのだが、ADPCMというのは、MP3なんかとは違って、周波数領域を弄るタイプの圧縮方式ではないので、音質的には、とんでもない音質に変化したりはしない。

なので、ADPCM圧縮というのは、ある意味、音質は良いのだが、これは、無理なく圧縮できている場合に限られる。

具体的には、現行版の音声サンプリング周波数は44100Hzになっていて、これ以上の周波数を指定した場合には、ADPCM圧縮指定時にも、殆ど無指定時のPCMと音質は変わらないのだが、サンプリング周波数を下げていくと、段々と、シャリシャリした感じのノイズが乗りだす様になる。

また、キャプチャー音声の音量が最大レベルだと、44100Hz指定時にも、音割れみたいなノイズが乗ったりする事もある。

と、いう事で、現行版のADPCM圧縮で、高音質の音声転送を行おうとすると、サンプリング周波数は44100Hz以上に指定し、キャプチャー対象になる音声出力のボリュームも、少し絞っておく事が必要になっている。

なので、次バージョンでは、上記の様な条件を無くそうとした訳なのだが、まず、ボリュームについては、Mirror-DTCサーバーで、ADPCM圧縮ルーチンへの入力段で自動的に1/2に減らす処理を入れた。

たったの半分にするのか? という声も聞こえてきそうなのだが、ADPCM圧縮ルーチンへの入力データは16BitPCMなので、ボリュームを半分にしても、データは15Bitある。

で、どの道、Mirror-DTCが実装している4ビットのADPCM圧縮ルーチンでは、16Bitデータの最下位ビットの振る舞いまでは制御できないので、ビット数が1つくらい減っても、実際問題としては、現行版と比較して音質が劣化する事もない訳だ。

もっとも、サーバー側で音量を半分にしたデータをクライアントでそのまま再生すると、音量が足りない感じになるので、音量はクライアント側で元に戻す。

ただし、普通に元に戻すと、今度はその処理で音割れが発生するのは明らかなので、クライアント側では、とりあえず、受け取ったデータのボリュームを2倍にしようとはするのだが、そうした場合に音割れが発生する場合には、上げる倍率の方を低下させる。

つまり、クライアントは音割れが発生しない範囲でしかボリュームを上げないので、音割れは発生しなくなる訳だ。

で、上記の処理を実装後に確認してみた所では、サーバー側で最大音量で音を鳴らした場合、クライアントの音量拡大率は1.8倍程度に落ち着く事が多かった。

つまり、ADPCM圧縮処理では、勢い余って、元々の音声波形よりも少し大きめの音声波形データを生成する場合があったので、現行版ではボリュームを絞っておかないと、音割れが発生していた訳だ。

これに対して、次バージョンでは、上記の様な仕組みを入れたので、サーバー側で鳴らす音の音量は気にする必要が無くなった。

問題は二つ目の変更で、何をやったのかというと、ADPCM圧縮処理への入力データと、圧縮データの展開後の出力データの両方に、遮断周波数にサンプリング周波数の1/3を指定したローパスフィルターを入れた。

普通のPCM録音の場合、例えば、サンプリング周波数が44100Hzの場合、その半分の22050Hzの音までは録音できる事になっているので、ローパスフィルターを入れるとしたら、その遮断周波数はサンプリング周波数の1/2にするのが筋になる。

にも関わらず、1/3を指定したのは、ADPCM圧縮の追従性が宜しくないからだ。

つまり、サンプリング周波数に対して比較的高い周波数のデータが入力されると、そのデータ変化にADPCM圧縮処理が追いつかなくなるので、シャリシャリしたノイズが発生する事になる訳なので、どうせ追従できないのなら、入力データから外してしまえ、という事にした訳だ。

その結果、ノイズは減ったのだが、例えば、サンプリング周波数が11050Hzの場合、その1/3の3.7kHz程度の音までしかキャプチャーされなくなったので、現行版では、ノイズ入りとはいえ、5kHz程度まではキャプチャーされていたので、人によっては、次バージョンの方が音質は劣化したと感じるかもしれない。

ちなみに、現行版のデフォルト設定である所の44100Hzをサンプリング周波数にした場合、何故、ノイズが乗らないのか、というと、サンプリング周波数の1/3の周波数までADPCMが追従できるとすると、その周波数が15kHz程度になるからだ。

つまり、サンプリング周波数が44100Hzでも、16kHzくらいの音声入力があれば、それがノイズ元になる筈なのだが、普通、そんな高周波の入力は無いし、あったとしても、ノイズの周波数も高くなるので、どの道、再生時には聞こえない訳だ。

もっとも、サンプリング周波数の1/3まで追従できる、というのも実は正しくなくて、1/4程度を見込まないとノイズは若干残るのだが、そこまでキャプチャー周波数を落としてしまうと、作者的にも聴いていられなくなるので、間をとった感じで遮断周波数は1/3にした訳だ。

= この記事に関連する公開中ソフト =

Mirror-DTC

Mirror-DTC

(2016/05/04追記)

« 隙を生じぬ二段構え | トップページ | INIファイルを導入 »

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/534482/63162509

この記事へのトラックバック一覧です: 音声系の変更は二つ:

« 隙を生じぬ二段構え | トップページ | INIファイルを導入 »

2017年10月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    Cookieを無効にする設定およびAdsenseに関する詳細については、以下のリンクを参照下さい。

    広告 - ポリシーと規約 - Google