QUBIT-Driver 1.2.2__tar.gz → 1.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/PKG-INFO +5 -1
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver/CY_6Z.py +1 -1
- qubit_driver-1.2.4/QUBIT_Driver/CY_Waveform.py +366 -0
- qubit_driver-1.2.4/QUBIT_Driver/__init__.py +1 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver.egg-info/PKG-INFO +5 -1
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver.egg-info/SOURCES.txt +1 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/README.md +4 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/setup.py +1 -1
- qubit_driver-1.2.2/QUBIT_Driver/__init__.py +0 -1
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/LICENSE +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver/CY_10ReadJili.py +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver/CY_6XY.py +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver/CY_8Couple.py +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver/CY_AD.py +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver/CY_SYNC.py +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver.egg-info/dependency_links.txt +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver.egg-info/entry_points.txt +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/QUBIT_Driver.egg-info/top_level.txt +0 -0
- {qubit_driver-1.2.2 → qubit_driver-1.2.4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: QUBIT_Driver
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.4
|
|
4
4
|
Summary: Drive adapted for the quantum control system of the CeYear 1U Qubit_Driver Institute
|
|
5
5
|
Home-page:
|
|
6
6
|
Author: He Guo Yang
|
|
@@ -41,6 +41,10 @@ $ pip install QUBIT_Driver
|
|
|
41
41
|
|
|
42
42
|
### License
|
|
43
43
|
## Update log
|
|
44
|
+
### 1.2.4
|
|
45
|
+
- 添加思仪波形文件CY_Waveform.py
|
|
46
|
+
### 1.2.3
|
|
47
|
+
- 修改中频任意波形发生器初始化设置奈奎斯特为1区间
|
|
44
48
|
### 1.2.2
|
|
45
49
|
- 修改设备名称与驱动文件名称
|
|
46
50
|
### 1.2.1
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import matplotlib.pyplot as plt
|
|
3
|
+
import math
|
|
4
|
+
|
|
5
|
+
# 全局字体配置:解决中文、特殊箭头符号乱码
|
|
6
|
+
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'PingFang SC']
|
|
7
|
+
plt.rcParams['axes.unicode_minus'] = False
|
|
8
|
+
|
|
9
|
+
#====================== 单音信号=====================================
|
|
10
|
+
###############sin##################
|
|
11
|
+
def Gen_Sin(SampleRate,Freq,Time,delay=0):###samplerate Mhz,Freq Mhz,time us
|
|
12
|
+
phase = 2*np.pi*delay*Freq
|
|
13
|
+
nums = round(Time*SampleRate)
|
|
14
|
+
cycle = round(Time*Freq)
|
|
15
|
+
t = np.linspace(0,cycle,nums,endpoint=False)
|
|
16
|
+
y = np.sin(2*np.pi*t-phase)
|
|
17
|
+
return y,nums
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def Sin_C(SampleRate,Freq,delay = 0):########用于产生完整周期的函数##############
|
|
22
|
+
phase = 2*np.pi*delay*Freq
|
|
23
|
+
nums = int(np.lcm(round(SampleRate),round(Freq))/Freq)
|
|
24
|
+
cycle = int(np.lcm(round(SampleRate),round(Freq))/SampleRate)
|
|
25
|
+
t = np.linspace(0,cycle,nums,endpoint=False)
|
|
26
|
+
y = np.sin(2*np.pi*t-phase)
|
|
27
|
+
return y,nums
|
|
28
|
+
|
|
29
|
+
def Gen_Sin_C(SampleRate,Freq,delay = 0):
|
|
30
|
+
a,nums = Sin_C(SampleRate,Freq,delay)
|
|
31
|
+
times = int(np.lcm(nums,512)/nums)
|
|
32
|
+
return np.tile(a,times),nums*times
|
|
33
|
+
|
|
34
|
+
###############cos###################
|
|
35
|
+
def Gen_Cos(SampleRate,Freq,Time,delay = 0):
|
|
36
|
+
phase = 2*np.pi*delay*Freq
|
|
37
|
+
nums = round(Time*SampleRate)
|
|
38
|
+
cycle = round(Time*Freq)
|
|
39
|
+
t = np.linspace(0,cycle,nums,endpoint=False)
|
|
40
|
+
y = np.cos(2*np.pi*t-phase)
|
|
41
|
+
return y,nums
|
|
42
|
+
def Cos_C(SampleRate,Freq,delay):
|
|
43
|
+
phase = 2*np.pi*delay*Freq
|
|
44
|
+
nums = int(np.lcm(round(SampleRate),round(Freq))/Freq)
|
|
45
|
+
cycle = int(np.lcm(round(SampleRate),round(Freq))/SampleRate)
|
|
46
|
+
t = np.linspace(0,cycle,nums,endpoint=False)
|
|
47
|
+
y = np.cos(2*np.pi*t-phase)
|
|
48
|
+
return y,nums
|
|
49
|
+
|
|
50
|
+
def Gen_Cos_C(SampleRate,Freq,delay = 0):
|
|
51
|
+
a,nums = Cos_C(SampleRate,Freq,delay)
|
|
52
|
+
times = int(np.lcm(nums,512)/nums)
|
|
53
|
+
return np.tile(a,times),nums*times
|
|
54
|
+
|
|
55
|
+
##############pulse########################
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def Gen_Pulse_C(SampleRate,time_all,time_up):
|
|
59
|
+
a,nums = Gen_Pulse(SampleRate,time_all,time_up,time_all)
|
|
60
|
+
times = int(np.lcm(nums,512)/nums)
|
|
61
|
+
return np.tile(a,times),nums*times
|
|
62
|
+
def Gen_Pulse(SampleRate,time_all,time_up,Time): #timeall一个脉冲总时间,timeup上升沿时间,time脉冲时间
|
|
63
|
+
nums = round(SampleRate*Time)
|
|
64
|
+
cycle = round(SampleRate*time_all)
|
|
65
|
+
up = round(SampleRate*time_up)
|
|
66
|
+
arr = np.zeros(nums)
|
|
67
|
+
full_cycles = nums//cycle
|
|
68
|
+
for i in range(full_cycles):
|
|
69
|
+
end_idx = (i+1)*cycle
|
|
70
|
+
arr[end_idx-int(0.5*(cycle+up)):end_idx-int(0.5*(cycle-up))] = 1
|
|
71
|
+
remain = nums%cycle
|
|
72
|
+
if(remain-int(0.5*(cycle-up))>0):
|
|
73
|
+
end = remain if remain<cycle-int(0.5*(cycle-up)) else cycle-int(0.5*(cycle-up))
|
|
74
|
+
arr[end_idx + int(0.5*(cycle-up)):end_idx+end] = 1
|
|
75
|
+
return arr,nums
|
|
76
|
+
|
|
77
|
+
def generate_single_pulse(
|
|
78
|
+
sample_rate: float = 10e9, # AWG采样率(固定10GSa/s)
|
|
79
|
+
pulse_amplitude: float = 1.0, # 脉冲幅值(单位:V,需≤AWG最大输出)
|
|
80
|
+
pulse_width: float = 100e-9, # 脉冲平顶宽度(单位:s,示例100ns)
|
|
81
|
+
rise_time: float = 50e-12, # 上升沿时长(单位:s,示例50ps,需≥40ps)
|
|
82
|
+
fall_time: float = 50e-12, # 下降沿时长(单位:s,示例50ps,需≥40ps)
|
|
83
|
+
pre_pulse_silence: float = 200e-9, # 脉冲前静默区(单位:s,避免AWG读取不完整)
|
|
84
|
+
post_pulse_silence: float = 200e-9, # 脉冲后静默区(单位:s)
|
|
85
|
+
output_dtype=np.float32 # 输出数据类型(适配AWG导入)
|
|
86
|
+
) -> tuple[np.ndarray, float]:
|
|
87
|
+
"""
|
|
88
|
+
生成适配射频AWG的单脉冲波形数据
|
|
89
|
+
:param sample_rate: AWG采样率(固定10GSa/s,不可修改)
|
|
90
|
+
:param pulse_amplitude: 脉冲高电平幅值(建议0.1~1.0V,避免AWG过载)
|
|
91
|
+
:param pulse_width: 脉冲平顶时间(从上升沿90%到下降沿10%的时长)
|
|
92
|
+
:param rise_time: 上升沿(10%→90%幅值)时长(需≥AWG最小上升沿40ps)
|
|
93
|
+
:param fall_time: 下降沿(90%→10%幅值)时长(需≥AWG最小下降沿40ps)
|
|
94
|
+
:param pre_pulse_silence: 脉冲前低电平静默时间(建议≥200ns,稳定基线)
|
|
95
|
+
:param post_pulse_silence: 脉冲后低电平静默时间(建议≥200ns,避免尾部振荡)
|
|
96
|
+
:return: (pulse_data: 脉冲波形数据数组, time_axis: 对应的时间轴数组)
|
|
97
|
+
"""
|
|
98
|
+
# 校验参数合法性(匹配AWG硬件限制)
|
|
99
|
+
# if sample_rate != 10e9:
|
|
100
|
+
# raise ValueError("当前AWG采样率固定为10GSa/s,不可修改")
|
|
101
|
+
# if rise_time < 40e-12 or fall_time < 40e-12:
|
|
102
|
+
# raise ValueError(f"边沿时长需≥40ps,当前上升沿{rise_time*1e12:.1f}ps,下降沿{fall_time*1e12:.1f}ps")
|
|
103
|
+
# if pulse_amplitude <= 0 or pulse_amplitude > 2.0:
|
|
104
|
+
# raise ValueError("脉冲幅值建议0.1~2.0V(需符合AWG最大输出限制)")
|
|
105
|
+
|
|
106
|
+
# 计算总采样点数
|
|
107
|
+
total_duration = pre_pulse_silence + rise_time + pulse_width + fall_time + post_pulse_silence
|
|
108
|
+
total_samples = int(np.ceil(total_duration * sample_rate))
|
|
109
|
+
time_axis = np.linspace(0, total_duration, total_samples, endpoint=False)
|
|
110
|
+
|
|
111
|
+
# 初始化波形数据(全低电平0V)
|
|
112
|
+
pulse_data = np.zeros(total_samples, dtype=output_dtype)
|
|
113
|
+
|
|
114
|
+
# 计算各阶段的采样点索引范围
|
|
115
|
+
sample_interval = 1 / sample_rate # 采样间隔(0.1ns)
|
|
116
|
+
pre_silence_samples = int(np.ceil(pre_pulse_silence / sample_interval))
|
|
117
|
+
rise_samples = int(np.ceil(rise_time / sample_interval))
|
|
118
|
+
pulse_samples = int(np.ceil(pulse_width / sample_interval))
|
|
119
|
+
fall_samples = int(np.ceil(fall_time / sample_interval))
|
|
120
|
+
|
|
121
|
+
# 1. 上升沿(10%→90%幅值,用线性斜坡模拟,贴合硬件实际响应)
|
|
122
|
+
rise_start_idx = pre_silence_samples
|
|
123
|
+
rise_end_idx = rise_start_idx + rise_samples
|
|
124
|
+
rise_t = np.linspace(0, 1, rise_samples) # 0→1归一化时间
|
|
125
|
+
# 10%→90%幅值映射:避免突变,模拟硬件缓升
|
|
126
|
+
pulse_data[rise_start_idx:rise_end_idx] = pulse_amplitude * (0.1 + 0.8 * rise_t)
|
|
127
|
+
|
|
128
|
+
# 2. 脉冲平顶(90%→90%幅值,稳定高电平)
|
|
129
|
+
pulse_start_idx = rise_end_idx
|
|
130
|
+
pulse_end_idx = pulse_start_idx + pulse_samples
|
|
131
|
+
pulse_data[pulse_start_idx:pulse_end_idx] = pulse_amplitude * 0.9
|
|
132
|
+
|
|
133
|
+
# 3. 下降沿(90%→10%幅值,线性斜坡模拟)
|
|
134
|
+
fall_start_idx = pulse_end_idx
|
|
135
|
+
fall_end_idx = fall_start_idx + fall_samples
|
|
136
|
+
fall_t = np.linspace(0, 1, fall_samples) # 0→1归一化时间
|
|
137
|
+
pulse_data[fall_start_idx:fall_end_idx] = pulse_amplitude * (0.9 - 0.8 * fall_t)
|
|
138
|
+
|
|
139
|
+
# 4. 前后静默区保持0V(已初始化,无需额外处理)
|
|
140
|
+
|
|
141
|
+
return pulse_data, time_axis
|
|
142
|
+
#####################双音信号########################
|
|
143
|
+
def GenWave_Dtmf(f1_sin, f2_sin,Time, SampleRate):
|
|
144
|
+
# nums = round(SampleRate*Time)
|
|
145
|
+
t = np.arange(0,Time,1/SampleRate)
|
|
146
|
+
y1_sin = np.sin(2*np.pi*f1_sin*t)
|
|
147
|
+
y2_sin = np.sin(2*np.pi*f2_sin*t)
|
|
148
|
+
return y1_sin+y2_sin,len(t)
|
|
149
|
+
|
|
150
|
+
def GenWave_Dtmf_C(f1_sin, f2_sin, SampleRate):
|
|
151
|
+
f1_sin = np.int64(f1_sin)
|
|
152
|
+
f2_sin = np.int64(f2_sin)
|
|
153
|
+
f = math.gcd(f1_sin, f2_sin)
|
|
154
|
+
a,nums = GenWave_Dtmf(f1_sin, f2_sin,1/f, SampleRate)
|
|
155
|
+
times = int(np.lcm(nums,512)/nums)
|
|
156
|
+
return np.tile(a,times),nums*times
|
|
157
|
+
|
|
158
|
+
def fir_allpass_delay(signal_in, fs, delay_ps, filter_order=101):
|
|
159
|
+
import numpy as np
|
|
160
|
+
from scipy import signal
|
|
161
|
+
from scipy.signal import firwin, lfilter
|
|
162
|
+
# 基于FIR分数延迟滤波器实现皮秒级全通延时
|
|
163
|
+
# :param signal_in: 输入波形(一维数组)
|
|
164
|
+
# :param fs: 采样率(Hz),需≥10GHz以支持皮秒级精度
|
|
165
|
+
# :param delay_ps: 目标延时(皮秒,ps)
|
|
166
|
+
# :param filter_order: FIR滤波器阶数(奇数,阶数越高精度越好,计算量越大)
|
|
167
|
+
# :return: 延时后的输出信号、FIR滤波器系数
|
|
168
|
+
|
|
169
|
+
# 1. 单位转换:皮秒 -> 秒 -> 采样点数(支持小数,即分数延迟)
|
|
170
|
+
delay_s = delay_ps * 1e-12
|
|
171
|
+
delay_samples = delay_s * fs # 核心:分数延迟值(如0.5个采样点=5ps@100GHz)
|
|
172
|
+
|
|
173
|
+
# 2. 设计分数延迟FIR全通滤波器(基于Sinc插值+窗函数)
|
|
174
|
+
# 滤波器半长度
|
|
175
|
+
half_len = filter_order // 2
|
|
176
|
+
# 生成滤波器系数的采样索引
|
|
177
|
+
n = np.arange(-half_len, half_len + 1)
|
|
178
|
+
# Sinc函数实现分数延迟:sinc(n - D),D为分数延迟值
|
|
179
|
+
sinc_coeffs = np.sinc(n - delay_samples)
|
|
180
|
+
# 加汉宁窗降低旁瓣,保证全通特性(幅频平坦)
|
|
181
|
+
window = np.hanning(filter_order)
|
|
182
|
+
fir_coeffs = sinc_coeffs * window
|
|
183
|
+
|
|
184
|
+
# 3. 归一化系数,保证幅值不变(全通核心要求)
|
|
185
|
+
fir_coeffs = fir_coeffs / np.sum(fir_coeffs)
|
|
186
|
+
|
|
187
|
+
# 4. 应用FIR滤波器实现延时(线性相位,无幅值失真)
|
|
188
|
+
signal_delayed = lfilter(fir_coeffs, 1.0, signal_in)
|
|
189
|
+
|
|
190
|
+
# 补偿滤波器引入的固定延时(滤波器半长度)
|
|
191
|
+
fixed_delay_samples = half_len
|
|
192
|
+
# 截断前导零(可选,根据实际需求)
|
|
193
|
+
signal_delayed = signal_delayed[fixed_delay_samples:]
|
|
194
|
+
|
|
195
|
+
return signal_delayed, fir_coeffs
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
# ======================基础调制波形库(9类通用波形,核磁/超导共用)======================
|
|
199
|
+
# 1.高斯包络调制脉冲
|
|
200
|
+
def gen_gauss_mod_pulse(amp=5, t0_ns=45, sigma_ns=12, total_ns=100, fc=8e9, fs=100e9):
|
|
201
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
202
|
+
t0, sigma = t0_ns*1e-9, sigma_ns*1e-9
|
|
203
|
+
env = amp * np.exp(-((t-t0)**2)/(2*sigma**2))
|
|
204
|
+
wave = env * np.cos(2*np.pi*fc*t)
|
|
205
|
+
return t*1e9, wave, env, t
|
|
206
|
+
|
|
207
|
+
# 2.矩形包络调制脉冲
|
|
208
|
+
def gen_rect_mod_pulse(amp=5, start_ns=25, pulse_w_ns=45, total_ns=100, fc=8e9, fs=100e9):
|
|
209
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
210
|
+
start_s = start_ns*1e-9
|
|
211
|
+
end_s = (start_ns + pulse_w_ns)*1e-9
|
|
212
|
+
rect_env = np.zeros_like(t)
|
|
213
|
+
mask = (t >= start_s) & (t <= end_s)
|
|
214
|
+
rect_env[mask] = amp
|
|
215
|
+
wave = rect_env * np.cos(2*np.pi*fc*t)
|
|
216
|
+
return t*1e9, wave, rect_env, t
|
|
217
|
+
|
|
218
|
+
# 3.DRAG校正脉冲(高斯基底)
|
|
219
|
+
def gen_drag_pulse(amp=5, t0_ns=45, sigma_ns=12, total_ns=100, fc=8e9, fs=100e9, lam=0.5):
|
|
220
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
221
|
+
t0, sigma = t0_ns*1e-9, sigma_ns*1e-9
|
|
222
|
+
g_env = amp * np.exp(-((t-t0)**2)/(2*sigma**2))
|
|
223
|
+
g_diff = -amp * (t-t0)/(sigma**2) * np.exp(-((t-t0)**2)/(2*sigma**2))
|
|
224
|
+
omega = 2 * np.pi * fc
|
|
225
|
+
drag_wave = g_env*np.cos(omega*t) - lam*g_diff*np.sin(omega*t)
|
|
226
|
+
return t*1e9, drag_wave, g_env, t
|
|
227
|
+
|
|
228
|
+
# 4.梯形包络调制脉冲
|
|
229
|
+
def gen_trap_mod_pulse(amp=5, start_ns=20, rise_ns=8, flat_ns=30, total_ns=100, fc=8e9, fs=100e9):
|
|
230
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
231
|
+
t_ns_arr = t * 1e9
|
|
232
|
+
env = np.zeros_like(t_ns_arr)
|
|
233
|
+
end_rise = start_ns + rise_ns
|
|
234
|
+
end_flat = end_rise + flat_ns
|
|
235
|
+
end_fall = end_flat + rise_ns
|
|
236
|
+
mask_rise = (t_ns_arr >= start_ns) & (t_ns_arr < end_rise)
|
|
237
|
+
env[mask_rise] = amp * (t_ns_arr[mask_rise]-start_ns)/rise_ns
|
|
238
|
+
mask_flat = (t_ns_arr >= end_rise) & (t_ns_arr < end_flat)
|
|
239
|
+
env[mask_flat] = amp
|
|
240
|
+
mask_fall = (t_ns_arr >= end_flat) & (t_ns_arr <= end_fall)
|
|
241
|
+
env[mask_fall] = amp*(end_fall - t_ns_arr[mask_fall])/rise_ns
|
|
242
|
+
wave = env * np.cos(2*np.pi*fc*t)
|
|
243
|
+
return t_ns_arr, wave, env, t
|
|
244
|
+
|
|
245
|
+
# 5.超高斯调制脉冲
|
|
246
|
+
def gen_super_gauss_pulse(amp=5, t0_ns=45, sigma_ns=12, n_order=4, total_ns=100, fc=8e9, fs=100e9):
|
|
247
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
248
|
+
t0, sigma = t0_ns*1e-9, sigma_ns*1e-9
|
|
249
|
+
env = amp * np.exp(-np.abs((t-t0)/sigma)**(2*n_order))
|
|
250
|
+
wave = env * np.cos(2*np.pi*fc*t)
|
|
251
|
+
return t*1e9, wave, env, t
|
|
252
|
+
|
|
253
|
+
# 6.高斯包络线性调频Chirp脉冲
|
|
254
|
+
def gen_chirp_gauss_pulse(amp=5, t0_ns=45, sigma_ns=12, f_start=7e9, f_end=9e9, total_ns=100, fs=100e9):
|
|
255
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
256
|
+
t0, sigma = t0_ns*1e-9, sigma_ns*1e-9
|
|
257
|
+
env = amp * np.exp(-((t-t0)**2)/(2*sigma**2))
|
|
258
|
+
k = (f_end-f_start)/(total_ns*1e-9)
|
|
259
|
+
phase = 2*np.pi*(f_start*t + 0.5*k*t**2)
|
|
260
|
+
wave = env*np.cos(phase)
|
|
261
|
+
return t*1e9, wave, env, t
|
|
262
|
+
|
|
263
|
+
# 7.升余弦包络调制脉冲
|
|
264
|
+
def gen_raised_cos_pulse(amp=5, start_ns=20, flat_ns=30, roll_ns=10, total_ns=100, fc=8e9, fs=100e9):
|
|
265
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
266
|
+
t_ns_arr = t*1e9
|
|
267
|
+
env = np.zeros_like(t_ns_arr)
|
|
268
|
+
r_end = start_ns + roll_ns
|
|
269
|
+
f_start = r_end + flat_ns
|
|
270
|
+
f_end = f_start + roll_ns
|
|
271
|
+
mask_r = (t_ns_arr >= start_ns) & (t_ns_arr < r_end)
|
|
272
|
+
tau_r = (t_ns_arr[mask_r]-start_ns)/roll_ns
|
|
273
|
+
env[mask_r] = amp*0.5*(1-np.cos(np.pi*tau_r))
|
|
274
|
+
mask_flat = (t_ns_arr >= r_end) & (t_ns_arr < f_start)
|
|
275
|
+
env[mask_flat] = amp
|
|
276
|
+
mask_f = (t_ns_arr >= f_start) & (t_ns_arr <= f_end)
|
|
277
|
+
tau_f = (f_end-t_ns_arr[mask_f])/roll_ns
|
|
278
|
+
env[mask_f] = amp*0.5*(1-np.cos(np.pi*tau_f))
|
|
279
|
+
wave = env*np.cos(2*np.pi*fc*t)
|
|
280
|
+
return t_ns_arr, wave, env, t
|
|
281
|
+
|
|
282
|
+
# 8.Sinc辛格包络调制脉冲
|
|
283
|
+
def gen_sinc_mod_pulse(amp=5, t0_ns=50, half_w_ns=20, total_ns=100, fc=8e9, fs=100e9):
|
|
284
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
285
|
+
t0_s, hw_s = t0_ns*1e-9, half_w_ns*1e-9
|
|
286
|
+
tau = (t-t0_s)/hw_s
|
|
287
|
+
env = amp*np.sinc(tau)
|
|
288
|
+
wave = env*np.cos(2*np.pi*fc*t)
|
|
289
|
+
return t*1e9, wave, env, t
|
|
290
|
+
|
|
291
|
+
# 9.CORPSE失谐校正脉冲
|
|
292
|
+
def gen_corpse_pulse(amp=5, t0_ns=50, sigma_ns=10, dt_ns=8, total_ns=150, fc=8e9, fs=100e9):
|
|
293
|
+
t = np.linspace(0, total_ns*1e-9, int(fs*total_ns*1e-9), endpoint=False)
|
|
294
|
+
t_ns = t*1e9
|
|
295
|
+
env = np.zeros_like(t_ns)
|
|
296
|
+
env += amp*np.exp(-((t_ns-(t0_ns-dt_ns))**2)/(2*(sigma_ns*0.7)**2))*0.5
|
|
297
|
+
env += amp*np.exp(-((t_ns-t0_ns)**2)/(2*sigma_ns**2))
|
|
298
|
+
env += amp*np.exp(-((t_ns-(t0_ns+dt_ns))**2)/(2*(sigma_ns*0.7)**2))*0.5
|
|
299
|
+
wave = env*np.cos(2*np.pi*fc*t)
|
|
300
|
+
return t_ns, wave, env, t
|
|
301
|
+
|
|
302
|
+
# ======================一、核磁自旋(氢核等)专用角度换算函数======================
|
|
303
|
+
def calc_angle_amp_nmr(target_angle, gamma, pulse_width_s, base_amp=1.0):
|
|
304
|
+
"""平顶包络(矩形/梯形)核磁幅值计算
|
|
305
|
+
target_angle:目标弧度(np.pi/np.pi/2)
|
|
306
|
+
gamma:旋磁比,氢核固定267.52e6 rad/(s·T)
|
|
307
|
+
pulse_width_s:有效脉宽(s)
|
|
308
|
+
"""
|
|
309
|
+
amp = target_angle/(gamma*pulse_width_s)*base_amp
|
|
310
|
+
return amp
|
|
311
|
+
|
|
312
|
+
def scale_env_angle_nmr(env_arr, dt, target_angle, gamma):
|
|
313
|
+
"""渐变包络核磁缩放:高斯/DRAG/超高斯适用"""
|
|
314
|
+
area = np.trapz(env_arr, dx=dt)
|
|
315
|
+
scale = target_angle/(gamma*area)
|
|
316
|
+
return env_arr*scale
|
|
317
|
+
|
|
318
|
+
# ======================二、超导量子比特专用角度换算函数(无旋磁比,拉比频率积分)======================
|
|
319
|
+
def calc_angle_amp_super(target_angle, pulse_width_s):
|
|
320
|
+
"""超导平顶脉冲幅值计算,θ=Ω·T"""
|
|
321
|
+
return target_angle/pulse_width_s
|
|
322
|
+
|
|
323
|
+
def scale_env_angle_super(env_arr, dt, target_angle):
|
|
324
|
+
"""超导渐变包络缩放,θ=∫Ω(t)dt"""
|
|
325
|
+
area = np.trapz(env_arr, dx=dt)
|
|
326
|
+
scale = target_angle/area
|
|
327
|
+
return env_arr*scale
|
|
328
|
+
|
|
329
|
+
# ======================运行演示======================
|
|
330
|
+
if __name__ == "__main__":
|
|
331
|
+
# --------案例1:核磁氢核,矩形π/π/2脉冲对比--------
|
|
332
|
+
gamma_h = 267.52e6
|
|
333
|
+
pw_ns = 45
|
|
334
|
+
pw_s = pw_ns*1e-9
|
|
335
|
+
amp_pi_nmr = calc_angle_amp_nmr(np.pi, gamma_h, pw_s)
|
|
336
|
+
amp_hpi_nmr = calc_angle_amp_nmr(np.pi/2, gamma_h, pw_s)
|
|
337
|
+
t1, w1, e1, ts1 = gen_rect_mod_pulse(amp=amp_pi_nmr, pulse_w_ns=pw_ns)
|
|
338
|
+
t2, w2, e2, ts2 = gen_rect_mod_pulse(amp=amp_hpi_nmr, pulse_w_ns=pw_ns)
|
|
339
|
+
|
|
340
|
+
fig1, axs1 = plt.subplots(2,1,figsize=(12,7))
|
|
341
|
+
axs1[0].plot(t1,w1,c="r",lw=1,label="核磁矩形π脉冲")
|
|
342
|
+
axs1[0].plot(t1,e1,c="#3699cc",ls="--",lw=2,label="包络")
|
|
343
|
+
axs1[0].set_title(r'π脉冲(完整能级翻转 $|0\rangle \leftrightarrow |1\rangle$)')
|
|
344
|
+
axs1[0].grid(alpha=0.3);axs1[0].legend()
|
|
345
|
+
axs1[1].plot(t2,w2,c="darkorange",lw=1,label="核磁矩形π/2脉冲")
|
|
346
|
+
axs1[1].plot(t2,e2,c="#3699cc",ls="--",lw=2,label="包络")
|
|
347
|
+
axs1[1].set_title("π/2脉冲(制备叠加态,用于Ramsey/自旋回波)")
|
|
348
|
+
axs1[1].set_xlabel("时间(ns)");axs1[1].grid(alpha=0.3);axs1[1].legend()
|
|
349
|
+
plt.tight_layout()
|
|
350
|
+
|
|
351
|
+
# --------案例2:超导比特,高斯包络适配π/2脉冲--------
|
|
352
|
+
fs=100e9
|
|
353
|
+
dt=1/fs
|
|
354
|
+
t_ns_raw, wave_raw, env_raw, t_s_raw = gen_gauss_mod_pulse()
|
|
355
|
+
env_super_hpi = scale_env_angle_super(env_raw, dt, np.pi/2)
|
|
356
|
+
fc=8e9
|
|
357
|
+
wave_super_hpi = env_super_hpi*np.cos(2*np.pi*fc*t_s_raw)
|
|
358
|
+
|
|
359
|
+
fig2, ax2 = plt.subplots(figsize=(12,4))
|
|
360
|
+
ax2.plot(t_ns_raw,env_super_hpi,c="#3699cc",label="缩放后高斯包络")
|
|
361
|
+
ax2.plot(t_ns_raw,wave_super_hpi,c="r",lw=1,label="超导π/2调制波形")
|
|
362
|
+
ax2.set_title("超导比特高斯型 π/2 脉冲")
|
|
363
|
+
ax2.set_xlabel("时间(ns)");ax2.grid(alpha=0.3);ax2.legend()
|
|
364
|
+
plt.tight_layout()
|
|
365
|
+
|
|
366
|
+
plt.show()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.2.4"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: QUBIT_Driver
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.4
|
|
4
4
|
Summary: Drive adapted for the quantum control system of the CeYear 1U Qubit_Driver Institute
|
|
5
5
|
Home-page:
|
|
6
6
|
Author: He Guo Yang
|
|
@@ -41,6 +41,10 @@ $ pip install QUBIT_Driver
|
|
|
41
41
|
|
|
42
42
|
### License
|
|
43
43
|
## Update log
|
|
44
|
+
### 1.2.4
|
|
45
|
+
- 添加思仪波形文件CY_Waveform.py
|
|
46
|
+
### 1.2.3
|
|
47
|
+
- 修改中频任意波形发生器初始化设置奈奎斯特为1区间
|
|
44
48
|
### 1.2.2
|
|
45
49
|
- 修改设备名称与驱动文件名称
|
|
46
50
|
### 1.2.1
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r",encoding="utf-8") as fh:
|
|
|
5
5
|
|
|
6
6
|
setuptools.setup(
|
|
7
7
|
name="QUBIT_Driver",
|
|
8
|
-
version="1.2.
|
|
8
|
+
version="1.2.4",
|
|
9
9
|
author="He Guo Yang",
|
|
10
10
|
author_email="2060817247@qq.com",
|
|
11
11
|
description="Drive adapted for the quantum control system of the CeYear 1U Qubit_Driver Institute",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.2.2"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|