Created
August 23, 2012 21:46
-
-
Save tobin/3442303 to your computer and use it in GitHub Desktop.
Phase lock Optickle simulation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| % 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