JI3GAB/blog

ラジオに関する話題を中心につらつらと

PCオーディオのレイテンシとソフトウェアラジオ

2007-05-17 01:14:58 | サウンドカード/ドライバ
PCのサウンドカードと汎用OS(WindowsやLinux)の上で信号処理を行うSDRでは、実際に使用していると遅延(レイテンシ)が気になります。そういう議論の中で、suikanさんはx86プラットフォームでリアルタイムOSを走らせるという検討をされているようです。正直に言って私にはその内容は興味がありますが、すぐに理解できるようなものではありません。

そこで、というわけでもないのですが、汎用OS(WinXPとLinuxのみ)でどのくらいまでレイテンシを下げることができるのかということを調べてみようかなと思っています。
ちょっとまだ色々理解できていないこともありますし、自分で実際に測定してみたいとも思っているのですが、WindowsのASIOや最近のLinux(alsa)では、だいたい数msecというオーダーのレイテンシで納まるようです。MMEやずっと以前のLinuxでは数10~100msec程度の遅れがあったことを思えば非常に良い値です。

WinXPでDELTA44のDMAバッファサイズを128 samplesに下げて、自作のSSB変調プログラム(サンプリングレートは48kHz、ASIO使用)を動かしていますが、通常使用している範囲では特に音が途切れたりすることはないようです。バッファサイズだけで考えると、レイテンシは128 / 48kHz = 2.67msecとなります。Linuxでも同様のバッファサイズで問題なく動作しています。実際モニターしてみても、この程度ならほとんど問題ないと言ってもいいのかなという感じがします。

が、しかし、これまではあくまでOSのサウンドシステムのレイテンシの話です。現在使用している自作の変調プログラムでは、FIRフィルタを使用しており、その形状というかシャープさを変化させることができます。そして、シャープなフィルタを実現しようとすればそれだけFIRフィルタのタップ数が多くなり、そこでの遅延が大きくなります。実際モニターしているのが段々不自然になってくるのがわかります。
設定できるパラメータは、「帯域外減衰量」と「cut off周波数から設定した減衰量に落ちるまでの幅(transition BW)」の二つです。一番初期の頃は減衰量を60dB、trans. BWを500Hzと甘く設定していました。このときタップ数は88で、ここで生じる遅延は、88 / 2 / 12kHz = 3.67msecとなります(FIRフィルタはサンプリングレート12kHzの処理)。
その後、より低音まで出したときに逆サイドへの漏れを少なくするためにパラメータを自由に変えられるようにしたのですが、パラメータを変えたときにタップ数がどう変化するかの例を以下に示します。

FIR フィルタ (Kaiser窓)
12kHz sampling

tr_bw	attn	n_taps
-----------------------
500Hz	60dB	88
300Hz	80dB	202
200Hz	60dB	218
200Hz	80dB	302
100Hz	60dB	436
100Hz	80dB	604
 40Hz	60dB	1088
 40Hz	80dB	1506


100Hzまで低域を伸ばして、サイドバンドを含めた不要な信号を-60dB程度に抑えたいとなるとフィルタによる遅延は、436 / 2 / 12kHz = 18.17msec、さらに40Hzまで伸ばしておまけに減衰も目一杯と考えると、1506 / 2 / 12kHz = 62.75msecとなります。これではプラットフォームのレイテンシが下がってきても、処理全体としての遅延はかなり気になってしまいます。

うーん、やはり単純な実装ではこんなものなんでしょうか。FIRフィルタには線形位相であるとか安定であるとか、いい性質がありますが、たとえば昔のKenwoodのDSP機はIIRフィルタを使って90度位相差を作っていました。今の機械はどういう処理になっているのでしょうかね。群遅延をうるさく言わなければ、IIRでLPF作ってWeaverの方がいいとか?

と、ここまで書いて、以前他の方から実測していただいた遅延のデータを見返したら、40Hz/80dBの設定で36msecとなっていました。何か考え違いをしてるのかな、私は。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする