在信号发生器脚本中实现信号的实时监控,通常需要结合硬件接口、数据采集和可视化技术。以下是分步骤的实现方法及代码示例(以Python为例),涵盖从硬件控制到实时显示的完整流程:
matplotlib
的
FuncAnimation
或
pyqtgraph
实现高效刷新。
python
import
pyvisa
# 连接信号发生器
rm = pyvisa.ResourceManager()
scope = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")# 替换为实际地址
# 设置信号参数(示例:1MHz正弦波,1Vpp)
scope.write("SOUR1:FUNC SIN")
scope.write("SOUR1:FREQ 1e6")
scope.write("SOUR1:VOLT 1")
scope.write("OUTP1 ON")
python
import
numpy
as
np
import
time
from
collections
import
deque
# 初始化缓冲区(存储最近1000个采样点)
buffer_size =
1000
data_buffer = deque(maxlen=buffer_size)
timestamps = deque(maxlen=buffer_size)
# 模拟数据采集(实际应替换为硬件读取,如scope.query_binary_values)
def
acquire_data():
# 示例:生成带噪声的1MHz信号
t = time.time()
x = np.linspace(0,
1,
100)
signal = np.sin(2
* np.pi *
1e6
* x) +
0.1
* np.random.randn(100)
return
t, signal
# 数据采集线程(简化版,实际建议用threading)
def
data_collection_loop():
while
True:
t, signal = acquire_data()
data_buffer.extend(signal)
timestamps.extend([t] *
len(signal))
time.sleep(0.01)# 根据采样率调整
python
import
matplotlib.pyplot
as
plt
from
matplotlib.animation
import
FuncAnimation
fig, (ax1, ax2) = plt.subplots(2,
1, figsize=(10,
6))
line1, = ax1.plot([], [],
'b-')
line2, = ax2.plot([], [],
'r-')
ax1.set_ylim(-1.5,
1.5)
ax2.set_ylim(-50,
10)
def
update_plot(frame):
if
len(data_buffer) >
0:
# 时域绘图
line1.set_data(range(len(data_buffer)), data_buffer)
ax1.set_xlim(0, buffer_size)
# 频域绘图(FFT)
fft_result = np.abs(np.fft.fft(data_buffer))[:buffer_size//2]
freqs = np.fft.fftfreq(buffer_size, d=1e-6)[:buffer_size//2]# 假设采样间隔1μs
line2.set_data(freqs,
20
* np.log10(fft_result))
ax2.set_xlim(0,
5e6)# 显示0-5MHz
return
line1, line2
ani = FuncAnimation(fig, update_plot, interval=100)
plt.tight_layout()
plt.show()
python
import
threading
# 启动数据采集线程
thread = threading.Thread(target=data_collection_loop, daemon=True)
thread.start()
# 主线程运行绘图
plt.show()
time.perf_counter()
)同步数据采集与显示。
pyqtgraph
替代
matplotlib
(速度更快,适合高频更新)。
asyncio
实现非阻塞I/O操作。
pyvisa.VisaIOError
并重连。
python
from
scipy.fft
import
fft, fftfreq
def
compute_spectrum(data, sample_rate=1e6
):
n =
len(data)
yf = fft(data)
xf = fftfreq(n,
1/sample_rate)[:n//2]
return
xf,
2.0/n * np.abs(yf[:n//2])
pythondef check_threshold(data, threshold=1.2):if np.max(np.abs(data)) > threshold:print("⚠️ 信号幅度超限!")
python
import
pandas
as
pd
def
save_to_csv(timestamps, data):
df = pd.DataFrame({"timestamp": timestamps,
"signal": data})
df.to_csv("signal_log.csv", index=False)
pyqtgraph
(高性能)
bokeh
(Web交互式)
scipy.signal
(滤波、FFT)
numpy
(数值计算)
通过上述方法,可实现信号发生器输出信号的实时监控,适用于调试、自动化测试或闭环控制场景。根据实际硬件接口调整代码中的通信协议(如USBTMC、VXI-11等)即可适配不同设备。