O-band Amp Characterization Measurement

This commit is contained in:
Silas Labor Zizou
2025-12-18 09:56:52 +01:00
parent 08e3e00698
commit ec6f5eda86
23 changed files with 960 additions and 26 deletions

View File

@@ -0,0 +1,127 @@
% Silas Amplifier characterization
laser = Exfo_laser("mainframe_channel",1,"safety_mode",0,"connection_id",'10','lab_interface','gpib');
laser.getLaserInfo();
laser.disableLaser;
laser.setWavelength(1310);
laser.enableLaser;
% pm = OptPowerMeter8153A("active",[0,1],"wavelength_nm",[1550,1310]);
% pm.readPower
% pdfa = Thor_PDFA();
%%
params.laserpower = [-30,-20,-10,0];
params.lambda = [1260:5:1360]; %calcWavelengthPlan(16, 400e9 , 1310);
params.pump = [50,75,100];
wh = DataStorage(params);
wh.addStorage("spectrum_osa");
wh.addStorage("wavelength_osa");
wh.addStorage("psig_osa");
wh.addStorage("pase_osa");
wh.addStorage("osnr_osa");
wh.addStorage("amp_gain");
wh.addStorage("psig_total");
cols = linspecer(numel(params.laserpower));
ccnt = 0;
for p = params.laserpower
ccnt=ccnt+1;
laser.setWavelength(params.lambda(1));
usrcmd = sprintf('Laser to %d dBm',p);
waitUntilClick('Text',usrcmd);
for pmp = params.pump
% pdfa.setPumpLevel(pmp);
usrcmd = sprintf('Amp to %d mA',2*pmp);
waitUntilClick('Text',usrcmd);
for w = params.lambda
laser.setWavelength(w)
% pm.setWavelength([1550, w]);
span_nm = 5;
lambda_c_nm = w;
osa = OSA_Advantest( ...
'span_nm', 40, ...
'lambda_c_nm', w, ...
'resolution_nm', 0.1, ...
'sampling_points', 1001 );
osa.configure();
% OSA
[lambda_nm, psd_dBm] = osa.measure();
osnr = osa.computeOSNR('bw_signal_nm',0.01,'ref_bw_nm',0.1,'debugplots',0,...
'carrier_frequency',w,'noise_guard_nm',1,'noise_window_nm',1);
osa.plot("FigureNumber",pmp+1,"Color",cols(ccnt,:));
xlabel('Wavelength [nm]');
ylabel('Opt. Spectrum [dBm]');
xlim([params.lambda(1)-5 params.lambda(end)+5])
grid minor
% Powermeter
totalpower=10*log10(sum(10.^(psd_dBm./10)));
% [totalpower]=pm.readPower;
% totalpower=totalpower(2) + 20; %20dB attenuation with eigenlight to satisfy 3dB max of PMeter
wh.addValueToStorage(lambda_nm,'wavelength_osa',p,w,pmp);
wh.addValueToStorage(psd_dBm,'spectrum_osa',p,w,pmp);
wh.addValueToStorage(osnr.p_ase_db,'pase_osa',p,w,pmp);
wh.addValueToStorage(osnr.p_sig_db,'psig_osa',p,w,pmp);
wh.addValueToStorage(osnr,'osnr_osa',p,w,pmp);
wh.addValueToStorage(totalpower,'psig_total',p,w,pmp);
end
end
% before tuning all the way back to 1270nm set PDFA off
% pdfa.setPumpLevel(0);
% pdfa.disablePDFA;
end
%% OSNR
figure(2);hold on
for p = [-30:10:0]
pmp = 100;
osnr = wh.getStoValue('osnr_osa',p,params.lambda,pmp);
osnr_measured_dB = cellfun(@(x) x.measured_dB, osnr);
osnr_direct_dB = cellfun(@(x) x.direct_dB, osnr);
plot(params.lambda,osnr_direct_dB,'DisplayName',sprintf('P_{in}: %d dB ',p));
end
legend
%% P out
figure(3);hold on
for p = [-30:10:0]
pmp = 100;
psig_osa = wh.getStoValue('psig_osa',p,params.lambda,pmp)+3;
pl=plot(params.lambda,psig_osa,'DisplayName',sprintf('P_{signal}: %d dB ',p));
psig_powermeter = wh.getStoValue('psig_total',p,params.lambda,pmp)+3;
plot(params.lambda,psig_powermeter,'DisplayName',sprintf('P_{total}: %d dB ',p),'LineStyle','--','Color',pl.Color);
yline(p,'Color',pl.Color,'DisplayName',sprintf('P_{total}: %d dB ',p));
end
legend
%% GAIN
figure(3);hold on
for p = [-30:10:0]
pmp = 50;
psig_osa = wh.getStoValue('psig_osa',p,params.lambda,pmp);
% psig_powermeter = wh.getStoValue('psig_powermeter',p,params.lambda,pmp);
g = psig_osa-p;
pl=plot(params.lambda,g,'DisplayName',sprintf('P_{in}: %d dB ',p));
end
legend

View File

@@ -0,0 +1,111 @@
% Silas Amplifier characterization
laser = Exfo_laser("mainframe_channel",1,"safety_mode",0,"connection_id",'10','lab_interface','gpib');
laser.getLaserInfo();
laser.disableLaser;
laser.setWavelength(1310);
laser.enableLaser;
pdfa = Thor_PDFA();
%%
params.laserpower = [-30,-20,-10,0];
params.lambda = [1310]; %calcWavelengthPlan(16, 400e9 , 1310);
params.pump = [0:5:100];
wh = DataStorage(params);
wh.addStorage("spectrum_osa");
wh.addStorage("wavelength_osa");
wh.addStorage("psig_osa");
wh.addStorage("pase_osa");
wh.addStorage("osnr_osa");
wh.addStorage("amp_gain");
wh.addStorage("psig_total");
cols = linspecer(numel(params.laserpower));
ccnt = 0;
for p = params.laserpower
ccnt=ccnt+1;
laser.setWavelength(params.lambda(1));
usrcmd = sprintf('Laser to %d dBm',p);
waitUntilClick('Text',usrcmd);
for w = params.lambda
laser.setWavelength(w)
% pm.setWavelength([1550, w]);
span_nm = 5;
lambda_c_nm = w;
osa = OSA_Advantest( ...
'span_nm', 40, ...
'lambda_c_nm', w, ...
'resolution_nm', 0.1, ...
'sampling_points', 1001 );
osa.configure();
for pmp = params.pump
% pdfa.setPumpLevel(pmp);
usrcmd = sprintf('Amp to %d %',pmp);
waitUntilClick('Text',usrcmd);
% OSA
[lambda_nm, psd_dBm] = osa.measure();
osnr = osa.computeOSNR('bw_signal_nm',0.01,'ref_bw_nm',0.1,'debugplots',0,...
'carrier_frequency',w,'noise_guard_nm',1,'noise_window_nm',1);
osa.plot("FigureNumber",abs(p)+10,"Color",cols(ccnt,:));
xlabel('Wavelength [nm]');
ylabel('Opt. Spectrum [dBm]');
grid minor
% Powermeter
totalpower=10*log10(sum(10.^(psd_dBm./10)));
% [totalpower]=pm.readPower;
% totalpower=totalpower(2) + 20; %20dB attenuation with eigenlight to satisfy 3dB max of PMeter
wh.addValueToStorage(lambda_nm,'wavelength_osa',p,w,pmp);
wh.addValueToStorage(psd_dBm,'spectrum_osa',p,w,pmp);
wh.addValueToStorage(osnr.p_ase_db,'pase_osa',p,w,pmp);
wh.addValueToStorage(osnr.p_sig_db,'psig_osa',p,w,pmp);
wh.addValueToStorage(osnr,'osnr_osa',p,w,pmp);
wh.addValueToStorage(totalpower,'psig_total',p,w,pmp);
end
end
end
%% P out
figure(3);hold on
for p = [-30:10:0]
psig_osa = wh.getStoValue('psig_osa',p,params.lambda,params.pump);
pl=plot(params.pump,psig_osa,'DisplayName',sprintf('P_{signal}: %d dB ',p));
psig_total = wh.getStoValue('psig_total',p,params.lambda,params.pump);
plot(params.pump,psig_total,'DisplayName',sprintf('P_{total}: %d dB ',p),'LineStyle','--','Color',pl.Color);
pase = wh.getStoValue('pase_osa',p,params.lambda,params.pump);
plot(params.pump,pase,'DisplayName',sprintf('P_{ASE}: %d dB ',p),'LineStyle',':','Color',pl.Color);
end
legend
%% Gain
figure(4);hold on
for p = [-30:10:0]
% Die -2dB sind Korrekturfaktor aus dem Setup! Gilt für PDFA und SOA
psig_osa = wh.getStoValue('psig_osa',p,params.lambda,params.pump);
pl=plot(params.pump,psig_osa-(p-2),'DisplayName',sprintf('Gain: %d dB ',p));
psig_total = wh.getStoValue('psig_total',p,params.lambda,params.pump);
pl=plot(params.pump,psig_total-(p-2),'DisplayName',sprintf('Gain: %d dB ',p),'Color',pl.Color,'LineStyle','--');
end
legend

View File

@@ -0,0 +1,54 @@
laser = Exfo_laser("mainframe_channel",1,"safety_mode",0,"connection_id",'10','lab_interface','gpib');
laser.getLaserInfo();
pm = OptPowerMeter8153A("active",[0,1],"wavelength_nm",[1550,start_wavelength]);
pm.readPower
laserparams.lambda = [1260:2:1360];
laserparams.laserpower = [0,3,6,8,10];
laser_output_wh = DataStorage(laserparams);
laser_output_wh.addStorage("plaser");
pm = OptPowerMeter8153A("active",[0,1],"wavelength_nm",[1550,1310]);
laser.setWavelength(1310);
cw_pwr = NaN(numel(laserparams.laserpower),numel(laserparams.lambda));
row = 1;
for p = laserparams.laserpower
laser.setPower(p);
cnt = 1;
for w = laserparams.lambda
laser.setWavelength(w);
pm.setWavelength([1550,w]);
for i = 1:20
[totalpower]=pm.readPower;
cw_measurement(i)=totalpower(2)+10;
cw_pwr(row,cnt) = mean(cw_measurement);
pause(3);
end
laser_output_wh.addValueToStorage(cw_measurement,'plaser',w,p);
figure(2027);clf
plot(laserparams.lambda,cw_pwr(1:row,:),'Marker','*');
xlabel('Wavelength [nm]');
ylabel('Laser Output Power [dBm]');
ylim([0, 11]);
xlim([laserparams.lambda(1) laserparams.lambda(end)])
grid minor
cnt = cnt+1;
end
row = row+1;
end
figure();hold on
for p = laserparams.laserpower
plot(laserparams.lambda,laser_output_wh.getStoValue('plaser',laserparams.lambda,p))
end
xlabel('Wavelength [nm]');
ylabel('Laser Output Power [dBm]');
ylim([0, 11]);
xlim([laserparams.lambda(1) laserparams.lambda(end)])
grid minor

Binary file not shown.

Binary file not shown.

Binary file not shown.