WiFi_CE_占用带宽自动化测试_基于 Python + 罗德频谱仪(SCPI指令)
·
2.4G_WiFi_CE_占用带宽测试标准请参考下面博客
测试组网图:

下面代码示例,只是基于罗德频谱仪测试OBW的基础操作,如有疑问,欢迎留言沟通。
import time
from visa_information import VisaCommunication # 请查看之前文章,关于仪表visa控制
# 基于罗德频谱仪的SCPI指令写的代码。
class OccupiedBandwidthTest:
"""
此方法只是基于频谱仪获取到OBW的测试结果,
并不包含测试截图,测试数据保存,频谱仪更细节的操作
"""
def __init__(self, ip, bandwidth, test_freq):
"""
占用带宽测试
:param ip:仪表的IP
:param bandwidth:带宽
:param test_freq:测试频点
"""
self.spectrum = VisaCommunication(ip) # 仪表通讯
self.bandwidth = bandwidth
self.test_freq = test_freq
self.spectrum.send("SYST:PRES") # 恢复出厂设置
def test(self, reference_level, loss, point, count):
"""
OBW测试
:param reference_level:参考电平,一般情况会参考法规限值当依据进行设置
:param loss: 线损 + 天线增益 + 定向增益
:param point: 扫描点数,一般情况为>1001
:param count:直到波形稳定,对于WiFi扫描6次以上就差不多
:return:
"""
rbw, vbw = self.get_rbw_vbw(self.bandwidth)
self.spectrum.send(f":INITiate:CONTinuous OFF")
self.spectrum.send(f"DISP:TRAC:MODE MAXHold")
self.spectrum.send(f"SENSe:DETector:FUNCtion RMS")
self.spectrum.send(f"SENSe:BANDwidth:RESolution {rbw}")
self.spectrum.send(f"SENSe:BANDwidth:VIDeo {vbw}")
self.spectrum.send(f"DISPlay:WINDow:TRACe:Y:SCALe:RLEVel {reference_level}")
self.spectrum.send(f"DISPlat:WINDow:TRACe:Y:SCALe:RLEVel:OFFSet {loss}")
centerfreq = float(self.test_freq) * 1e6
self.spectrum.send(f"FREQuency:CENTer {centerfreq}")
span = float(self.bandwidth * 2) * 1e6
self.spectrum.send(f'FREQ:SPAN {span}')
self.spectrum.send(f"SWE:POIN {point}")
self.spectrum.send(":SENSe:SWEep:TIME:AUTO OFF")
self.spectrum.send(f":SENSe:SWEep:TIME:1s")
self.spectrum.send(f"SWE:COUN {count}")
time.sleep(int(count) * 1.2) # 这个可以做成一个检查上面操作是否完成,完成基执行上面操作,没有就等1s
# 获取结果
self.spectrum.send("CALC:MARK:FUNC:POW:SEL OBW")
self.spectrum.send(f"SENS:POW:BWID 99PCT"),
self.spectrum.send(f"SENS:POW:ACH:BWID {self.bandwidth}MHz")
result = self.spectrum.query("CACL:MARK:FUNC:POW:RES? OBW")
ret = round(float(result) / 1e6, 4)
return ret
def get_rbw_vbw(self, bandwidth):
"""
获取频谱仪的RBW/VBW
由于CE中要求RBW不低于Span的1 %"
所以可以按照这个标准定义,主要是有些频谱仪RBW/VBW设置会出现一定量的偏差(打不到需要设置的值)
:param bandwidth:
:return:
"""
if int(bandwidth) == 20:
obw_rbw = 300
obw_vbw = 800
elif int(bandwidth) == 40:
obw_rbw = 500
obw_vbw = 2000
elif int(bandwidth) == 80:
obw_rbw = 1000
obw_vbw = 3000
elif int(bandwidth) == 160:
obw_rbw = 2000
obw_vbw = 6000
else: # 320M
obw_rbw = 5000
obw_vbw = 20000
return obw_rbw, obw_vbw
更多推荐


所有评论(0)