用 IT2806 源表录音+播放
视频:用喇叭来录音,把IT2800高端源表用成了VM该有的不正经样子
材料
USB 配置
进入Menu
-> System
-> Communication
配置 USB Type
为 Host
,如图:

配置完成后,就可以用前面板的 USB 口接 U 盘了。
录音
录音时,使用源表的 Recorder
功能
源表设为两线连接,把扬声器连接到源表的输出
配置
进入 Menu
-> Recorder
-> Setting
-> Advanced Setting
配置如下图 :

Time
为 100us
,采样率 10kSaps
Recorder Mode
为 Once
,不循环采集
Point Number
为 99999
,录音约 10 秒
File Format
为 Csv
退回 Recorder
界面

V Range
设为 200mV
V Set
设为 0
I Range
设为 1uA
打开电源输出,点 Run
开始采集波形。
录制结束后,从前面板接入 U 盘
进入 Menu
-> Recorder
-> Setting
-> Advanced Setting
选择 Export to Udisk
把录音波形导出到 U 盘。波形文件是一个 CSV 表格。
记住文件名,后面需要编辑这个文件。

波形处理
文件模板
有了录音波形,我们还要把它适当放大,并转为扫描列表文件的格式。
首先我们要拿到扫描列表文件的格式模板:
进入Menu
-> Sweep
-> Setting
-> Common Setting
Mode
设置为 List

点击 New File
新建电压扫描列表。
在扫描列表添加几个扫描点,电压值随意取。

然后点击 Save
选择 USB
,把 扫描列表存到 U 盘里。
这也是一个 CSV 表格。记住文件名,后面需要编辑它。

这样我们就获得了扫描列表的模板。
数据放大
- 把 U 盘插到电脑上
- 打开录音波形的数据表格,把
Volt(V)
(电压)一列适当放大(比如乘10000。)放到最后一列。(EXCEL 可以先复制单元格,用 Shift + Ctrl + ↓
全选再批量粘贴)
注意生成的波形幅值应该在 ±2V 之间(如果你清楚喇叭特性的话,也可以不注意 🙂 )。
最后一列就是我们播放用的扫描列表数据。

- 再打开 扫描列表模板 的表格,把 Total Steps 改成 99999 (与录音对应,最大为99999点)
再把录音波形最后一列的数据批量粘贴到 扫描列表模板的 Voltage(V)
列中
然后构造列表序号:第二个序号开始,每个序号等于上一个序号加1,批量复制公式。(用 Ctrl + ↓
找到数据列表的底端,再 Shift + Ctrl + ↑
可全选序号区域)

播放用的扫描列表就做好了,可以到列表末尾检查下序号数目,应为 99999

- 把 扫描列表 保存到 U 盘上
播放
把 U 盘接到源表上
进入 Menu
-> Sweep
-> Setting
-> Common Setting

Mode
设为 List
End Type
设为 OFF
Range
设为 Best
Open File
,打开 刚才编辑好的扫描列表,打开后左侧可以看到列表的部分数据
进入 Trigger Setting
页面

Start Trigger Source
设为 Immediate
Step Source
设为 Timer
Period
设为 100us
回到 Sweep

V Set
设为 0
,以防开启电源时烧毁扬声器
V Range
设置 2V
( 视扬声器功率和列表数据的幅值而定 )
I Set
视你的扬声器功率而定,建议先用小电流测试,以防烧毁扬声器
打开电源输出,按 Run
启动扫描,就能播放录音了。
如果音量过小或者有爆裂声,可能是 VRange
或 I Set
过小,可以自行谨慎地调节。
python + SCPI 命令控制录音
除了用源表界面控制录音之外,还可以用 PC 通过 SCPI 命令控制 IT2806 录音和播放。IT2806 可以通过 USB、以太网或 GPIB 接口连接 PC,接收 SCPI 命令。
通过 USB 连接比较方便。配置 USB 的方法:
进入 Menu
-> System
-> Communication
USB Type
设为 Device
USB Device
设为 VCP
(虚拟串口)

