Simulinkを使って断続的にPLLの実験を進めています。
当初は「解析的なアプローチも交えて」などと都合のいいことを考えていましたが、数式を変形していくときの便宜的な手法を数式処理システムに乗せる方法で躓いた後、シミュレーション一本に絞ることにしました。
なんにしろブロックダイアグラムを入力するだけでシミュレーションができるSimulinkはとても手軽です。すでに書いたように躓きはありましたが乗り越えてしまえば便利この上ありません。
単純な構成のPLLは数学的な挙動がよくわかっていますので、Simulink習熟用の教材としても私には好都合でした。
PLLの実験となれば焦点はロック・インまでの時間とキャプチャ・レンジです。ここしばらくは原始的なPLLから初めて少しずつブロックを増やしていきました。
最初に機能拡張を行ったのは、atan()ブロックです。このブロックの値域は(-π, π)の範囲ですが、これが原因でPLLがサイクル・スリップを起こします。今回開発しようとしているSDRでは自走周波数12kHz、入力のキャリア周波数は最悪で+/-1kHzくらいの精度を見込んでいます。そのため、サイクル・スリップが起きやすい条件です。
atan()ブロックは直前の出力値と比較することでラップ・アラウンドが起きたか確認しています。ラップ・アラウンドを検出した場合にはオフセットを調整することで(-π, π)を超える位相の動きを追跡できるようにしています。atan()は周波数変換器をとあわせて位相比較器を構成していますので結果的にサイクル・スリップが起きない構成となっています(イメージの影響を排除するために、信号も局初も複素信号としている)。
この週末はLPFを追い込んでいました。雑音無しの信号であれば拡張atanの後ろにLPFを入れるだけできれいに収束してくれます。しかしながら大振幅の雑音を入れると収束しないケースが多いことがわかりました。試行錯誤の末、周波数変換器とatan()の間(つまり位相比較器の中)に追加のLPFを入れることでロックインの特性が向上することがわかりました。多少場当たり的な対応であることは否めないです。
位相比較器の中と後ろのLPFはそれぞれ30Hzです。これで信号の(S+N)/N比が12dB程度まではロックします。自走周波数と信号周波数が1kHz離れているときのロックイン時間は1秒以下、ロック中の周波数の揺れは+/- 0.25Hz程度です。目指している特性としては十分です。
なお、実機でのブロック処理を見越して48サンプルのディレイを入れています。
思いのほか複雑になりましたが、このPLLを実際の受信系に組み込むかは未定です。今のところ、フィールドでの周波数キャリブレーションを目的としていますので複雑になったことは問題ではありません。