%clear all O = 17; %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 = 92e9; % 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','M8199B','fdac',fdac,'kover',kover,'lpf_active',1,'f_cutoff',80e9,'lpf_type',filtertypes.gaussian); fil_tx = Filter('filtdegree',1,"f_cutoff",50e9,"fsamp",fdac,"filterType",filtertypes.bessel_inp); u_pi = 3.5; vbias = (0.5*u_pi)-u_pi; extmodlaser = EML("mode",emlmodes.im_cosinus,"power",5,"fsimu",fsimu,"lambda",1550,"bias",vbias,"u_pi",u_pi,"linewidth",0); amp = Amplifier("amp_mode","ideal_no_noise","amplification_db",0,"gain_mode","output_power"); fib = Fiber("fsimu",fdac*kover,"fiber_length",0,"alpha",0.2,"D",17,"lambda0",1550); %noise loading zeroDB_attenuator = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power","amplification_db",0); edfa_ = Amplifier("amp_mode","edfa_increase_nase","nase_mode","generate_ase","amplification_db",0,"noifig",33,"gain_mode","output_power"); rop_amplifier = Amplifier("amp_mode","ideal_no_noise","amplification_db",0,"gain_mode","output_power","nase_mode","pass_ase"); phdiode = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20); fil_diode = Filter('filtdegree',1,"f_cutoff",70e9,"fsamp",fdac,"filterType",filtertypes.bessel_inp); scp = Scope("fsimu",fdac*kover,"fadc",fadc,... "delay",0,"fixed_delay",0,"lpf_bw",113e9,"filtertype",filtertypes.butterworth,... "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 bits = Informationsignal(bitpattern); mod_out = pam_mapper.map(bits); reference = mod_out; mod_out.signal = applyPulseShaping(mod_out.signal,fsym,fdac); % ELECTRICAL DOMAIN X = awg.process(mod_out); % X = fil_tx.process(X); %X = fil_tx.process(X); X = X.normalize; % OPTICAL DOMAIN X = extmodlaser.process(X); X = amp.process(X); X = fib.process(X); % X = zeroDB_attenuator.process(X); % X = edfa_.process(X); % X = rop_amplifier.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 = X.normalize; X = eq.process(X,reference); rx_series = X.signal; X = pam_mapper.demap(X); % BER [bits,errors,BER] = calc_ber(X.signal(:,10000:end-20),bitpattern(10000:end-20,:)',0); disp(['BER: ', sprintf('%2E',BER)]); figure() hold on plot(reference.signal); plot(rx_series); hold off 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