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しなおす