Matlabで伝送路のs-parameterからEYE波形を求める方法
MatlabのRF Toolbox 2.7には、s-parameterを有理関数の伝達関数でモデル化する関数が用意されています。この関数を使うと、伝送路のS-parameterからその伝送路を通した波形のEYE Diagramを簡単に計算できそうです。早速、試してみたくなりました。
http://www.mathworks.co.jp/products/rftoolbox/description4.html
まずは、このblogに実行結果を載せるためにもpublic domainにある伝送路のs-parameterが必要です。IEEE 802.3ap Backplane Ethernetのwebsiteには「典型的な」伝送路(backplane) のs-parameterが公開されています。高性能サーバ向けの長さが1mくらいのバックプレーンとよばれる巨大なPCBの伝送路を測定したs-paraです。
http://grouper.ieee.org/groups/802/3/ap/public/channel_model/index.html
ここからImproved 1m Channelsという項目のファイルをダウンロードします。ファイル名はoganessyan_m1_0306.zipです。Molex社のGourgen Oganessyanさんに感謝!です。zipファイルを展開すると、4 portのs-paraのファイルがいくつか入っています。そのうちのMolex2006-1_T.s4pというファイルを使って遊んでみます。ちなみに、複数あるs-paraのうち、***_T.s4pというのがthruの特性(伝送路の片方の端からもう片方の端までの伝達特性)、***_N?.s4pというのは隣の伝送路とのNear-end xtalk, ***_F?.s4pというのはFar-end xtalkの特性を測定したものだと思われます。
まずは、Molex2006-1_T.s4pからmixed-modeのs-paraであるSDD21を計算して、グラフに表示してみます。
clear all; close all; molex2006_1_spara = read(rfckt.passive, 'Molex2006-1_T.s4p'); s4p = molex2006_1_spara.NetworkData.Data; s_dd = s2sdd(s4p, 1); sdd21 = s_dd(2, 1, :); sdd21 = sdd21(:); freq = molex2006_1_spara.NetworkData.Freq; figure; plot(freq*1e-9, 20*log10(abs(sdd21)), 'b-'); xlabel('Frequency [GHz]'); ylabel('SDD21 [dB]'); grid; set(gca, 'XLIM', [0, 20]); set(gca, 'YLIM', [-100,0]);
これを実行すると、以下のようなSDD21のグラフが表示されるはずです。
次に、このSDD21の周波数応答を、rationalfitという関数を用いて有理関数でモデル化します。ここで、一つ注意点があります。SDD21のデータは20GHzまであります。20GHzまですべてを対象にモデル化を実行すると、モデルと元のSDD21が全く一致しませんでした。恐らく、SDD21の16GHz近辺以上で発生している大きなノイズのために、この部分でモデルと元のSDD21の間に大きな誤差が発生してしまい、正しいモデルを見つけられなかったのだと思います。そこで、今回のコードではモデル化する周波数を16GHz程度までに区切っています。
sdd21_fit = rationalfit(freq(1:end*0.8), sdd21(1:end*0.8)); [resp, freq] = freqresp(sdd21_fit, freq); hold on; plot(freq*1e-9, db(resp), 'g-'); legend('Original', 'Fit');
これを実行すると、上のSDD21のグラフにモデル化した結果の周波数特性が上書きされます。見た目では、10GHz位まではモデルの周波数応答と元のSDD21はそこそこ一致しているようです。10GHz以上16GHzの間は、モデルの方には変なノイズが載っていますが、それでも両者はまあまあ一致しています。
ここから、時間ドメインのSimulationに取り掛かります。まずは、送信データを準備します。今回は、送信データは2値{H,L}とします。このようなSimulationでは、2値の送信データを{+1, -1}と表すのが一般的なようです。(送信データのコモンモード成分をゼロにするためでしょうか?) 以下のコードでは、送信データとしてまず2値のランダムデータを1000個生成します。更に、送信データの滑らかな波形を生成するために、最初に生成した送信データを20倍のOver Samplingを行っています。データレートは5Gb/sです。
Ns=1000; % Simulationするデータ(+1/-1)の個数 OverSamplingFactor = 20; % 送信データをsimulatorの内部では何倍のoversamplingをするかを決める % この例では20倍のoversampling. データレートが5Gb/sならば100GHzでsamplingしている InputSignal=(randn(Ns, 1) > 0)*2-1; % Ns個の送信データ{+1, -1}を生成 InputSignal=repmat(InputSignal', [OverSamplingFactor,1]); InputSignal=InputSignal(:); % 送信データをOverSamplingFactor倍の周波数でSamplingしなおす UI=200e-12; % 送信データのデータレート, この例では5Gbpsなので1周期は200ps SampleTime = UI/OverSamplingFactor; % OverSamplingした後の1周期 figure; hold on; for i=0:Ns-3 plot([0:OverSamplingFactor*2]*SampleTime*1e12, InputSignal(i*OverSamplingFactor+1:(i+2)*OverSamplingFactor+1), 'g-') end grid; xlabel('Time [ps]'); ylabel('Amplitude'); title('Input EYE Diagram'); set(gca, 'YLIM', [-1.1, 1.1]); set(gca, 'XLIM', [0, UI*1e12*2]);
実行すると、送信データのEYE Diagramが表示されます。伝送路を通る前なので、Jitterの無い理想的な矩形波のEYEとなります。データレートを5Gb/sにしましたが、EYEの1周期がちゃんと200psになっていることが確認できます。
最後に、伝送路を通った後の波形を計算して、そのEYE Diagramを表示します。timerespという関数に、ここまでに計算したSDD21の有理関数モデルと送信データ列を入力すると、送信データが有理関数モデルで表されるシステムで処理された出力 (=伝送路の出口の波形) を計算してくれます。
[OutputSignal, t] = timeresp(sdd21_fit, InputSignal, SampleTime); % SDD21で表される伝送路を通った後の波形を計算 figure; hold on; for i=100:Ns-3 plot([0:OverSamplingFactor*2]*SampleTime*1e12, OutputSignal(i*OverSamplingFactor+1:(i+2)*OverSamplingFactor+1), 'b-') end grid; xlabel('Time [ps]'); ylabel('Amplitude'); title('Output EYE Diagram'); set(gca, 'XLIM', [0, UI*1e12*2]);
以下のような、伝送路で大きなJitterが発生したEYEが表示されます。こんなSimulationがとても簡単に出来るようになったんですね。とても面白いです。