ソフトウェア位相ロックループのサンプルコードが必要です
-
09-06-2019 - |
質問
ソフトウェアフェーズロックループ(SPLL)の実際のコード例を見つけることができる場所を誰か知っていますか?
1.1 KHz ~ 1.3 KHz の間の PSK 変調信号を追跡できる SPLL が必要です。Googleで検索すると学術論文や特許がたくさん出てきますが、使えるものは何もありません。ハードウェア PLL に関する本が棚いっぱいに並んでいる大学の図書館に行っても、SPLL に関する書籍は 1 冊に 1 章しかなく、実践的というよりは理論的な内容でした。
御時間ありがとうございます。
イアン
解決
これはデジタルを設計するためのインタラクティブなデザインパッケージです(すなわちソフトウェア)フェーズロックループ(PLL)。フォームに記入して、「送信」ボタンを押すと、PLLが設計されます。
これで始められますが、 本当に 後でトラブルシューティングを行うために、PLL 設計の基礎を十分に理解し、自分で構築できるようにする必要があります。これはデジタル信号処理の領域であり、黒魔術ではありませんが、デバッグ中に確実に元が取れるようになります。
-アダム
他のヒント
あなたを助けるにはおそらく遅すぎると思いますが(結局何をしましたか?)、次の人を助けるかもしれません。
これは、私が C の 1 行で書いたソフトウェア フェーズ ロック ループの素晴らしい例です。あなたと一緒に歌ってくれます。
main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}
私が最初にこの小さなゴルフ版を紹介するのは、ソフトウェアの位相ロック ループは、難しい場合もありますが、ソフトウェアが進むにつれ、実際には非常に単純であることを納得してもらうためです。
標準入力で 8 ビットの線形サンプルを供給すると、標準出力で 1 オクターブ高い音を追跡しようとするノコギリ波の 8 ビット サンプルが生成されます。1 秒あたり 8000 サンプルで、中央 C より下の B のすぐ上、250 Hz 付近の周波数を追跡します。Linux では、次のように入力してこれを実行できます。 arecord | ./pll | aplay
. 。下位9ビット b
は発振器 (ハードウェア実装では VCO となる可能性があります) で、入力波形と乗算される方形波 (1 または -1) を生成します (getchar()
) 位相検出器の出力を生成します。その出力はローパスフィルターにかけられ、 a
の発振周波数を調整するために使用される平滑化された位相誤差信号を生成します。 b
プッシュする a
0に向かって。方形波の固有周波数は、 a == 0
, 、のためのものです b
サンプルごとに 16 ずつ増加し、32 サンプルごとに 512 (フルサイクル) ずつ増加します。1 秒あたり 8000 サンプルの 32 サンプルは 1/250 秒に相当するため、固有周波数は 250Hz になります。
それから putchar()
下位 8 ビットを取得します b
, 、500Hz程度のノコギリ波を構成し、出力オーディオストリームとして吐き出します。
この単純な例にはいくつかの点が欠けています。
それは良いことはありません ロックを検出する方法. 。無音、ノイズ、または強力な純粋な 250Hz の入力トーンがある場合、a はほぼゼロになり、b はデフォルトの周波数で発振します。アプリケーションによっては、信号が見つかったかどうかを知りたい場合があります。第 12 章における Camenzind の提案 アナログチップの設計 実位相検出器から 90° 位相がずれた 2 番目の「位相検出器」に信号を供給することです。平滑化された出力により、理論的にロックオンした信号の振幅が得られます。
発振器の固有周波数は固定されており、 掃除しない. 。の 捕捉範囲 PLL の場合、現在周波数にロックされていない場合に発振を認識できる周波数の間隔はかなり狭いです。その ロック範囲, 、一度ロックオンされた信号を追跡するためにその範囲を超えることは、はるかに大きくなります。このため、ロックが得られるまで信号が見つかると予想される範囲全体で PLL の周波数をスイープし、その後スイープを停止するのが一般的です。
上記のゴルフバージョンは、 C でのソフトウェア位相ロック ループのより読みやすい例 今日私が書いたものは、ロック検出は行いますが、スイープは行いません。私のネットブックの Atom CPU では、PLL ごとに入力サンプルごとに約 100 CPU サイクルが必要です。
私があなたの立場だったら、次のことを行うと思います (私よりも信号処理に詳しい人を探す、テスト データを生成するなどの明白なことは別として)。信号はすでに非常に低い周波数にあるため、フロントエンドで信号をフィルタリングしたりダウンコンバートしたりすることはおそらくありません。200Hz ~ 400Hz 帯域へのダウンコンバートはほとんど必要ないようです。PSK ではいくつかの新たな問題が生じるのではないかと思います。なぜなら、信号の位相が突然 90° 以上シフトすると、位相ロックが失われるからです。しかし、それらの問題は簡単に解決できると思いますし、未踏の領域ではありません。
Simulink を使用した Matlab をお持ちですか?Matlab Central で PLL デモ ファイルを入手できます。 ここ. 。Matlab のコード生成機能を使用すると、そこから C で記述された PLL にたどり着く可能性があります。