4. 量子比特读出数据采集
量子比特读出判决的第一步不是分类算法,而是把物理信号可靠地变成可计算的数据。读出链路的末端通常由室温电子学完成解调与数字化:IQ 混频器把谐振腔反射/透射信号下变频到中频,再由 ADC 采样为离散时间序列。采集系统要同时记录两路正交分量 I(t) 与 Q(t),并保留触发时序、采样率、积分窗口等元数据,否则后续判决无法复现。本节围绕“接口—参数—格式—预处理”四个环节,说明如何把一次读出实验组织成可复用的数据流水线。
实验平台接口与触发同步
典型超导量子比特读出平台包含任意波形发生器(AWG)、微波源、IQ 混频器、低噪声放大器、带通滤波器和高速数字化仪。AWG 负责产生读出脉冲包络,数字化仪负责采集返回信号。两者必须共享同一时基:常用做法是由时钟分配模块输出 10 MHz 参考,并让 AWG 在脉冲序列起始处发出数字标记(marker),该标记经同轴电缆送入数字化仪的外部触发端口。触发沿到来后,数字化仪按预设的采样点数开始采集,从而保证每个 shot 的 I/Q 波形与读出脉冲严格对齐。
接口层面还需注意三点:一是触发延迟(trigger delay)要补偿电缆长度差,通常以采样周期为单位设置;二是数字化仪的输入量程要与放大链增益匹配,避免削顶;三是若使用多通道采集(如同时读多个量子比特),各通道的采样时钟必须同源,否则通道间相位漂移会破坏 IQ 平面上的聚类结构。一个可用的接口配置示例如下:
# 采集接口配置示例(教学假设参数)
sample_rate = 1.0 GS/s # 数字化仪采样率
trigger_source = EXT # 外部触发,来自 AWG marker
trigger_delay = 120 ns # 补偿电缆与电子学延迟
record_length = 2000 samples # 每 shot 采集点数
readout_duration = 800 ns # 读出脉冲长度
integration_window = [200, 900] ns # 积分窗口,避开上升沿
shots_per_point = 5000 # 每个参数点重复次数
采样参数与积分窗口
采样率决定时间分辨率,但并非越高越好。若读出脉冲带宽约 100 MHz,按奈奎斯特准则采样率至少 200 MS/s;工程上常取 1 GS/s 以获得足够过采样,便于后续数字滤波。每 shot 的记录长度应覆盖“读出脉冲 + 谐振腔响应拖尾 + 余量”,例如读出 800 ns、腔衰荡约 200 ns,则记录 2000 个采样点(1 GS/s 下为 2 μs)较为稳妥。
积分窗口的选择直接影响信噪比。窗口起点应避开脉冲上升沿和开关瞬态,终点应覆盖腔响应主要能量但不过度引入噪声。常用做法是对窗口内 I(t)、Q(t) 分别做加权平均,权重可取匹配滤波系数,也可简化为矩形窗。若窗口取 [200, 900] ns,则积分得到一对标量 (Ī, Q̄),这就是 IQ 平面上的一个点。每个参数点重复 5000 次,便得到 5000 个点,构成后续分类的样本集。
数据格式与元数据组织
原始数据建议采用“二进制波形 + JSON 元数据”分离存储。二进制文件按 shot 顺序连续存放 I/Q 交错样本,例如每个 shot 存 2000 点 × 2 分量,数据类型为 int16 或 float32。元数据记录采样率、触发延迟、积分窗口、读出频率、功率、量子比特编号、实验时间戳和软件版本。这样既保证读写效率,又保证可追溯。一个简化的目录结构如下:
data/
run_20240612_001/
raw_iq.bin # int16, 交错 I/Q, 每 shot 4000 个 int16
meta.json # 采样率、窗口、频率、功率、shots 等
labels.npy # 若为训练集,存放制备态标签 0/1
读取时按 np.fromfile(path, dtype=np.int16).reshape(shots, 2000, 2) 还原为三维数组,再分离 I、Q。若采集系统直接输出解调后的 IQ 点而非原始波形,则数据格式变为每 shot 一对浮点数,元数据中应注明“已积分”,避免重复处理。
预处理流水线
预处理的目标是把原始波形变成干净、可分类的 IQ 点。典型流水线包含五步:去直流偏置、数字滤波、相位旋转、积分降采样、异常 shot 剔除。去偏置用于消除 ADC 零点漂移;数字滤波常用 FIR 低通或匹配滤波,抑制带外噪声;相位旋转用于补偿电缆和混频器引入的固定相位,使两类态的聚类轴对齐;积分降采样把 2000 点压缩为 1 个 IQ 点;异常剔除则丢弃因宇宙射线、磁通跳跃或触发丢失导致的离群 shot。
下面给出一个可执行的最小预处理示例,输入为 raw 形状 (shots, 2000, 2),输出为 iq 形状 (shots, 2):
import numpy as np
def preprocess(raw, window=(200, 900), phase=0.0):
iq_wave = raw.astype(np.float32)
iq_wave -= iq_wave.mean(axis=1, keepdims=True) # 去直流
# 简单滑动平均作为低通(教学示例)
kernel = np.ones(8, dtype=np.float32) / 8
iq_wave = np.apply_along_axis(
lambda x: np.convolve(x, kernel, mode='same'), 1, iq_wave)
# 相位旋转
c, s = np.cos(phase), np.sin(phase)
rot = np.array([[c, -s], [s, c]], dtype=np.float32)
iq_wave = iq_wave @ rot.T
# 窗口积分
seg = iq_wave[:, window[0]:window[1], :]
iq = seg.mean(axis=1)
# 异常剔除:距离中位数超过 5 倍 MAD 的 shot
med = np.median(iq, axis=0)
mad = np.median(np.abs(iq - med), axis=0) + 1e-9
keep = np.all(np.abs(iq - med) < 5 * mad, axis=1)
return iq[keep], keep
运行后可用 iq.shape 检查保留 shot 数,并绘制 IQ 散点图观察两类态是否分离。若分离度不足,应回到积分窗口和相位参数重新调整,而不是直接送入分类器。判断预处理是否合格,可看三个指标:两类态聚类中心的欧氏距离、各自簇内标准差、以及误分类率的下界估计。只有预处理把数据整理成“两团可分”的结构,后续判决算法才有意义。
把上述接口、参数、格式和预处理串起来,一次完整的读出采集流程就是:AWG 发出读出脉冲并输出 marker,数字化仪在触发延迟后以 1 GS/s 采集 2000 点 I/Q 波形,数据以二进制加 JSON 元数据落盘,预处理按去偏置、滤波、旋转、积分、剔除的顺序生成 IQ 点集,最后用聚类分离度判断数据是否可用于判决。只要其中任一环节的参数或格式不一致,后续分类结果就不可复现,因此采集阶段必须把元数据与原始数据一起保存。