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 Ethernetwebsiteには「典型的な」伝送路(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がとても簡単に出来るようになったんですね。とても面白いです。