Skip to content

Instantly share code, notes, and snippets.

@tobin
Created August 23, 2012 21:46
Show Gist options
  • Select an option

  • Save tobin/3442303 to your computer and use it in GitHub Desktop.

Select an option

Save tobin/3442303 to your computer and use it in GitHub Desktop.
Phase lock Optickle simulation
% Configuration:
%
% [laser1] ---> [mod1] ----> [ ] <--- [mod2] <--- [laser2]
% [ BS ]
% [PD1] <------------------- [ ] ---------------> [PD2]
%
% PD1 and PD2 form a balanced homodyne detector for laser1 and laser2. If
% you want to consider a "DC readout" type configuration (or a squeezer
% coherent control configuration) where you just have one PD, you can just
% ignore PD2.
%
%
% Tobin Fricke
% 2012-08-23
% Initial carrier power (before modulation) in the two sources. In the
% squeezer case, P2 will be zero, but just set it to some arbitrary value
% here so the modulators will have something to modulate. There are ways
% around this if you want.
P1 = 1; % Watts
P2 = 1;
% Modulation frequencies and depths for the two laser sources.
fmod1 = 10e6; % Hz
fmod2 = 11e6;
gamma1 = 0.34; % radians
gamma2 = gamma1;
% Create vector of RF frequencies to consider. This needs to have all the
% modulation frequencies, plus any beat frequencies we want to consider.
vFrf = [0, fmod1, fmod2, (fmod2-fmod1)];
vFrf = unique([-vFrf, vFrf]);
opt = Optickle(vFrf);
% Put the power into the laser carrier. Both sources have the same carrier
% frequency.
opt = addSource(opt, 'laser1', sqrt(P1) * (vFrf==0));
opt = addSource(opt, 'laser2', sqrt(P2) * (vFrf==0));
% Add a phase modulator for one of the sources.
opt = addModulator(opt, 'PM', 1i);
% Change the phase of the sidebands relative to the carrier by changing the
% phase of the modulation depth. Phase modulation is made with a purely
% imaginary modulation depth, while a real modulation depth produces AM.
opt = addRFModulator(opt, 'Mod1', fmod1, 1i*gamma1);
opt = addRFModulator(opt, 'Mod2', fmod2, gamma2);
% I set angle of incidence to 0 on the beamsplitter so that there won't be
% any sqrt(2) to deal with.
opt = addMirror(opt, 'BS', 0, 0, 0.5, 0, 0);
opt = addSink(opt, 'PD1');
opt = addSink(opt, 'PD2');
% Link everything together
opt = addLink(opt, 'laser1', 'out', 'PM', 'in', 0);
opt = addLink(opt, 'PM', 'out', 'Mod1', 'in', 0);
opt = addLink(opt, 'laser2', 'out', 'Mod2', 'in', 0);
opt = addLink(opt, 'Mod1', 'out', 'BS', 'fr', 0);
opt = addLink(opt, 'Mod2', 'out', 'BS', 'bk', 0);
opt = addLink(opt, 'BS', 'fr', 'PD1', 'in', 0);
opt = addLink(opt, 'BS', 'bk', 'PD2', 'in', 0);
% Add the DC and RF photodiodes
opt = addProbeIn(opt, 'PD1_DC', 'PD1', 'in', 0, 0);
opt = addProbeIn(opt, 'PD2_DC', 'PD2', 'in', 0, 0);
opt = addProbeIn(opt, 'PD1_I', 'PD1', 'in', abs(fmod1-fmod2), 0);
opt = addProbeIn(opt, 'PD1_Q', 'PD1', 'in', abs(fmod1-fmod2), 90);
opt = addProbeIn(opt, 'PD2_I', 'PD2', 'in', abs(fmod1-fmod2), 0);
opt = addProbeIn(opt, 'PD2_Q', 'PD2', 'in', abs(fmod1-fmod2), 90);
%% Run the simulation (sweep)
Npos = 100;
dBS = getDriveNum(opt, 'BS');
dPM = getDriveNum(opt, 'PM');
pPD1_DC = getProbeNum(opt, 'PD1_DC');
pPD2_DC = getProbeNum(opt, 'PD2_DC');
pPD1_I = getProbeNum(opt, 'PD1_I');
pPD1_Q = getProbeNum(opt, 'PD1_Q');
pPD2_I = getProbeNum(opt, 'PD2_I');
pPD2_Q = getProbeNum(opt, 'PD2_Q');
d = dBS;
start_pos = zeros(opt.Ndrive, 1);
start_pos(d) = opt.lambda/2;
end_pos = -start_pos;
[pos, sigDC, fDC] = sweepLinear(opt, start_pos, end_pos, Npos);
plot(pos(d,:) / opt.lambda, sigDC(pPD1_DC,:), ...
pos(d,:) / opt.lambda, sigDC(pPD1_I, :), ...
pos(d,:) / opt.lambda, sigDC(pPD1_Q, :));
xlabel('differential phase (wavelengths)');
ylabel('signal');
legend('DC','I','Q');
grid on
pkpk = max(sigDC(pPD1_I, :)) - min(sigDC(pPD1_I, :));
fprintf('Expected optical gain is %g W/radian\n', pkpk/2);
%% Run the simulation (tickle)
pos = zeros(opt.Ndrive, 1);
f = linspace(0, 100, 10);
[fDC, sigDC, sigAC, mMech, noiseAC, noiseMech] = tickle(opt, pos, f);
dPM = getDriveNum(opt, 'PM');
pPD1_I = getProbeNum(opt, 'PD1_I');
h = getTF(sigAC, pPD1_I, dPM);
fprintf('Optical gain is %g W/radian\n', h(1));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment