125 lines
3.9 KiB
Matlab
125 lines
3.9 KiB
Matlab
|
|
%function [rOpt,state] = lin_step(state,aOpt,aStepSize)
|
|
|
|
function [rOpt_x,rOpt_y,z_prop,lin_z_test,...
|
|
corr_length,n_plates_done,missing_dz,n_step,test_plates,...
|
|
test_plate_numbers,brf,common_beta_x,common_beta_y,alpha_lin_x,alpha_lin_y]...
|
|
= lin_step(...
|
|
opt_x,opt_y,z_prop,lin_z_test,aStepSize,corr_length,...
|
|
n_plates_done,missing_dz,n_step,test_plates,test_plate_numbers,...
|
|
brf,common_beta_x,common_beta_y,alpha_lin_x,alpha_lin_y)
|
|
|
|
%%%%%% 1) Update and Check Distances etc. %%%%%%
|
|
|
|
% update propgated distance z_prop
|
|
z_prop = z_prop + aStepSize;
|
|
|
|
% calculate the number of plates needed for the so far propagated fiber length
|
|
n_plates = ceil(z_prop/corr_length);
|
|
|
|
% subtract the number of plates which were already processed
|
|
n_plates_left = n_plates - n_plates_done;
|
|
|
|
% compute last plate size ( if it fits, it should be 0)
|
|
if missing_dz > aStepSize
|
|
|
|
last_plate = aStepSize;
|
|
missing_dz = missing_dz-aStepSize;
|
|
plate_sizes = last_plate;
|
|
plate_numbers = n_plates;
|
|
|
|
else
|
|
|
|
last_plate = aStepSize - missing_dz - (n_plates_left-1)*corr_length;
|
|
|
|
if missing_dz == 0
|
|
missing_dz = [];
|
|
end
|
|
|
|
%build vector of plate lengths with missing plate part from prev.
|
|
%iterartion , then some normal plates and finally a fraction of a plate
|
|
%to fit into the step length
|
|
plate_sizes = [missing_dz corr_length*ones(1,n_plates_left-1) last_plate];
|
|
|
|
if n_plates_done == 0
|
|
plate_numbers =[(n_plates_done+1):(n_plates-1) n_plates];
|
|
else
|
|
plate_numbers = [n_plates_done (n_plates_done+1):(n_plates-1) n_plates]; % not wrking yet
|
|
end
|
|
|
|
%remember for next step
|
|
missing_dz = corr_length - last_plate;
|
|
|
|
end
|
|
|
|
plate_steps = repmat(n_step,1,length(plate_sizes));
|
|
|
|
%
|
|
%figure;stem(plate_sizes);
|
|
test_plates = [test_plates,plate_sizes];
|
|
|
|
test_plate_numbers = [test_plate_numbers, plate_numbers];
|
|
|
|
%%%%%% 2) Apply Waveplate Model %%%%%%
|
|
|
|
% transfer optical envelope to frequency domain for effective convolution with transfer function h
|
|
opt_x=fft(opt_x);
|
|
opt_y=fft(opt_y);
|
|
|
|
% db1 = gpuArray(brf.db1);
|
|
% db0 = gpuArray(brf.db0);
|
|
% common_beta_x = gpuArray(common_beta_x);
|
|
% common_beta_y = gpuArray(common_beta_y);
|
|
|
|
db1 = (brf.db1);
|
|
db0 = (brf.db0);
|
|
common_beta_x = (common_beta_x);
|
|
common_beta_y = (common_beta_y);
|
|
|
|
% process every waveplate with given sizes in plate_sizes
|
|
for n=1:length(plate_sizes)
|
|
dz = plate_sizes(n);
|
|
|
|
% figure(87);subplot(2,1,1);plot(real(x(900:1150)));subplot(2,1,2);plot(real(y(900:1150)));
|
|
% MOV1=[MOV1 getframe(87)];
|
|
|
|
% extract rotation matrix from pre calculated matrices
|
|
matR = brf.matR{plate_numbers(n)};
|
|
|
|
% transform to eigenvalue of of fiber segment
|
|
tOpt.X = conj(matR(1,1))*opt_x + conj(matR(2,1))*opt_y;
|
|
tOpt.Y = conj(matR(1,2))*opt_x + conj(matR(2,2))*opt_y;
|
|
|
|
% calculate statistical delta beta for pmd
|
|
delta_beta = 0.5*(db1+db0(n))/corr_length;
|
|
% build transfer function with delta beta
|
|
%common.beta = beta1+beta2*omega^2
|
|
|
|
%accumulate delta beta for log...
|
|
brf.simdgd = brf.simdgd + (db1(length(db1)/2+1)+db0(n))/corr_length;
|
|
|
|
h.X = exp(-1j*(common_beta_x-delta_beta)*dz);
|
|
h.Y = exp(-1j*(common_beta_y+delta_beta)*dz);
|
|
% delta_beta has to be added to the transfer function
|
|
|
|
% process with transfer function
|
|
tOpt.X = h.X.*tOpt.X ;
|
|
tOpt.Y = h.Y.*tOpt.Y ;
|
|
|
|
% rotate back
|
|
opt_x = matR(1,1)*tOpt.X + matR(1,2)*tOpt.Y;
|
|
opt_y = matR(2,1)*tOpt.X + matR(2,2)*tOpt.Y;
|
|
|
|
end
|
|
|
|
lin_z_test = lin_z_test + sum(plate_sizes,2);
|
|
|
|
%update the number of processed plates so far
|
|
n_plates_done = n_plates_done + n_plates_left;
|
|
|
|
% attanuate the signal each linear state with alpha
|
|
% ( 0.2dB = 4.6052e-05 )
|
|
rOpt_x=ifft(exp(-alpha_lin_x*aStepSize/2).*opt_x); % /2 not sure why (have to find it in formulas)
|
|
rOpt_y=ifft(exp(-alpha_lin_y*aStepSize/2).*opt_y); % but not relevant for now
|
|
|
|
end |