Solid-state qubits are typically characterized and operated by a series of very short pulses. To achieve a high-fidelity control, it is necessary to generate many sequences of them, with very accurate timing.
In this blog post, I will show how to use the advanced feature set of the HDAWG Arbitrary Waveform Generator and the SHFSG Signal Generator to generate efficiently both simple and complex sequences. Their parameters can be adjusted dynamically, to have an efficient workflow, but also to realize closed-loop feedback experiments.
Amplitude Sweep Rabi Experiment
Let’s start by the one of the simplest characterization experiments: the measurement of Rabi oscillations. This experiment is often used to kickstart measurement of qubits, since it can demonstrate that the device under test is indeed a two-level system (i.e., a qubit) and that it can be controlled coherently. Moreover, it can be used to determine the basic parameters to control the qubit, like resonance frequency, pulse duration and amplitude to perform a π rotation [1].
A very common variant in the class of Rabi experiments is the so-called Amplitude Rabi. The control pulse shape, length and frequency are kept constant, while the amplitude is varied, so the pulse energy. The expected outcome is an oscillation of the average population of the two levels involved in the transition. Such frequency of oscillation is the Rabi frequency. By keeping the pulse length constant, we also keep the bandwidth of the pulse the same, so we minimize the risk of exciting unwanted transitions. This is especially relevant for systems like artificial atoms that have a multitude of states, and we want to work only with two of them and realize a qubit.
How could we generate such pulses with the HDAWG or the SHFSG in an optimal way? The solution is in the command table (CT). The command table allows you to group waveform playback instructions with other timing-critical phase and amplitude setting commands in a single instruction. As the name implies, it’s a table that can be filled with many parameters, relative to the control of waveform playback.
Let’s construct now our amplitude Rabi. First, we need to declare the waveform that represent the envelope of our pulse in the sequence:
//Waveform definition
wave pulse = gauss(PULSE_TOTAL_LEN, PULSE_TOTAL_LEN/2, PULSE_WIDTH_SAMPLE);
and then we can assign an explicit index to this waveform, so we can use it in the command table:
//Assign index and outputs
assignWaveIndex(1,pulse, INDEX);
Here we declared only the envelope, other static parameters like the frequency modulation are set externally in Python.
Averaging is very important in a Rabi sequence, since we are interested in the average state population. We have two options how to average: sequential or cyclic. In the first case, we acquire all the results for an amplitude before moving to the next one. In the second, we sweep all the amplitudes one after the other, and then we repeat such sequence many times.
For the sequential case, it would look like this: