Matlabで伝送路のs-parameterからEYE波形を求める方法(その2)

前回の日記の続きで、MatlabのRF Toolboxで遊んでみました。RF Toolboxには、2つのs-paraを接続したときの全体のs-paraを求める関数 cascadesparams が用意されています。この関数を用いると、2本の伝送路のそれぞれのs-paraがある場合に、その2本を接続した長い伝送路を用いて通信を行った場合の受信波形(EYE Diagram)を簡単に求めることが出来ます。ここでは、前回と同様にIEEE 802.3apのwebsiteからダウンロードしたImproved 1m Channelsというs4pを使用します。このzipファイルには2本の伝送路についてのs-paraが含まれています。

まずは、2個のs-paraを接続する部分のcodingです。最新のRF Toolboxに含まれている cascadesparams は、入力として任意の大きさの2Nx2Nの行列を受け付けるようです。しかし、私が使用している古いRT Toolboxに含まれいる cascadesparams は2x2の行列のみしか接続することができません。仕方が無いので、それぞれの伝送路のs4pをまずmixed-modeのs-paraに変換して、そのdifferential modeの伝送に関する2x2の行列を抜き出して、この行列を接続することにしました。

clear all;
close all;

freq = [0.01e9: 0.01e9: 20e9];
molex2006_1_spara = read(rfckt.passive, 'Molex2006/Molex2006-1_T.s4p');
analyze(molex2006_1_spara, freq);
s4p = molex2006_1_spara.AnalyzedResult.S_Parameters;
molex2006_1_sdd = s2sdd(s4p, 1);
molex2006_1_sdd21 = molex2006_1_sdd(2, 1, :);
molex2006_1_sdd21 = molex2006_1_sdd21(:);

molex2006_2_spara = read(rfckt.passive, 'Molex2006/Molex2006-2_T.s4p');
analyze(molex2006_2_spara, freq);
s4p = molex2006_2_spara.AnalyzedResult.S_Parameters;
molex2006_2_sdd = s2sdd(s4p, 1);

Molex_T1_T2_sdd = cascadesparams(molex2006_1_sdd, molex2006_2_sdd);
sdd21 = Molex_T1_T2_sdd(2, 1, :);
sdd21 = sdd21(:);

figure;
hold on;
plot(freq*1e-9, 20*log10(abs(molex2006_1_sdd21)), 'b-');
plot(freq*1e-9, 20*log10(abs(sdd21)), 'r-');
xlabel('Frequency [GHz]');
ylabel('SDD21 [dB]');
grid;
set(gca, 'XLIM', [0, 20]);
set(gca, 'YLIM', [-100,0]);

sdd21_fit = rationalfit(freq(1:end*0.4), sdd21(1:end*0.4));
[resp, freq] = freqresp(sdd21_fit, freq);
hold on; 
plot(freq*1e-9, db(resp), 'g-');
legend('T1', 'T1+T2', 'Fit');

これを実行すると、下のようなグラフが表示されます。青い線が1番目の伝送路だけの特性、赤い線が1番目と2番目の伝送路を接続した場合の特性、緑の線が赤い線を有理関数でモデル化した特性です。

次に、1番と2番の伝送路を結合した伝送路を通信した波形のEYE Diagramを計算します。上で求めた結合した伝送路のSDD21を使って前回と同じコードを実行すると、5Gb/sの受信データのEYE Diagramは以下のようになります。EYEが完全にクローズしてしまっています。

ちなみに、前回に計算した1番目だけの伝送路のEYE Diagramは以下のようになりました。ぜんぜん違っています。

そこで、送信データにpre-emphasisをかけてEYEが開くかを試してみます。送信データを生成する部分のコードにpre-emphasisを追加してみました。

Ns=1000;                    % Simulationするデータ(+1/-1)の個数
OverSamplingFactor = 20;    % 送信データをsimulatorの内部では何倍のoversamplingをするかを決める
                            % この例では20倍のoversampling. データレートが10Gb/sならば200GHzでsamplingしている
InputSignal=(randn(Ns, 1) > 0)*2-1;  
                            % Ns個の送信データ{+1, -1}を生成
txeq = [0.55, -0.45];
InputSignal=conv(InputSignal,txeq);
InputSignal=repmat(InputSignal', [OverSamplingFactor,1]);

InputSignal=InputSignal(:);
                            % 送信データをOverSamplingFactor倍の周波数でSamplingしなおす

Premphasisの値を適当にいじってみると、なんとか受信データでEYEを開くことが出来ました。