我们用 python 控制源表。要先安装 SCPI 库 PyVISA 和 PyVISA-py:
pip install -U pyvisa
pip install pyvisa-py
下面是实现录音播放功能的 python 代码:
# 适用于 IT2800 源表
import pyvisa
import time
resourceOrder = 0 # 源表在 resource 列表中的顺序,从 0 开始。例如 print(rm.list_resources()) 打印的第 2 个设备是源表,那么这里要填 1
record_time = 1 # 录制时间,单位为秒。
points = int(record_time * 1E4)
rm = pyvisa.ResourceManager()
print(rm.list_resources())
smu = rm.open_resource(rm.list_resources()[resourceOrder])
print(smu.query('*IDN?'))
# record
# 设置输出
smu.write('*RST')
smu.write('VOLT:RANG 0.2')
smu.write('VOLT 0.2')
smu.write('CURR:RANG 1E-6')
smu.write('CURR 1E-9')
smu.write('SENS:FORM:ELEM:SENS VOLT') # 设置 Trace 数据元素为电压
smu.write('SENS:FORM ASCII') # 设置 Trace 返回值类型为字符串
smu.write('SENS:REC:ACQ:INT:APER 1E-4') # 采样率 10K
smu.write('SENS:REC:APER MAX') # 孔径时间
smu.write('SENS:REC:DATA:NUMB ' + str(points)) # 采样长度
smu.write('SENS:REC:MODE ONCE') # 一次采样
smu.write('FUNC:TRIG:CONT 1') # 设置自动触发
smu.write('OUTPUT 1') # 输出
smu.write('SENS:RECORder:RUN') # 启动 recorder 功能
# 等待采集结束
cnt = 0
while(cnt < points):
cnt = int(smu.query('SENS:TRAC:POIN:ACT?'))
print('Recording : ' + '{:.1f}'.format(cnt/points*100) + '%')
print('Receiving,please wait.')
volts = smu.query('SENS:TRAC:DATA?').split(';') # 获取所有缓存数据
# 放大 10000 倍
for i in range(0, len(volts)):
volts[i] = '{:.4f}'.format(float(volts[i]) * 10000)
print(volts)
# play
smu.write('*RST')
# 设置输出
smu.write('OUTPUT 0')
smu.write('VOLT:RANG 20')
smu.write('VOLT 0')
smu.write('CURR:RANG 1')
smu.write('CURR 1')
# 扫描设置
smu.write('SOUR:SWE:FIN OFF') # 结束后关闭扫描
smu.write('SOUR:SWE:SPAC LIST') # 列表模式
smu.write('SOUR:SWE:TRIG:STEP:TIM 1E-4') # 扫描步进触发频率 1kHz
smu.write('SOUR:SWE:TRIG:STEP:SOUR TIM') # 扫描步进触发源为定时器
smu.write('SOUR:SWE:TRIG:STAR:SOUR BUS') # 总线触发扫描
smu.write('SOUR:LIST:VOLT:CLE') # 清除电压列表
print(smu.query('SOUR:LIST:VOLT:POIN?')) # 查询电压列表点数
end = int(points/20-1)
for i in range(0, end):
smu.write('SOUR:LIST:VOLT:APP '+','.join(volts[i*20:(i+1)*20]))
time.sleep(0.001)
if(i % 100 == 0):
print('Sending : '+'{:.1f}'.format(i/end * 100)+'%')
time.sleep(0.001)
smu.write('SOUR:LIST:CONF') # 令当前列表生效。若执行失败,源表会发出提示音
print(smu.query('SOUR:LIST:VOLT:POIN?')) # 查询电压列表点数
time.sleep(0.001)
smu.write('OUTPUT 1') # 输出
time.sleep(0.001)
smu.write('SOUR:SWE:INIT') # 开启扫描
time.sleep(0.001)
smu.write('*TRG') # 触发扫描
time.sleep(0.3)
# 等待扫描结束
while smu.query('SOUR:SWE:RST?') == 'RUN\n':
time.sleep(0.3)
print('Running')
print('End')
smu.write('SYST:LOC') # 源表回到本地模式