本発明における最良の形態を図に従って説明する。
図1は、本発明を組み込んだ映像伝送システムの一例である。
この例では、映像の送信側をサーバー、受信側をクライアントとして、サーバーからクライアントに映像データを伝送する場合を想定しているので、図1の例においてはサーバーに映像データが入力され、クライアントで映像データが出力されるという構成になっている。しかし伝送するデータは映像に限らず、いかなるデータを伝送するシステムであっても本発明を適用できることは言うまでもない。本発明の核心は実際に映像データ伝送をする前に、クライアントがサーバーの時刻の進み方に合わせるための技術を提供するものである。
図1において、サーバー130とクライアント100が、ネットワーク120を介して接続されている。
サーバー130やクライアント100は、特定目的に特化した組み込み機器でもよいし、汎用的なPC(Personal Computer)であってもよい。
ネットワーク120は、単一の特定の媒体に限るということはなく、任意の媒体で、複数の媒体をまたがってもよい。途中にブリッジやルータ、スイッチングハブなどの中継器があってもよい。
サーバー130は、CPU(Central Processing Unit)131、メモリ132、通信I/F(interface)133、時刻制御部134を少なくとも備える。CPU131は、ソフトウェアを実行することにより、サーバー130がクライアント100と通信する装置として動作するように、サーバー130の各部を制御する。メモリ132は、CPU131がプログラムを実行する際に必要な値などを記憶する。通信I/F133は、パケットを、クライアント100へ送信する送信部と、クライアント100からパケットを受信するための受信部とを含む。
同様に、クライアント100は、CPU101、メモリ102、通信I/F103、時刻制御部104を少なくとも備える。CPU101は、ソフトウェアを実行することにより、クライアント100が時刻の検出装置を含む伝送装置として動作するように、クライアント100の各部を制御する。メモリ102は、CPU101がプログラムを実行する際に必要な値などを記憶する。通信I/F103は、パケットを、他の装置(本実施の形態の場合サーバー130)へ送信する送信部と、サーバー130からパケットを受信するための受信部とを含む。送信部が送信するパケットには、第1のパケット(本実施の形態においては、後述する測定パケットがこれにあたる)が含まれる。受信部が受信するパケットには、サーバー130が返信しかつ測定パケットに対応する第2のパケット(本実施の形態においては、後述する返信パケットがこれにあたる)が含まれる。時刻制御部104は、タイミングを検出する。
これらは、本発明の説明に必要な最小限の構成であって、他に必要と思われるコンポーネントは省略されている。たとえば、プログラムを格納する不揮発性メモリや、メモリ−メモリ間を高速に転送するDMA(Direct Memory Access)などがあってもよい。
サーバー130やクライアント100がPCの場合は、時刻制御部134や時刻制御部104はPCI(Peripheral Component Interconnect)バスなどで接続された外部のボードであってもよい。
時刻制御部134は、発振器135、時刻カウンタ部136、バッファ137、映像入力I/F138を少なくとも備える。発振器135は、クロックパルスを発生する。時刻カウンタ部136は、発振器135が発生するクロックパルスをカウントすることにより、タイミングを表わす値を生成する。これにより、時刻制御部134によって(より厳密に言うと発振器135および時刻カウンタ部136によって)タイミングが検出されることとなる。バッファ137は、情報を一時的に記憶する。映像入力I/F138は、映像のデータを受付ける。
同様に、時刻制御部104は、発振器105、時刻カウンタ部106、時刻補正部107、出力タイミング決定部108、バッファ109、映像出力I/F110を少なくとも備える。発振器105は、クロックパルスを発生する。時刻カウンタ部106は、発振器105が発生するクロックパルスをカウントすることにより、タイミングを表わす値を生成する。これにより、時刻制御部104によって(より厳密に言うと発振器105および時刻カウンタ部106によって)タイミングが検出されることとなる。時刻補正部107は、CPU101が算出したクロックパルスの周波数比に基づいて、時刻カウンタ部106がカウントしたクロックパルスの数を変えることにより、タイミングを補正する。
これらは、本発明の説明に必要な最小限の構成であって、他に必要と思われるコンポーネントは省略されている。たとえば、ホストCPUとのインタフェース部や映像データを暗号化する回路などがあってもよい。
発振器105や発振器135は、周波数偏差が±30PPM程度の安価なものでよい。ただし、周波数の不安定さ(すなわち、出力される波形の周波数のバラツキ)は少ない方が望ましい。
時刻制御部134は発振器135を基に時刻カウンタ部136にてタイミングを表わす値であるタイミングカウンタを生成する。これにより、発振器135および時刻カウンタ部136は、タイミングを検出する。
同様に、時刻制御部104は発振器105を基に時刻カウンタ部106にてタイミングカウンタを生成する。これにより、発振器105および時刻カウンタ部106は、タイミングを検出することとなる。時刻制御部134と時刻制御部104で、それぞれ独立してタイミングカウンタを生成する。
また時刻制御部104は、時刻カウンタ部106、時刻補正部107を制御してタイミングの検出と補正をするための各種の関連情報の制御、たとえば、時刻カウンタ部106におけるクロックパルスのカウント数を変える、レジスタ群111へ情報をセットするまたそこから情報を読み出して時刻補正部107へ転送する、自らが生成したタイミングカウンタを他の装置へ送信する、また他の装置のタイミングカウンタを取得する、あるいは、それら情報を基に各種必要な演算をするといったような制御を、CPU101の管理の下で、あるいは時刻制御部104独自で行なう。
上記の時刻制御部は、時刻制御部134と時刻制御部104で公称値が同じクロック周波数でカウントアップするものとする。
もし公称のクロック周波数が異なっている場合は、同一のクロック周波数に合わせるためにクライアント100側の周波数を公称値に合わせる調整をしておくものとする(具体的な調整の例を後述する)。
時刻カウンタ部は精度とビット長を注意して設計する必要がある。
本発明では、クロック周波数が27MHzの発振器を用いて、3クロックサイクルごと(111.111ns)に1カウントアップするものとする。
またタイミングカウンタは40ビットの数値の列により表わされることとする。しかしこれらの値は一例でありこれらに限るものでないことは言うまでも無い。
クロック進み合わせプロトコルでやり取りされるタイミングカウンタは、時刻カウンタ部136、時刻カウンタ部106で生成されるタイミングカウンタを用いる。
時刻制御部134には、デジタル放送受信機などから映像入力I/F138を介して映像データのパケットが入力され、時刻制御部134は1つ1つのパケットに入力された時点のタイミングカウンタを付与し、バッファ137に一時保存する。
サーバー130のCPU131は、バッファ137から適当なタイミングでパケットを取り出し、メモリ132へ格納する。メモリ132に格納されたパケットは通信I/F133によってネットワーク120へ送出される。
クライアント100のCPU101は、通信I/F103によって受信されたパケットをメモリ102へ格納する。メモリ102に格納されたパケットは、適当なタイミングで時刻制御部104に送られる。
時刻制御部104は、CPU101から受け取ったパケットをバッファ109に一時保存する。出力タイミング決定部108にて、補正後のタイミングカウンタとパケットに含まれるタイミングカウンタとを比較して、出力タイミングを決定する。パケットは、タイミングカウンタが除かれて、映像出力I/F110を介して、デコーダ装置などへ出力される。
図2に、ジッタを説明した図を示す。
理想的な伝送(すなわち一定量の遅延時間を伴う伝送)と、実際の伝送との間には、パケットの出力タイミングにおいて伝送ゆらぎが生じる。この伝送ゆらぎのことをジッタと呼んでいる。
図3に、ジッタを吸収する方法を説明した一般的な説明図を示す。
送信機はパケットが入力されると1パケットずつそのパケットが入力された時点の送信機側のタイミングを付与する。送信機は数パケットをまとめてひとつのペイロードデータとし、受信機へ送信する。
受信機はペイロードデータを受信すると、パケット単位に分解する。一律に固定された遅延時間をDとすると、受信機側のタイミングが、パケットに付与されているタイミング+Dと等しくなる時点でそのパケットを出力する。受信機からパケットが出力される時間の間隔は、送信機から送信された時間の間隔を再現したものとなる。
ところでこの方法が有効であるには、送信機と受信機の時間の進み方が一致している必要がある。
実際には、送信機と受信機との間のクロック周波数には少しではあってもズレがあり、この周波数のズレに起因するタイミングのズレがある。そのため映像データを送受信する前に、受信機側のクロックの進みを送信機側に合わせておかないと上で述べたジッタを吸収する方法は有効に働かない。
図4は、上記の問題を解決する本発明におけるクロック進み合わせプロトコルの概念を示したものである。
クライアント100はサーバー130に対してクロック進み合わせのための測定パケットを送信する。この測定パケットには、クライアント100が送信した時点のクライアント100側のタイミング(C1)が付加されている。
サーバー130は、当該測定パケットを受信すると、受信した時点のサーバー130側のタイミング(S1)をさらに付加して、当該測定パケットの送信元アドレスをあて先アドレスとした返信パケットとして送り返す。
クライアント100は、サーバー130から上記の返信パケットを受信する。
上記のクロック進み合わせプロトコルを、適当な時間間隔で繰り返す。
本発明の実施例では、100msの時間間隔で繰り返す。
図5は、クライアント100側のタイミングとサーバー130側のタイミングの関係を示したものである。
クライアント100からクロック進み合わせのための測定パケットを送信した時点でのクライアント100側のタイミングをC1、サーバー130がその測定パケットを受信した時点でのサーバー130側のタイミングをS1、クライアント100がサーバー130から返信された返信パケットを受信した時点でのクライアント100側のタイミングをC2とする。
図4で示した上記記号を基に、以下で本発明のクロック進み合わせの方法を詳細に説明する。
クライアント100は、クロック進み合わせのための測定パケットを繰り返し送信して(C1,S1,C2)のデータを測定する。
クライアント100とサーバー130の間でクロック周波数比は本来異なるものであるため、{C1,C2}とS1をそのままで比較することに意味をなさない。
クライアント100のタイミングを式(1)に基づき補正することを考える。
F(C)=α×(C−C0)+β ・・・(1)
ここで、F(C)は補正されたクライアント100側のタイミング、Cは補正する前のクライアント100側のタイミング、αはサーバー130とクライアント100のクロック周波数比、βはC=C0におけるサーバー130側のタイミング、C0はクライアント100側の任意の基準となるタイミングをそれぞれ表している。
補正されたクライアント100側のタイミングが、サーバー130側のタイミングと常に同じ時刻計時を実現していれば(つまり、任意のどの時点においてもクライアント100において検出されるタイミングとサーバー130において検出されるタイミングとが同じであれば)、式(2)が成り立つはずである。
F(C1)<S1<F(C2)・・・(2)
式(1)は、サーバー130とクライアント100のクロック周波数比が十分安定していることが前提となるが、急激な温度変化などがない限り、式(1)の補正式でクライアント100のタイミングを補正することができる、と考えてよい。
式(2)を少し変形すると式(3)または式(4)が得られる。
0<S1−F(C1)<F(C2)−F(C1)・・・(3)
0<F(C2)−S1<F(C2)−F(C1)・・・(4)
F(C2)−F(C1)は往復にかかった伝送時間(ラウンドトリップ時間)に相当する。
S1−F(C1)は行きの伝送時間、F(C2)−S1は帰りの伝送時間に相当する。
式(3)または式(4)は、片方向の伝送時間は、「0」より大きく、ラウンドトリップ時間より小さいことを意味している。
式(3)を展開すると、式(5)が得られる。
0<S1−(α×NC1+β)<α×(NC2−NC1)・・・(5)
ただし、NC1=C1−C0、NC2=C2−C0とする。
式(5)をαについて解くと、式(6)が得られる。
(S1−β)/NC2<α<(S1−β)/NC1・・・(6)
クライアント100は、クロック進み合わせのための測定パケットを繰り返し送受信して、{C1,S1,C2}のデータを測定する。
クライアント100は、測定された結果から式(6)を満足するようなα、β、C0が存在するかどうか調べる。
まず、C0とβをどのように設定するかが問題となる。C0とβは唯一に決まるものではなく、妥当な数値に設定すればよい。
C0は、クライアント100側の任意の基準であるため、どこに設定してもかまわない。
クロック進み合わせプロトコルを走らせて、はじめの100個程度のデータから、ラウンドトリップ時間(C2−C1)が最小となるデータを取り出す。このデータを{C1k、S1k、C2k}とする。
C0は式(7)のように設定する。
C0=C1k・・・(7)
βは、クライアント100のタイミングCがC0の時のサーバー130のタイミングであり、片方向の伝送時間がわからない限り、クライアント100が正確に求めることはできない。そのため、誤差がなるべく小さくなるように推定することになるが、誤差を極力小さくするためには、ラウンドトリップ時間がなるべく小さいものを選んだ方がよい。ラウンドトリップ時間が大きいと、βの推定誤差が大きくなるので、ラウンドトリップ時間が局所的に最小のものを選ぶようにする。
ここでは、βを式(8)のように設定する。
β=S1k−(C2k−C1k)/2・・・(8)
可能性を言えば、β=S1k−(C2k−C1k)からβ=S1kまでの範囲で、誤差は存在しうる。行きと帰りの伝送時間の合計がC2k−C1kであるため、行きと帰りとの伝送時間をどのように分配するかによってβの値が変わる。
式(8)は、行きと帰りの伝送時間が同じである、かつ、サーバー130とクライアント100の公称クロック周波数が同じであると仮定して、C=C0におけるサーバー130側のタイミングを推定したものである。
ここで、式(8)で設定したβの値は一例であって、確定されるべきではない。αの上限と下限の範囲を計算するために仮に決定したものである。
上記のデータ{C1k、S1k、C2k}より以前のデータは無視して、その次以降のデータについて、式(6)を適用する。
式(8)によって設定されたβを使って、式(6)よりαの上限と下限を評価する。
図6に、ある有線LAN上で2台のPC間で測定したデータ(C1、S1、C2)の例を示す。これらのデータは、100msに1回パケットを送信するという条件にしたがって測定されたデータである。図6のC1、S1、およびC2の値は、タイミングカウンタである。これらは1タイミングカウンタあたり279.365nsに相当する。測定時間は、約20分間である。なお、図6における「時刻」および「ミリ秒」は、経過した時間の目安を表わすものである。
αの下限をαmin、αの上限をαmaxとすると、αmin、αmaxは式(6)より式(9)のようになる。αminは式(6)の左辺、αmaxは式(6)の右辺である。
αmin=(S1−β)/NC2、αmax=(S1−β)/NC1・・・(9)
これにより、CPU101は、クロックパルスの周波数比αの下限値を算出することとなる。式(9)から、本実施例におけるクロックパルスの周波数比αの下限値αminは、基準となるタイミングC0にサーバー130が検出したタイミングの推定値βから測定パケットのサーバー130における受信タイミングまでの時間を、基準となるタイミングC0からクライアント100における返信パケットの受信タイミング(通信I/F103の受信部が返信パケットを受信した時点で発振器105および時刻カウンタ部106が検出したタイミング)までの時間で除算した値となる。
また、CPU101は、クロックパルスの周波数比αの上限値を算出することとなる。式(9)から、本実施例におけるクロックパルスの周波数比αの上限値αmaxは、基準となるタイミングC0にサーバー130が検出したタイミングの推定値βから返信パケットが表わす受信タイミングまでの時間を、基準となるタイミングから通信I/F103の送信部が測定パケットを送信したタイミングまでの時間で除算した値となる。
本実施例の場合、上述した基準となるタイミングC0にサーバー130が検出したタイミングの推定値βは、式(8)に示す通り、測定パケットのサーバー130における受信タイミング(すなわち返信パケットが表わす受信タイミング)と、通信I/F103の送信部が測定パケットを送信した時点で発振器105および時刻カウンタ部106が検出したタイミングから通信I/F103の受信部が返信パケットを受信した時点で発振器105および時刻カウンタ部106が検出したタイミングまでの時間の半分との、差である。
式(6)は、ある特定のデータ{C1,S1,C2}における、αの満たすべき値を示しているが、すべてのデータにおいてαmin<α<αmaxとなるはずである。
図7に、図6で得られたデータからαmin、αmaxを計算した例を示す。
図8に、αminとαmaxをプロットした図を示す。
図8を見ると、αの上限と下限の範囲が狭まっていく様子がわかる。
図8のプロットでは、αmin<αmaxとなっている。これにより、式(6)の不等式が成り立つことがわかる。
しかし、測定環境によってはαmin<αmaxとならないことがある。
そのような場合は、βの設定(あるいはデータ{C1k,S1k,C2k}の選択)に問題があるか、そもそもクライアント100側のタイミングが式(1)によって補正できない可能性が考えられる。
βの設定に問題があるとすれば、その問題は式(8)によって行きと帰りの伝送時間が同じであると仮定している点にあると考えられる。その場合は、行きと帰りの伝送時間の分配を変えて計算すると良い。たとえば、式(8)を式(8’)のようにして、βを複数個設定して計算していくと良い。Nはラウンドトリップ時間に比例して決定すると良い。
βi=S1k−(C2k−C1k)×i/N,i=0〜N・・・(8’)
式(8’)において、すべてのβiにおいてαmin>αmaxとなってしまった場合、最初のいくつかのデータを捨てて、再度C0とβを設定し直すと良い。特に、最初に見つけたデータのラウンドトリップ時間が十分に最小になっていなければ、このような事態が発生しうる。後続のデータの中から、ラウンドトリップ時間がより最小となるデータを見つけて、再度C0とβを設定し直す。
クライアント100側のタイミングが式(1)によって補正できない可能性はある。温度変化、湿度変化、気圧変化、磁場変化、供給電圧の変化、その他の影響により、また発振器自体の性能などの理由により、発振周波数が計測中に変化することがありうるためである。発振周波数の変動が大きい場合には、発振周波数が十分に安定するまで待たなければならない。実際には、常にクロック進み合わせプロトコルをやり取りして、αmin>αmaxとなる間先に受信したデータから順にいくつかのデータを捨てて、再度C0とβを設定し直すと良い。
ところで、図8をもう少し詳しく見てみると、αmaxが前後の点と比べて上方向に大きくぶれてプロットされた点と、αminが前後の点と比べて下方向に大きくぶれてプロットされた点があることがわかる。
このαmaxが上方向にぶれてプロットされた点は、行きの伝送時間が前後の点と比べて異常に大きいことによるものである。
また、αminが下方向にぶれてプロットされた点は、帰りの伝送時間が前後の点と比べて異常に大きいことによるものである。
一般的に、ネットワーク120の伝送時間はある範囲内に収まると考えがちであるが、待ち行列の理論によると、伝送時間の上限について仮定を設けることは現実的ではない。つまり、異常に大きな伝送時間を持つパケットは存在する、ということである。
この点が、従来技術では考慮されていなかったが、本発明では、何かの事情で異常に大きな伝送時間を持つパケットが存在しても、αminとαmaxの範囲が狭まらないだけで、αの推定には影響されないようになっている。
さて、図8のように、αmin<αmaxを保ちながらαminとαmaxが推移したならば、式(10)のようにαを推定すると良い。
αest=(MAX_αmin+MIN_αmax)/2・・・(10)
ここで、αestは推定したクロック周波数比、MIN_αmaxはαmaxの現在までの最小値、MAX_αminはαminの現在までの最大値とする。
本実施例では、αestをMIN_αmaxとMAX_αminの算術平均で求めているが、これに限らず、たとえば式(10’)のような加重平均のようなものであってもよい。
αest=MAX_αmin×ω+MIN_αmax×(1−ω),0<ω<1・・・(10’)
特に、行きの伝送時間が帰りの伝送時間と比べて大きくなる傾向がある場合、ωを0.5より大きくすると良い。
αestは、MAX_αmin<α<MIN_αmaxの範囲に存在する値であればよい。
正確に言えば、式(8’)におけるβiによってMAX_αminとMIN_αmaxの値は異なる。先に述べたようにβは正確に求められないため、すべてのβiについてMAX_αminとMIN_αmaxを計算し、その全体の中からαの上限と下限を推定すべきである。ただし、本実施の形態の場合、すべてのβiについてのMAX_αminとMIN_αmaxとの計算は、実施しない。αの推定値の精度を高くすることよりも、計算に費やす時間を短縮することの方が重要であるためである。
図9に、これらの点をプロットした様子を示す。下から順にMAX_αmin、αest、MIN_αmaxである。αestが急速に収束していることがわかる。
αestの誤差は、式(11)で見積もることができる。
|αest−α|<(MIN_αmax−MAX_αmin)/2・・・(11)
さて、式(11)の右辺がどのように減少していくか解析を試みる。
αmaxの最小値が更新されるのは、行きの伝送時間が前後のデータと比較して相対的に小さい時であり、αminの最大値が更新されるのは、帰りの伝送時間が前後のデータと比較して相対的に大きい時である。
ここで、行きの伝送時間も帰りの伝送時間も常に一定であると仮定する。この時、式(11)の右辺はもっとも早いペースで減少していくであろう。
この時の式(11)の右辺は、式(6)より、式(12)のように見積もれる。
RTTmin/NC1/2・・・(12)
ここで、ラウンドトリップ時間(C2−C1)の現在までの最小をRTTminとする。RTTminは固定値とする。
なお、式(12)は、下記の過程を経て導かれる。
αmin=(S1−β)/(C2−C0)
αmax=(S1−β)/(C1−C0)
αmax−αmin=(S1−β)×(C2−C1)/(C2−C0)/(C1−C0)
すなわち、αmaxは、少なくとも測定パケットのサーバー130における受信タイミング、および通信I/F103の送信部が測定パケットを送信したタイミングに基いて、CPU101により算出される値である。αminは、少なくとも返信パケットが表わす受信タイミング、およびクライアント100における返信パケットの受信タイミングに基いて、CPU101により算出される値である。
ここで、(S1−β)〜(C2−C0)(「〜」は、だいたい同じ値であることを表わす)として、(αmax−αmin)〜(C2−C1)/(C1−C0)としている。(正確ではないが、見積もりとして使える。)
式(12)から、ネットワーク120の最小ラウンドトリップ時間が2倍になれば、αestの誤差は2倍になる、と言える。(RTTminに比例するため)
また、αestの誤差を10進で1桁精度を上げるためには、10倍の測定時間が必要である、と言える。(NC1に反比例するため)
なお、10進で1桁精度を上げるためには、αestを1/10にしなければならない。ラウンドトリップ時間(C2−C1)が十分安定であると仮定すれば、αestはC1−C0に反比例する。よって、測定時間(C1−C0)が10倍にならなければならない。
図10に、理想的なネットワーク環境(行きの伝送時間と、帰りの伝送時間が常に一定)におけるシミュレーションを実施した結果を示す。
ネットワーク120の最小ラウンドトリップ時間が222μ秒の時、αestの誤差が10−6未満(1秒間に1μsのずれ)となるまで、1.8分かかることがわかる。
実際には、伝送時間にはばらつきがあるので、このようなシミュレーション通りにはならないかもしれない。
しかし、最小ラウンドトリップ時間に十分近いラウンドトリップ時間を持つパケットが、ある程度の頻度で発生すれば、αestの誤差は上記のシミュレーションの結果と同様のペースで減少していくはずである。
実際のネットワーク環境では、最小に十分近いラウンドトリップ時間を持つパケットが、ある程度の頻度で発生するので、αestの誤差はほぼ上記のペースで減少していくと考えてよい。
αestの目標誤差をW、最小ラウンドトリップ時間をRTTminとすると、目標誤差に到達するまでの所要時間Tは式(13)で見積もることができる。
T=RTTmin/(2×W)・・・(13)
ただし、
Wは、αestの目標誤差、すなわち、W=|αest−α|である。
この式は、次の過程を経て導かれる。
すなわち、式(11)と式(12)より、
W<RTTmin/(C1−C0)/2
C1−C0は、測定時間(T)であるので、式(13)のように見積もることができる。
次に、与えられた許容ジッタ量を満足して伝送するためには、どのようにクライアント100側のタイミングを補正していけばよいかを述べる。
たとえば、与えられた許容ジッタ量を30μsとすると、αestの誤差が10−6未満となるまで待ち、30秒未満に1回の割合でタイミングの補正値を更新する、というようにすればよい。
αestの誤差を10−6とすると、タイミングの補正値は1秒間に1μsの割合でずれが生じる可能性がある。従って、次の30秒後までには補正値を更新しなければならない。
αestの誤差が10−7未満となるまで待てば、次の300秒後までに補正値を更新すれば良い。
つまり、1)αestの目標誤差をどこに設定するか、2)その後どれだけの間隔でタイミングの補正値を更新し続ける必要があるか、の2点を考える必要がある。
本発明の実施例では、補正する間隔が平均して10秒程度になるようにαestの目標誤差を調整する。
たとえば、与えられた許容ジッタ量を30μsとすると、(1秒間に3μsのずれが発生する)3×10−6未満となるようにαestの目標誤差を設定する。
図11にタイミングの補正方法の概念図を示す。図11において、一点鎖線はサーバー130側のタイミングを表わす。粗い破線は、クライアント100側のタイミングを表わす。細かい破線は、クライアント100側の補正前のタイミングを表わす。
まず、クロック進み合わせプロトコルにしたがい通信した後、サーバー130側とクライアント100側とのクロック周波数比αが目標とする誤差以下になるまでの、初期の待ち時間が必要である。
この初期の待ち時間は、式(13)で示したように、最小ラウンドトリップ時間と、αestの目標誤差とによって変化する。
時刻カウンタ部106および時刻補正部107は、初期の待ち時間が経過して、クロック周波数比が目標とする誤差以下になった時の、クライアント100側のタイミング候補を基点とし、クロック周波数比の推定値αestに基づいた調整をして、自律的にタイミングを刻む。
図11の黒丸印で示した点が、クライアント100側のタイミング候補である。
タイミング候補とは、ある時点におけるサーバー130側のタイミングの推定値である。クライアント100は、黒丸印で示した点において、クライアント100側のタイミングをサーバー130側のタイミングの推定値に合わせる。
タイミング候補をどのように推定するかは難しい問題となる。片方向の伝送時間がわからない限り、βを正確に求めることはできない。しかし、アプリケーションによってはβを正確に求める必要もないことに注意されたい。
本発明の目的はクロックの進み方を合わせることであって、2点間でタイミングを正確に一致させることではない。ネットワークの行きと帰りで異なる伝送時間を持つ場合においては、βは正しい値ではない可能性があるが、本発明の目的のためには、それでもかまわない。
αestとβ、C0が求まれば、式(1)において、任意の時点でのクライアント100側のタイミング候補が得られる。
現在のタイミングより少しだけ未来のタイミングをC=Cmとすると、
F(Cm)=αest×(Cm−C0)+β ・・・(17)
式(17)のF(Cm)がC=Cm時点でのクライアント100側のタイミング候補である。
クライアント100側のタイミングがCmとなった時点で、F(Cm)に補正し、その後はクライアント100側のタイミングの進み方をサーバー130とクライアント100のクロック周波数比αestによって補正しながらクライアント100側のタイミングを生成する。
クロック進み合わせプロトコルの結果を基にβ、C0、αestを求めて補正回路に書き込みする一連の処理を、必要な時間間隔で繰り返す。
図12にタイミングの補正回路を説明したブロック図を示す。
これは、図1の時刻カウンタ部106と時刻補正部107と出力タイミング決定部108と、レジスタ群111とで構成される。
また、図13に補正回路のレジスタ群111を示す。図13において、「TC」は補正前のタイミングカウンタ(ビット数は40ビットとする)を表わす。「GOAL_TC」は目標とするタイミングのカウンタ(ビット数は40ビットとする)を表わす。「CANDIDATE_TC」は、タイミングカウンタ候補(ビット数は40ビットとする)を表わす。なお、本実施例の場合、補正前のタイミングカウンタ「TC」の値が「GOAL_TC」の値に等しくなった時、「CANDIDATE_TC」と後述する{P,NUM,DEN}をロードする。「P」は「PACE」の略である。「P」はカウンタの補正ペースを表わす。本実施例において、「P」の値が「0」の場合、カウンタは早くカウントするように補正される。「P」の値が「1」の場合、カウンタは遅くカウントするように補正される。「NUM」は「NUMERATOR」の略である。「NUM」は、クロック周波数比から「1」を減算した値をさらに有理化した値の、分子を表わす。「DEN」は「DENOMINATOR」の略である。「DEN」は、クロック周波数比から「1」を減算した値をさらに有理化した値の、分母を表わす。「ADJUSTED_TC」は補正後のタイミングカウンタ(ビット数は40ビットとする)を表わす。「E」は「ENABLE」の略である。「E」は補正回路を有効にするか否かのフラグの値を表わす。本実施例において、「E」の値が「0」の場合、補正回路は無効とされる。「E」の値が「1」の場合、補正回路は有効とされる。「L」は「LOAD REQUEST」の略である。「L」はソフトウェアの処理の一部として、「P」、「NUM」、および「DEN」、または「CANDIDATE_TC」をロードすることを表わす。
CPU101は、レジスタ群111からレジスタの値をリードまたはライトできる。補正前のタイミング(TC)と補正後のタイミング (ADJUSTED_TC)は、リードだけ可能である。
補正回路が有効であるか無効であるかを決定するビット(ENABLE)がある。ENABLE=1の時の補正回路が有効となる。補正回路が無効となっている間は、補正後のタイミング(ADJUSTED_TC)は常に補正前のタイミング(TC)と同じ値になるものとする。
タイミングの検出とその補正はハードウェアで行い、補正回路の制御(レジスタに設定)はクライアント100のCPU101がソフトウェアを実行することにより行なう。
図12において、時刻カウンタ部106は、27MHzクロックを基に、3クロックサイクルごとに1カウントアップして、補正前のタイミング(TC)を生成する。
時刻補正部107は、補正前のタイミング(TC)とレジスタ群111に設定されている種々の値とを基に、補正後のタイミング(ADJUSTED_TC)を検出する。
ソフトウェアは、補正前のタイミング(TC)をレジスタ群111からリードして、その補正前のタイミング(TC)から少しだけ未来のタイミングを目標タイミング(GOAL_TC)として設定する。少しだけ未来のタイミングというのは、ソフトウェアによる計算とレジスタに書き込むまでの時間を考慮して決める。例としては、目標タイミング(GOAL_TC)は補正前のタイミング(TC)から1秒程度後のタイミングでよい。
ソフトウェアを実行するCPU101は、補正前のタイミング(TC)が進んでいって、先に設定された目標タイミング(GOAL_TC)と等しくなった時の、タイミング候補(CANDIDATE_TC)を式(17)から計算する。
また、ソフトウェアを実行するCPU101は、クロック周波数比の推定値αestより、ペース(PACE)と、クロックパルスの周波数比αestから1を引いた値を有理数化したときの分子(NUMERATOR)と分母(DENOMINATOR)を計算する。ペース(PACE)は、クライアント100のクロックの進み方を早くするか、遅くするかを決定する1ビットのレジスタである。このために、まずCPU101は、クロックパルスの周波数比が1より大きいか否かを判断する。
本実施例の場合、αest>1ならばPACE=0とする。αest<1ならばPACE=1とする。
αestが1を超えれば、クライアント100側のタイミングの進みがサーバー130側のタイミングの進みと比べて遅い、ということである。従って、クライアント100側のタイミングのペースを早める必要がある。クロックの進み方を早くする場合、PACE=0とする。
αestが1未満ならば、クライアント100側のタイミングの進みがサーバー130側のタイミングの進みと比べて早い、ということである。従って、クライアント100側のタイミングのペースを遅くする必要がある。クロックの進み方を遅くする場合、PACE=1とする。
補正のタイミングは、以下の方法でクロック周波数比αから算出される有理数(NUMERATOR / DENOMINATOR)によって決定される。
この有理数は、クロック周波数比から1を引いて有理化した値である。CPU101は、ソフトウェアの制御により、クロック周波数比を浮動小数点で求めているが、CPU101は、これをハードウェアで処理しやすいように有理化する。
たとえば、α=1.00000749255とすると、式(18)のようにする。
RATIO=α-1=0.00000749255=718/95828523・・・(18)
すなわち、
α-1=0.00000749255を連分数展開すると、{133465, 1, 10, 21, 1, 2, ...}となる。
連分数展開を有理数に変換して、1/(133465+1/(1+1/(10+1/(21+1/(1+1/2)))))=718/95828523を得る。
本実施例では、後述するハードウェアの仕様により、
PACE=0
NUMERATOR=718
DENOMINATOR=(95828523+718)/3=31943080
と設定する。
また、α=0.9999528011とすると、式(19)のようにする。
RATIO=α-1=-0.0000471989=-8725/184856003・・・(19)
すなわち、
α=0.9999528011を連分数展開すると、{21186, 1, 14, 3, 1, 17, 8,...}となる。
連分数展開を有理数に変換して、1/(21186+1/(1+1/(14+1/(3+1/(1+1/(17+1/8))))))=8725/184856003を得る。
本実施例では、後述するハードウェアの仕様により、
PACE=1
NUMERATOR=8725
DENOMINATOR=(184856003-8725)/3=61615759
と設定する。
浮動小数点を有理数に変換する方法は、3.14=314/100のように分母を10のべき乗にして単純に処理しても良いが、より精度良く行なうために連分数展開を使うのが良い。
連分数展開した最初の数項を取り出して有理数に変換する。所望の精度以下となるまで、かつ、ハードウェアのビット数を超えないように、最初の数項を取り出して有理数に変換する。
たとえば、円周率は{3, 7, 15, 1, 292, 1,...}のように連分数展開されるので、最初の数項を取り出して有理数にすると式(20)のようになる。
3+1/7=22/7
3+1/(7+1/15)=333/106
3+1/(7+1/(15+1/1))=355/113
3+1/(7+1/(15+1/(1+1/292)))=103993/33102
・・・式(20)
ハードウェアに設定する分母と分子は、その設計によってあらかじめ上限が決まっている。本実施例では、分母を32ビット、分子を31ビットとしている。つまり、分母の上限は232−1、分子の上限は231−1となる。ハードウェアのビット数を超えない範囲で、かつ、元の浮動小数点に最も近い有理数とするために、連分数展開を用いるのが良い。
時刻補正部107は、PWM(Pulse Width Modulation)の考え方を使う。
補正回路にPWM_COUNTという内部カウンタを用意し、リセットしようとするときは、この内部カウンタの値が「0」にクリアされる。その上で、3クロックサイクル(このサイクルは、発振器105で刻まれるクロックにより表わされるサイクルである)ごとにNUMERATORの値が加算され、PWM_COUNTの値がDENOMINATORの値を超えれば、PWM_COUNTの値からDENOMINATORの値が引かれる、という処理が行われる。これにより、時刻補正部107は、CPU101が有理化したクロックパルスの周波数比の分母および分子に一意に対応するタイミングに、タイミングを補正することとなる。
PWM_COUNTの値 がDENOMINATORの値を超えたタイミングで、補正後のタイミング(ADJUSTED_TC)のカウントアップ期間を調整する。
図14に、タイミングを早める場合の補正回路の動作を示す。この図では、図を説明しやすくするために簡単化してNUMERATOR=2、DENOMINATOR=9としているが実際のシステムではこの値になるとは限らない。補正前のタイミング(TC)がGOAL_TCに等しくなった時、補正後のタイミング(ADJUSTED_TC)にタイミング候補(CANDIDATE_TC)がロードされる。PACE=0, NUMERATOR=2, DENOMINATOR=9の場合、3クロックサイクルごとにPWM_COUNTの値にNUMERATORの値が加算されていく。これにより、PWM_COUNTの値は、「0」、「2」、「4」、「6」、「8」... と変化する。PWM_COUNTの値がDENOMINATORの値を超えれば、タイミングのカウンタアップ期間を補正する。PACE=0の場合は、2クロックサイクルごとにPWM_COUNTの値にNUMERATORの値が加算されていくようにする。
図15に、タイミングを遅くする場合の補正回路の動作を示す。PACE=1の場合は、4クロックサイクルごとにPWM_COUNTの値にNUMERATORの値が加算されていくようにする。
すなわち、
図14と図15との違いは、CNTの値が0と1との間で変化する(PACE=0の場合)か、CNTの値が「0」、「1」、「2」、「3」の順に変化する(PACE=1の場合)か、の違いである。
図14から、27クロックサイクルの間に補正前のタイミング(TC)が9だけ増加しているのに対し、25クロックサイクルの間に補正後のタイミング(ADJUSTED_TC)が9だけ増加している、ことがわかる。同じ期間で見ると、補正前のタイミング(TC)の値が「25」増加する間に、補正後のタイミング(ADJUSTED_TC)の値は「27」増加する。つまり、α=27/25=1.08で補正されていることになる。
αが1以上で、α−1を有理数化した値がN/Dとするとき、NUMERATOR=N, DENOMINATOR=(D+N)/3 と設定することとする。
図15から、27クロックサイクルでの間に補正前のタイミング(TC)が9だけ増加しているのに対し、29クロックサイクルの間に補正後のタイミング(ADJUSTED_TC)が9だけ増加している、ことがわかる。同じ期間で見ると、補正前のタイミング(TC)の値が「29」増加する間に、補正後のタイミング(ADJUSTED_TC)の値は「27」増加する。つまり、α=27/29=0.931・・・で補正されていることになる。
αが1未満で、α−1の絶対値を有理数化した値がN/Dとするとき、NUMERATOR=N, DENOMINATOR=(D-N)/3と設定することとする。
ソフトウェアを実行するCPU101は、目標タイミング(GOAL_TC)、タイミング候補(CANDIDATE_TC)、クロック周波数比を有理数化した値(PACE, NUMERATOR, DENOMINATOR)をセットする。
ソフトウェアを実行するCPU101は、これらの値をセットすると、LOAD REQUESTビットを1にセットする。
ハードウェアは、LOAD REQUESTビットが「1」にセットされていれば、レジスタに有効なデータがあることがわかる。ハードウェアは、TC=GOAL_TCとなった時に、レジスタからデータを取り込み、LOAD REQUESTビットをクリアする(LOAD REQUESTビットの値を「0」にする)。
以上の動作により、クライアント100側のタイミングをサーバー130側のタイミングに合わせることができる。
ソフトウェアを実行するCPU101は、クロック進み合わせプロトコルを通信させて、補正回路のレジスタ群111に適切な値を書き込む必要がある。さらに、必要な間隔でこれらを更新し続けなければならない。
以下、ソフトウェアを実行するCPU101の動作について、詳しく説明する。
図16に、サーバー130側のプログラムの手順を示す。
S101にてネットワーク120を初期化する。すなわち、クロック進み合わせプロトコルで用いるポートを送受信可能な状態にする。S102にてパケット受信待ちをする。クロック進み合わせのための測定パケットを受信するとS103にて、そのときのサーバー130側のタイミングS1を取得する。S104にて、S1をペイロードに付与して、クロック進み合わせのための測定パケットの送信元アドレスをあて先にして送り返す。S102に戻り、上記の手順を繰り返す。
図17に、クライアント100側のプログラムのリレー概念図を示す。クライアント100側は{αest、β、C0}を繰り返し計算するために、図17で示したように時間差のリレー方式で計算する。クライアント100側のプログラムを実行するCPU101は、一定時間ごとにリレー構造体を生成する。すなわち、CPU101は、リレー構造体を記憶するために、メモリ102の任意の領域を割当てる。CPU101は、リレー構造体ごとに、それぞれ独立して{αest、β、C0}を計算する。先頭のリレー構造体が算出した誤差が目標誤差に到達すれば、その結果を用いて補正回路のレジスタ群111に書き込む。
各リレー構造体は矛盾が生じる(式(8)におけるすべてのβiについてMAX_αmin > MIN_αmax となる)か、または、生存時間をあらかじめ設けておきその生存時間が経過するまで(ここでは1時間とする)存続し続ける。リレー構造体が消滅すれば、次のリレー構造体の結果を用いて補正する。
リレー構造体を設けている理由は、サーバー130とクライアント100のクロック周波数比が徐々に変化していき、式(1)で補正できなくなる可能性があるためである。正確には、いったん決定した{β,C0}をいつまでも使い続けることはできないということである。{β,C0}を適切な時間間隔で更新すると式(1)で補正し続けることができる。本発明では、一定時間ごとにリレー構造体を生成して、それぞれのリレー構造体で{β,C0}を計算する。{β,C0}を更新するタイミングは、以前の{β,C0}ではαが存在しなくなった時点(すべてのβiについてMAX_αmin > MIN_αmaxとなる)か、または、生存時間を経過した時点である。
本実施例における、クライアント100側のプログラムのリレー構造体は、C0と、βの初期値と、現在までのαminの最大値と、現在までのαmaxの最小値と、ラウンドトリップ時間が最小となるデータの値と、次のリレー構造体のアドレスとを含む。
βの初期値は、ラウンドトリップ時間がなるべく最小となるデータ{C1k,S1k,C2k}を用いて、式(8)または式(8’)で計算する。βを1つだけ持たせる時は式(8)を、βを複数個持たせる時は式(8’)で計算する。
図18に、クライアント100側のプログラムのリレー構造体のリンクリストの概念を示す。本実施例において、リンクリストは、リレー構造体が記憶されたアドレスを列記したデータである。リンクリストの末尾には「NULL」を表わすデータが含まれる。リレー構造体は、同時に複数存在し、また、個数も可変であるため、リンクリストで管理するとよい。
図19に、CPU101が実行する、クライアント100側のプログラムの手順(1)を示す。
S201にてネットワーク120を初期化する。すなわち、クロック進み合わせプロトコルで用いるポートを送受信可能な状態にする。S202にてスレッドを生成する。スレッドでは、クロック進み合わせプロトコルの送信だけを担当する。
S203にて、クライアント100側のタイミングC1を取得する。S204にて、C1をペイロードに付与して、サーバー130に対してクロック進み合わせのための測定パケットを送信する。これにより、タイミングC1は、サーバー130に測定パケットを送信したタイミングとなる。
S205にて、100ms待って、S203に戻る。ここでは、100msの間隔で送信を繰り返しているが、時間間隔を短くしてもαestの収束が早くなるわけではない。送信をスレッドにしているのは、送信した後、必ずしも受信するとは限らないからである。ネットワーク120の状況によっては、パケットロストが発生することはありうる。送信した後、受信待ちで止まるような作り方では、パケットロストが発生した時にいつまでも受信せずに止まってしまう。
S206にてクロック進み合わせのための返信パケットの受信待ちをする。この返信パケットは、S204にて送信した送信パケットに対する返信として送信されたパケットである。この返信パケットは、サーバー130における測定パケットの受信タイミングを表わす。通信I/F103の受信部が当該測定パケットを受信するとS207にて、そのときのクライアント100側のタイミングC2を取得する。これにより、タイミングC2は、返信パケットを通信I/F103の受信部が受信したタイミングとなる。
もし、サーバー130側とクライアント100側の公称の基準クロック周波数が異なっていれば、S208にて、タイミングの基準クロック周波数を合わせる。たとえば、サーバー130側の基準クロック周波数が80MHz、クライアント100側の基準クロック周波数が20MHzとすると、サーバー130側のタイミングの進み方はクライアント100側と比べて4倍早い、ということになる。従って、サーバー130側のタイミングの値を1/4倍にする、という処理を行なう。公称の基準クロック周波数が同じであれば、S208は省略可能である。
S209にて、処理(1)を行なう。処理(1)では、クロック進み合わせプロトコルで得られたデータ{C1、S1、C2}から、{α、β、C0}を計算して、結果をレジスタ群111に書き込みする。
図20、図21、および図22に、CPU101が実行する、クライアント100側のプログラムの手順(2)、手順(3)を示す。プログラムの手順(2)、手順(3)は、プログラムの手順(1)における処理(1)の詳細である。
S301にて、リレー構造体を定期的に生成して(メモリ102の中にリレー構造体を記憶する領域を確保して)、そのアドレスをリンクリストの最後尾に追加する。生成したリンク構造体を構成する値を定義する方法は、S302、S303、S304にて詳しく説明する。
最初の10秒間は、最初の10秒間の中でラウンドトリップ時間が最小となるデータを選び、そのデータを基に式(7)、式(8)によってリレー構造体を生成して初期化する。(S302)
それ以降は、30秒経過するごとに、その間の中でラウンドトリップ時間が最小となるデータを選び、そのデータを基に式(7)、式(8)によってリレー構造体を生成して初期化する。(S303)
リンクリストに含まれるリレー構造体の個数が、ある数以上となれば、先頭のリレー構造体を削除する。ここでは、約1時間でリレー構造体が削除されるよう120個とする。(S304)
S305にて、リンクリストに連鎖されている(リンクリストにアドレス(リレー構造体が記憶されたアドレスのこと)の値が含まれている)各リレー構造体について計算を行なう。
S401にて、αmin、αmax、MAX_αmin、MIN_αmaxを計算する。計算は式(9)の通りである。リレー構造体がβを複数個持っていれば、各βについて計算する。これにより、CPU101は、複数の測定パケットそれぞれの受信タイミングおよび複数の測定パケットを送信したそれぞれのタイミングに基づいて複数のαminを算出することとなる。CPU101は、複数の返信パケットそれぞれが表わす受信タイミング、および複数の返信パケットそれぞれの受信タイミングに基いて複数のαmaxを算出することとなる。
S402にて、現在のβの設定で矛盾(MAX_αmin > MIN_αmax)が生じているかどうかを調べる。矛盾が生じていれば、矛盾が生じていないβを探して、もしあればβをその値に変更する。
S306にて、リンクリストの先頭のリレー構造体について矛盾が生じているかどうか調べる。(すべてのβにおいてMAX_αmin > MIN_αmaxとなった?)矛盾が生じていれば、S307にて先頭のリレー構造体を削除する。
S308にて、条件が合致していればS309にて処理(2)を実行する。条件とは、リンクリストの先頭のリレー構造体が目標誤差に到達した事、かつ、ハードウェアによって前回の補正式がロードされた事、である。誤差は、式(11)で求める。ここでは目標誤差を1.0×10−5とする。
目標誤差に到達していれば、S309にて、αestの計算と、αを有理数化した結果を補正回路のレジスタ群111に書き込む。
S411にて、リンクリストの先頭のリレー構造体についてαestを計算する。すなわち、CPU101は、αminおよびαmaxから、クロックパルスの周波数比(本実施例の場合、厳密には周波数比の推定値)を算出する。αestの計算は式(10)または式(10’)で行なう。これにより、CPU101は、複数のαminの内の最大値であるMAX_αminと、複数のαmaxの内の最小値であるMIN_αmaxとの間の値であるクロックパルスの周波数比を算出することとなる。すなわち、CPU101は、サーバー130に測定パケットを送信したタイミング、測定パケットに対応しかつサーバー130における測定パケットの受信タイミングを表わす返信パケットを通信I/F103の受信部が受信したタイミング、およびサーバー130における測定パケットの受信タイミングに基いて、自装置のクロックパルスおよびサーバー130のクロックパルスの周波数比を算出することとなる。さらにCPU101は、αestの有理数化も行なう。
S412にて、現在のタイミングより少しだけの未来(ここでは1秒とする)におけるタイミングカウンタ候補を計算する。この計算は式(17)で行なう。
S413にて、以上の結果を補正回路のレジスタ群111に書き込む。レジスタ群111に書き込む値の計算は先に図14および図15を参照して述べた通りである。時刻補正部107は、レジスタ群111の値を読込み、時刻カウンタ部106が検出したタイミングを補正する。これにより、時刻補正部107は、CPU101が算出した周波数比に基づいて、発振器105および時刻カウンタ部106が検出したタイミングを補正することとなる。このとき、時刻補正部107は、クロックパルスの周波数比が1より大きければ、時刻カウンタ部106がカウントしたクロックパルスの数を減らすことにより、タイミングを補正する。時刻補正部107は、クロックパルスの周波数比が1より小さければ、時刻カウンタ部106がカウントしたクロックパルスの数を増やすことにより、タイミングを補正する。
ここでは、現在のクライアント100にて検出されるタイミングより1秒後のタイミングを目標タイミングカウンタ(GOAL_TC)とする。
ところで、タイミングカウンタ候補(CANDIDATE_TC)は、TC=GOAL_TCとなる時のサーバー130のタイミングを表している。補正回路は、TC=GOAL_TCとなった時に、タイミングカウンタ候補(CANDIDATE_TC)をロードするが、このとき補正後のタイミングカウンタは飛びが発生する可能性がある。タイミングカウンタの飛びが、ある程度の範囲におさまらないと、映像乱れなどの問題を引き起こす可能性がある。
そこで、タイミングカウンタの飛びを少なくするためには次のようにすると良い。
補正する時にCANDIDATE_TCをロードする時と、しない時に制御を分ける。そのため、LOAD REQUEST ビットを2ビットに設定する。
1回目の補正の時は、クライアント100にて検出されるタイミングとサーバー130にて検出されるタイミングに関連はないので、補正後のタイミングカウンタに飛びが生じるのはやむをえない。CANDIDATE_TCをロードする。
2回目以降の補正の時は、現在までの補正が妥当であればCANDIDATE_TCをロードしない、妥当でなければロードする、というように処理を分ける。
現在までの補正が妥当であるかどうかを式(21)によって判断する。
直近の補正前のタイミングをC2、C2に対応した補正後のタイミングをAC2とすると、
p=(AC2−NCmin)/(NCmax−NCmin)・・・(21)
ここで、NCmin=MAX_αmin×(C2−C0)+β、NCmax=MIN_αmax×(C2−C0)+βとする。
C=C2における補正後のタイミングについて、考えられる最小の点をNCminとし、最大の点をNCmaxとしている。
式(21)によるとpの値は、補正後のタイミングAC2が最小の点に近ければ「0」付近になり、最大の点に近ければ「1」付近になる。
p=0.5付近になっていれば、現在までの補正は妥当であると言える。
0.25<=p<=0.75の時は、現在までの補正が妥当であると判断し、CANDIDATE_TCをロードしない。(PACE, NUMERATOR, DENOMINATOR はロードする。)
p<0.25の時は、現在までの補正が妥当でないと判断し、CANDIDATE_TCをロードする。ただし、タイミングカウンタの飛びは最大10までに抑えると仮定し、CANDIDATE_TCをF’(Cm)+10に設定する。F’(Cm)は前回の補正式に基づくC=Cmの時のタイミングカウンタ候補である。
p>0.75の時は、現在までの補正が妥当でないと判断し、CANDIDATE_TCをロードする。ただし、タイミングカウンタの飛びは最大10までに抑えると仮定し、CANDIDATE_TCをF’(Cm)−10に設定する。F’(Cm)は前回の補正式に基づくC=Cmの時のタイミングカウンタ候補である。
以上のようにすると、補正後のタイミングカウンタの飛びをある程度の範囲に抑えることができる。タイミングカウンタの飛びをどこまで許すかについては、別途ソフトウェアで設定できるようにパラメータ化しておくと良い。
以上で、ハードウェアとソフトウェアの動作を詳しく説明し、本発明における基本的動作を説明した。すなわち、クライアント100がサーバー130のタイミングの進み方に合わせるようなプロトコル(通信規約)を採用する。クライアント100は適当な時間間隔をおいて繰り返しサーバー130に対してクロック進み合わせのためのパケットを送信し、サーバー130側のタイミングとクライアント100側のタイミングの情報を集める。クライアント100のタイミングをある補正式に従って補正できると仮定し、クロック進み合わせプロトコルで得られた結果を、満たすべき不等式に代入して下限の最大と上限の最小を計算すると、クロックの周波数比の上限と下限が得られる。クライアント100は、上限と下限の中間値をクロックの周波数比として、その時の上限と下限の差を推定誤差とする。クライアント100はクライアント100側のタイミングの値を補正する回路(ハードウェア)を備える。この補正回路は、クライアント100のソフトウェアによって制御される。クライアント100のソフトウェアは、許容するジッタの量が与えられるので、ジッタ量を設定すると、クロック周波数比の誤差がどれだけの範囲に収まっていなければならないか、また、補正回路の制御をどれだけの頻度で更新しなければならないかの間隔を決定できる。それらを表示装置などに表示させることもできる。クライアント100のソフトウェアは、クロックの周波数比の誤差が目標とする誤差に到達すれば、補正回路に対してレジスタにリード、ライトすることで制御を行なう。更新しなければならない間隔より短い間隔で繰り返し補正を行なう。クライアント100の補正回路(ハード)は、レジスタにセットされた値を基にタイミングの進み方を早くまたは遅くすることで、クライアント100のタイミングの進み方をサーバー130に合わせる。これにより、クライアント100側のタイミングをサーバー130側のタイミングに合わせることができる。また、クライアント100とサーバー130との間でクロック進み合わせプロトコルを走らせ、その結果を基にクライアント100の補正回路に制御を行なうことを、繰り返し実行することにより、許容するジッタの量を満足した伝送が可能となり、また、任意の時点で許容するジッタの量を満足した伝送が可能となっているかどうかを表示装置等において明示することが可能となる。
また、ソフトウェアは図11における初期の待ち時間を認識できるので、初期の待ち時間が過ぎたときに、他のアプリケーション(たとえば映像伝送アプリケーション)に通知する手段を備えていてもよい。これにより、映像伝送アプリケーションは、初期の待ち時間中には、映像伝送を開始しないような制御をすることができる。
また、初期の待ち時間が過ぎたかどうかを、LED(Light Emitting Diode)等において表示してもよい。これにより、ジッタの許容量を満足した伝送が可能である状態かどうかを外部で判別することができる。
図11における初期の待ち時間の間は、タイミングの補正を行なうことはできない。従って、初期の待ち時間の間に、映像伝送しなければならない時には、補正前のタイミングを出力タイミングの決定に使わざるをえない。
しかし、前回の結果をフラッシュメモリ等の不揮発性メモリに記憶しておけば(クライアント100がクロックパルスの周波数比を記憶する不揮発性メモリをさらに含んでいれば)、時刻補正部107は、前回の結果を使って(不揮発性メモリが記憶したクロック周波数比に基づいて)、発振器105および時刻カウンタ部106が検出したタイミングを補正することもできる。同じ相手と伝送するのであれば、前回の結果はそれなりに信用できるものである。前回の結果を不揮発メモリに記憶することで、次に起動した時の初期の待ち時間にも、タイミングを補正することができる。
また、先頭のリレー構造体については、クロック周波数比が目標となる精度に達していない時点でも、αestを計算してレジスタ群111に書き込みしてもよい。これにより、初期の待ち時間を長く待つことなく、サーバーとクライアント100間のタイミングを一時的に合わせることができる。
また、測定パケットが送信する情報の内容は特に限定されない。特にクロック進み合わせのためだけにパケットを送信する必要はない。任意の目的で通信するパケットを、上述した測定パケットとして送信してもよい。同様に、返信パケットは、サーバー130における測定パケットの受信タイミングを表わすパケットであれば(すなわち、パケットが表わす情報にサーバー130における測定パケットの受信タイミングの情報が含まれていれば)、いかなる情報を通信するためのパケットであってもよい。測定パケットおよび返信パケットが任意の目的で通信されるパケットであることにより、測定のための余計なパケットが発生せず、ネットワークの負荷を抑えることができる。
また、本発明ではサーバー130が測定パケットを受信するとすぐに返信パケットを送信するようにしているが、サーバー130が返信パケットを送信するまでに若干の遅延があっても差し支えない。この場合は、サーバー130が測定パケットを受信した時点でのサーバー130側のタイミングをS1、サーバー130が返信パケットを送信した時点でのサーバー130側のタイミングをS2として、S1,S2を返信パケットの中に含めるようにすると良い。クライアント100は、サーバー130で遅延した時間(S2−S1)を、上記記載のクライアント100がサーバー130から返信された返信パケットを受信した時点でのクライアント100側のタイミングC2から予め差引く。
本発明の具体的な装置としては、送受信機が表示装置に含まれたものがある。表示装置の例として、テレビ、ホームシアター、HDDレコーダ/デジタルチューナ/AVサーバとテレビとの組み合わせ、ホームシアターと無線スピーカとの組み合わせ、あるいは、ネットワーク映像伝送送受信ユニットなどの例が考えられる。
なお、上記実施形態の各処理ステップは、CPUなどの演算手段が、ROM(Read Only Memory)やRAM(Random Access Memory)などの記憶手段に記憶されたプログラムを実行し、キーボードなどの入力手段、ディスプレイなどの出力手段、あるいは、インタフェース回路などの通信手段を制御することにより実現することができる。したがって、これらの手段を有するコンピュータが、上記プログラムを記録した記録媒体を読み取り、当該プログラムを実行するだけで、本実施形態のクライアント100の各種機能および各種処理を実現することができる。また、上記プログラムをリムーバブルな記録媒体に記録することにより、任意のコンピュータ上で上記の各種機能および各種処理を実現することができる。
この記録媒体としては、マイクロコンピュータで処理を行なうために図示しないメモリ、たとえばROMのようなものがプログラムメディアであっても良いし、また、図示していないが外部記憶装置としてプログラム読取り装置が設けられ、そこに記録媒体を挿入することにより読取り可能なプログラムメディアであっても良い。
また、何れの場合でも、格納されているプログラムは、マイクロプロセッサがアクセスして実行される構成であることが好ましい。さらに、プログラムを読み出し、読み出されたプログラムは、マイクロコンピュータのプログラム記憶エリアにダウンロードされて、そのプログラムが実行される方式であることが好ましい。なお、このダウンロード用のプログラムは予め本体装置に格納されているものとする。
また、上記プログラムメディアとしては、本体と分離可能に構成される記録媒体であり、磁気テープやカセットテープ等のテープ系、フレキシブルディスクやハードディスク等の磁気ディスクやCD/MO/MD/DVD等のディスクのディスク系、ICカード(メモリカードを含む)等のカード系、あるいはマスクROM、EPROM(Erasable Programmable Read Only Memory)、EEPROM(Electrically Erasable Programmable Read Only Memory)、フラッシュROM等による半導体メモリを含めた固定的にプログラムを担持する記録媒体等がある。
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
100 クライアント、101,131 CPU、102,132 メモリ、103,133 通信I/F、104,134 時刻制御部、105,135 発振器、106,136 時刻カウンタ部、107 時刻補正部、108 出力タイミング決定部、109,137 バッファ、110,138 映像出力I/F、111 レジスタ群、120 ネットワーク、130 サーバー。