LFSRの疑似乱数でコード変調の実験
開発中のCosmo-Z Miniに備わっているDAコンバータとADコンバータをループバックして、LFSRの実験をしてみました。
LFSRというのは線形フィードバックレジスタのことで、XORを使ってシフトレジスタをフィードバックしたものです。疑似乱数を作るときによく使われるもので、M系列というものになるように係数を設定すると都合がよくなります。詳しいことはググってください。
さて、X^14+x^13+x^12+x^2+1という多項式にするとM系列になるようなので、
ref_lfsr <= ref_lfsr(12 downto 0) & (ref_lfsr(13) xor ref_lfsr(12) xor ref_lfsr(11) xor ref_lfsr(1));
という式を書いて実際に試してみました。
125MHzの速度でLFSRを出力して、オシロで見ると、
このようなランダムな波形となります。HとLの高さんが2段階見えるのは、H→HとL→Hの場合とで落ち着く電圧が異なるためです。
この波形をCosmo-ZのADCで取り込んでみました。緑の線がLFSRの乱数の系列で、茶色の線がADCから受信した波形です。
ぱっと見た感じでは20~30クロック遅れて受信しているように思われます。L→L、L→Hで信号のレベルが異なっているのがわかります。
疑似乱数の系列を少しずつ遅延させていきます。
だいぶん位置が合うようになってきました。
LFSRの参照信号が1のときは1、0のときは-1を、ADCの信号に掛けます。そして、その掛け算した結果を1周期分積分します。
紫の線が乗算結果で、灰色の線がそれを総和したものです。特に灰色の線は0の付近で動いていません。
次の図は、参照信号と受信した波形の周期がぴったりと一致した場合です。
乗算結果のピンクの線が常に負の値となり、積算結果もぐんぐん伸びていきました。
より長い範囲で見てみます。参照信号の遅延がぴったりと一致している場合。
そこから1ビット遅れた場合。
このように、受信した信号と参照信号が一致した場合にのみ、灰色の線が0ではない値になります。
1クロックずつ参照信号のタイミングをずらしていって、結果としてどのような遅延時間のときにデコード出力が出るかを調べました。
上のグラフは、周期16383のLFSRで変調されたデータを、同じ系列のLFSRを0~16383まで遅延させて掛けて、積算したデコード結果です。
遅延がほぼ0のときにだけ大きな値が出ています。
この部分を拡大し、横軸を遅延時間、縦軸を電圧に換算したものが下の図です。DACとADCをつなぐケーブルを50cm、1m、2mの3種類に変えて実験しました。
その結果、ピークを中心に±1くらいの範囲でデコード出力が非ゼロになることがわかります。遅延時間が完全に一致しなくても出力が残るのは、波形が鈍るからでしょう。鈍った波形の中にも元の波形に由来する成分があるからです。
今回の実権の構成では、125MHzのクロックで125MHzまでのDACとADCを動かし、OPアンプ回路も100MHz程度の帯域しかありませんので、基本的にはアナログの帯域が足りておらず、理想的な矩形波にはなっていないでしょう。おそらく、かなり鈍った矩形波です。
それでも、遅延時間が一致した場合のみ出力が出るので、コード変調のS/Nの高さがうかがい知れます。
| 固定リンク
コメント
折角LFSR(MLS)を使っているのなら、アダマール変換でインパルス応答をリアルタイムに表示できるようにしたらおもしろそうですね。
投稿: wind | 2018.03.21 17:17