clear all O = 15; %order of prbs N = 2^(O-1); %length of prbs [~,seed] = prbs(O,1); %initialize first seed of prbs % Modulation M = 4; %PAM-M bitpattern = zeros(N,log2(M)); % Symbol Rate fsym = 56e9; % DAC Rate fdac = 120e9; % Simulation oversampling rate "k"; kover = 16; % ADC Rate fadc = 256e9; % Simulation frequency in "analog domain" fsimu = kover * fdac ; %CONSTRUCTION pam_mapper = PAMmapper(M,0); awg = AWG('preset','M8196A','fdac',fdac,'kover',kover,'lpf_active',0,'f_cutoff',80e9,'lpf_type',filtertypes.bessel_bilin); %fil_tx = Filter('filtdegree',1,"f_cutoff",80e9,"fsamp",fdac,"filterType",filtertypes.bessel_bilin); fil_tx = Filter('filtdegree',1,"f_cutoff",50e9,"fsamp",fdac,"filterType",filtertypes.bessel_bilin); u_pi = 3.5; vbias = (0.5*u_pi)-u_pi; extmodlaser = EML("mode",emlmodes.im_cosinus,"power",10,"fsimu",fsimu,"lambda",1550,"bias",vbias,"u_pi",u_pi,"linewidth",1000); amp = Amplifier("amplification_db",10,"amp_mode","gain","type","ideal","saturation_mode",0,'saturation_power',10); fib = Fiber("fsimu",fdac*kover,"fiber_length",2,"alpha",0.2,"D",17,"lambda0",1550); phdiode = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20); fil_diode = Filter('filtdegree',4,"f_cutoff",70e9,"fsamp",fdac,"filterType",filtertypes.bessel_bilin); scp = Scope("fsimu",fdac*kover,"fadc",fadc,... "delay",0,"fixed_delay",0,"lpf_bw",120e9,"filtertype",filtertypes.bessel_inp,... "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0,... "adcresolution",6,"quantbuffer",0.1); eq = EQ("K",2,"plottrain",0,"plotfinal",1,"training_length",2048,"Ne",[25,5,5],"Nb",[2,0,0],"training_loops",5,"DCmu",0.005,"DDmu",[0.0004 0.0004 0.0004 0.0004 ],"DFEmu",0.005,"FFEmu",0,"thres",[0.005 0.004 0.0005 ]); %SIMULATE % INFORMATION SIGNAL for i = 1:log2(M) [bitpattern(:,i),seed] = prbs(O,N,seed); end X = Informationsignal(bitpattern); PAMSIG = pam_mapper.map(X); X = PAMSIG; X.signal = applyPulseShaping(PAMSIG.signal,fsym,fdac); % ELECTRICAL DOMAIN X = awg.process(X); X = fil_tx.process(X); % OPTICAL DOMAIN X = extmodlaser.process(X); X = amp.process(X); X = fib.process(X); X = phdiode.process(X); X = fil_diode.process(X); % ELECTRICAL DOMAIN X = scp.process(X); X = X.resample("fs_out",2*fsym,"fs_in",fadc); % INFORMATION SIGNAL X = eq.process(X,PAMSIG); X = pam_mapper.demap(X); % BER [bits,errors,BER] = calc_ber(X.signal(:,10000:end-21),bitpattern(10000:end-20,:)',0); disp(['BER: ', sprintf('%2E',BER)]); disp(X.logbook); function yout = applyPulseShaping(xin,fsym,fdac) if ~rem(fdac,fsym) %ist ein Vielfaches sps = fdac / fsym; up = sps; dn = 1; else %ist kein Vielfaches up = fdac / gcd(fdac, fsym); dn = fsym / gcd(fdac, fsym); sps= up; end %Bau das Filter (hier rrc) racos_len = 2048; alpha = 0.1; h = rcosdesign(alpha,racos_len,sps); %Apply Filter using Matlab build in fctn. yout = upfirdn(xin,h,up,dn); %cut signal, which is longer due to fir filter st = round(up/dn*racos_len/2); %we need to cut y_out en = round(st + (length(xin)*up/dn) -1); yout = yout(st:en); %Check output integrity if round(up/dn * length(xin)) ~= length(yout) warning('Check signal length after pulse shaping'); end end function [bits,errors,BER] = calc_ber(data_in,data_ref,skip) data_ref=logical(data_ref); data_in = logical(data_in); bits = 0; errors=0; data_ref_overlap=zeros(size(data_ref,1),skip+(length(data_ref)-size(data_in,2))); data_ref_pointer=0; % Determine BER bits = bits+size(data_in,2)-skip; try errors = sum( data_in(:,skip+1:end,:) ~= data_ref(:,skip+1:end,:),2 ); catch %warning('BER calculation not optimal: Arrays have incompatible sizes for this operation.') errors = NaN; end try errors = sum( data_in(:,skip+1:end,:) ~= data_ref(:,skip+1:end-1,:),2 ); end try errors = sum( data_in(:,skip+1:end,:) ~= data_ref(:,skip+1:end-2,:),2 ); end BER = sum(errors)/sum(bits); end