

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Hello Pulse
<a name="braket-hello-pulse"></a>

在本节中，您将了解如何使用 Rigetti 设备上的 Pulse 直接表征和构造单个量子比特门。对量子比特施加电磁场会导致 Rabi 振荡，在量子比特的 0 状态和 1 状态之间切换。通过校准脉冲的长度和相位，Rabi 振荡可以计算出单个量子比特门。在这里，我们将确定测量脉冲的最佳脉冲长度， pi/2 脉冲是用于构建更复杂的脉冲序列的基本模块。

首先，要构建脉冲序列，请导入 `PulseSequence` 类。

```
from braket.aws import AwsDevice
from braket.circuits import FreeParameter
from braket.devices import Devices
from braket.pulse import PulseSequence, GaussianWaveform

import numpy as np
```

接下来，使用 QPU 的 Amazon Resource Name（ARN）实例化一台新的 Braket 设备。以下命令块使用 Rigetti Ankaa-3：

```
device = AwsDevice(Devices.Rigetti.Ankaa3)
```

以下脉冲序列包括两个部分：播放波形和测量量子比特。脉冲序列通常可以应用于帧。有一些例外，如屏障和延迟，可以应用于量子比特。在构造脉冲序列之前，必须检索可用的帧。驱动框架用于施加脉冲以实现 Rabi 振荡，读出帧用于测量量子比特状态。此示例使用量子比特 25 的帧。

```
drive_frame = device.frames["Transmon_25_charge_tx"]
readout_frame = device.frames["Transmon_25_readout_rx"]
```

现在，创建要在驱动器帧中播放的波形。这样做的目的是描述量子比特在不同脉冲长度下的行为。每次您将播放一个长度不同的波形。与其每次都实例化一个新的波形，不如使用 in pulse 序列 Braket-supported `FreeParameter`。您可以使用自由参数创建一次波形和脉冲序列，然后使用不同的输入值运行相同的脉冲序列。

```
waveform = GaussianWaveform(FreeParameter("length"), FreeParameter("length") * 0.25, 0.2, False)
```

最后，将它们组合成脉冲序列。在脉冲序列中，`play` 播放驱动器帧上的指定波形，`capture_v0` 测量读出帧的状态。

```
pulse_sequence = (
    PulseSequence()
    .play(drive_frame, waveform)
    .capture_v0(readout_frame)
)
```

扫描一定范围的脉冲长度，然后将其提交给 QPU。在 QPU 上执行脉冲序列之前，请绑定自由参数的值。

```
start_length = 12e-9
end_length = 2e-7
lengths = np.arange(start_length, end_length, 12e-9)
N_shots = 100

tasks = [
    device.run(pulse_sequence(length=length), shots=N_shots)
    for length in lengths
]

probability_of_zero = [
    task.result().measurement_counts['0']/N_shots
    for task in tasks
]
```

量子比特测量的统计数据显示了在 0 状态和 1 状态之间振荡的量子比特的振荡动力学。从测量数据中，您可以提取 Rabi 频率并微调脉冲长度以实现特定的 1 量子比特门。例如，根据下图中的数据，周期约为 154 纳米。因此， pi/2 旋转门将对应于长度为38.5ns的脉冲序列。

![以秒为单位显示脉冲持续时间的折线图。图中有两个峰值和一个低谷。](http://docs.aws.amazon.com/zh_cn/braket/latest/developerguide/images/Rabi-frequency.png)


## 你好 Pulse 使用 OpenPulse
<a name="braket-hello-pulse-openpulse"></a>

 [OpenPulse](https://openqasm.com/language/openpulse.html)是一种用于指定通用量子器件脉冲电平控制的语言，也是 OpenQasm 3.0 规范的一部分。Amazon Braket 支持 OpenPulse 使用 OpenQASM 3.0 表示形式直接对脉冲进行编程。

 Braket 使用 OpenPulse 在原生指令中表达脉冲的底层中间表示形式。OpenPulse 支持以 `defcal`（“定义校准”的缩写）声明形式添加指令校准。通过这些声明，您可以在较低级别的控制语法中指定门指令的实现。

您可以使用以下命令查看 Brake `PulseSequence` t 的 OpenPulse 程序。

```
print(pulse_sequence.to_ir())
```

您也可以直接构造 OpenPulse 程序。

```
from braket.ir.openqasm import Program
 
openpulse_script = """
OPENQASM 3.0;
cal {
    bit[1] psb;
    waveform my_waveform = gaussian(12.0ns, 3.0ns, 0.2, false);
    play(Transmon_25_charge_tx, my_waveform);
    psb[0] = capture_v0(Transmon_25_readout_rx);
}
"""
```

使用脚本创建 `Program` 对象。然后，将该程序提交给 QPU。

```
from braket.aws import AwsDevice
from braket.devices import Devices
from braket.ir.openqasm import Program

program = Program(source=openpulse_script)

device = AwsDevice(Devices.Rigetti.Ankaa3)
task = device.run(program, shots=100)
```