start implementation of class based simulation of a IM/DD communication system. Mostly based on Move-It but cleaned up and with focus on direct detection, however I try to keep the versatility of move-it alive.
136 lines
4.5 KiB
Matlab
136 lines
4.5 KiB
Matlab
classdef EML
|
|
%EML External Modulated Laser
|
|
% Detailed explanation goes here
|
|
|
|
properties
|
|
%class input objms
|
|
mode
|
|
fsimu %in Hz
|
|
lambda %in nm
|
|
power %in dBm
|
|
linewidth %in Hz
|
|
ampl_imbal
|
|
pha_imbal
|
|
bias
|
|
u_pi
|
|
|
|
%on instance creation
|
|
field
|
|
noisefactor
|
|
phase %eigentlich nur wichtig wenn man mehrere blöcke durchsimuliert...
|
|
real_factor
|
|
imag_factor
|
|
|
|
%during simulation
|
|
signal_len
|
|
|
|
end
|
|
|
|
methods
|
|
function obj = EML(options)
|
|
%EML Construct an instance of this class
|
|
% Detailed explanation goes here
|
|
arguments
|
|
options.mode;
|
|
options.fsimu;
|
|
options.lambda;
|
|
options.power;
|
|
options.linewidth = 0;
|
|
options.ampl_imbal = 0;
|
|
options.pha_imbal = 0;
|
|
options.bias;
|
|
options.u_pi;
|
|
end
|
|
|
|
obj.mode = options.mode;
|
|
obj.fsimu = options.fsimu;
|
|
obj.lambda = options.lambda;
|
|
obj.power = options.power;
|
|
obj.linewidth = options.linewidth;
|
|
obj.ampl_imbal = options.ampl_imbal;
|
|
obj.pha_imbal = options.pha_imbal;
|
|
obj.bias = options.bias;
|
|
obj.u_pi = options.u_pi;
|
|
|
|
obj.field=sqrt(10^(obj.power/10-3)); %dbm to sqrt(mw)
|
|
|
|
obj.noisefactor=sqrt(2*pi*obj.linewidth/obj.fsimu);
|
|
obj.phase=0;
|
|
|
|
if obj.mode==4 || obj.mode==5
|
|
obj.real_factor=(1+obj.ampl_imbal/2)*exp(1i*obj.pha_imbal/2);
|
|
obj.imag_factor=(1-obj.ampl_imbal/2)*exp(1i*(pi/2-obj.pha_imbal/2));
|
|
end
|
|
|
|
end
|
|
|
|
function [opt_out,obj] = process(obj,elec_in)
|
|
%METHOD1 Summary of this method goes here
|
|
% Detailed explanation goes here
|
|
|
|
%needed later
|
|
obj.signal_len = length(elec_in);
|
|
|
|
% generate phase noise of laser
|
|
% scale with signal energy in sqrt(mw)
|
|
if obj.linewidth ~= 0
|
|
ph_noi = obj.createPhaseNoise;
|
|
laserfield = obj.field.*exp(1i*ph_noi);
|
|
else
|
|
laserfield = obj.field;
|
|
end
|
|
|
|
%modulate the laserfield with the electrical signal
|
|
opt_out = obj.externalmodulation(laserfield,elec_in);
|
|
|
|
%remember phase (! you need to receive the altered eml object in you sim program !)
|
|
obj.phase = ph_noi(end);
|
|
|
|
end
|
|
|
|
function noi = createPhaseNoise(obj)
|
|
%create random vector
|
|
noi = randn(obj.signal_len,1);
|
|
%scale with noisefactor
|
|
noi = noi * obj.noisefactor;
|
|
%cumsum to accumulate noise over time vector
|
|
noi = cumsum(noi);
|
|
%add phase from previous block/ loop of simulation
|
|
noi = noi + obj.phase;
|
|
end
|
|
|
|
function modulated_laserfield = externalmodulation(obj,laserfield,electrical_in)
|
|
|
|
switch obj.mode
|
|
|
|
case 1 % linear IM
|
|
modulated_laserfield = laserfield.*sqrt(real(electrical_in + obj.bias)/obj.u_pi);
|
|
|
|
case 2 % IM with hMZM function
|
|
modulated_laserfield = laserfield.*cos(pi/2*(real(electrical_in)+obj.bias)/obj.u_pi);
|
|
|
|
case 3 % PMsi
|
|
modulated_laserfield = laserfield.*exp(1i*pi*real(electrical_in)/obj.u_pi);
|
|
|
|
case 4 % linear IQ-Modulator
|
|
if obj.ampl_imbal ==0 && obj.pha_imbal == 0
|
|
% No IQ Imbalance
|
|
modulated_laserfield=laserfield.*electrical_in/obj.u_pi;
|
|
else
|
|
% with IQ Imbalance
|
|
modulated_laserfield = laserfield.*(real(electrical_in)*obj.real_factor/obj.u_pi...
|
|
+imag(electrical_in)*obj.imag_factor/obj.u_pi);
|
|
end
|
|
|
|
case 5 % IQ-Modulator with cosine function
|
|
modulated_laserfield = laserfield/sqrt(2).*(cos(pi/2*(real(electrical_in)+obj.bias)/obj.u_pi)*obj.real_factor...
|
|
+cos(pi/2*(imag(electrical_in)+obj.bias)/obj.u_pi)*obj.imag_factor);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
|