Start Commit
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.
This commit is contained in:
135
Classes/EML.m
Normal file
135
Classes/EML.m
Normal file
@@ -0,0 +1,135 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user