在信号发生器自动化测试中,模拟实际信号是验证设备性能、发现潜在问题的关键步骤。实际信号通常具有噪声、非线性失真、动态变化等特性,因此需要从信号生成、环境模拟、硬件接口和测试验证四个层面进行综合设计。以下是具体方法及实现示例:
模拟实际信号中常见的多频分量,通过叠加不同频率、幅度和相位的正弦波生成复杂信号。
pythonimport numpy as np
def generate_complex_signal(freqs, amps, phases, sample_rate, duration): """生成多频叠加信号 Args: freqs: 频率列表(Hz) amps: 幅度列表 phases: 相位列表(弧度) sample_rate: 采样率(Hz) duration: 持续时间(秒) Returns: NumPy数组,包含叠加后的信号 """ t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) signal = np.zeros_like(t) for freq, amp, phase in zip(freqs, amps, phases): signal += amp * np.sin(2 * np.pi * freq * t + phase) return signal
# 示例:生成1kHz主频+3kHz三次谐波的信号 freqs = [1e3, 3e3] amps = [1.0, 0.3] # 三次谐波幅度为基波的30% phases = [0, np.pi/4] signal = generate_complex_signal(freqs, amps, phases, sample_rate=10e3, duration=0.1)
模拟通信中的调制信号(如AM、FM、PM),验证信号发生器对调制信号的响应能力。
pythondef generate_am_signal(carrier_freq, mod_freq, mod_index, sample_rate, duration): """生成AM调制信号 Args: carrier_freq: 载波频率(Hz) mod_freq: 调制频率(Hz) mod_index: 调制指数(0~1) sample_rate: 采样率(Hz) duration: 持续时间(秒) Returns: NumPy数组,包含AM信号 """ t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) carrier = np.sin(2 * np.pi * carrier_freq * t) modulator = 1 + mod_index * np.sin(2 * np.pi * mod_freq * t) # 调制信号 return carrier * modulator
# 示例:10kHz载波,1kHz调制,调制指数0.5 am_signal = generate_am_signal(10e3, 1e3, 0.5, sample_rate=100e3, duration=0.01)
模拟实际中的突发信号(如脉冲、阶跃变化),测试信号发生器的动态响应能力。
pythondef generate_pulse_signal(rise_time, fall_time, pulse_width, sample_rate, duration): """生成带上升/下降沿的脉冲信号 Args: rise_time: 上升沿时间(秒) fall_time: 下降沿时间(秒) pulse_width: 脉冲宽度(秒) sample_rate: 采样率(Hz) duration: 总持续时间(秒) Returns: NumPy数组,包含脉冲信号(0~1) """ t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) signal = np.zeros_like(t) # 上升沿(Sigmoid函数模拟) rise_mask = (t >= 0) & (t < rise_time) signal[rise_mask] = 1 / (1 + np.exp(-10 * (t[rise_mask] / rise_time - 0.5))) # 脉冲平台 plateau_mask = (t >= rise_time) & (t < rise_time + pulse_width) signal[plateau_mask] = 1 # 下降沿 fall_mask = (t >= rise_time + pulse_width) & (t < rise_time + pulse_width + fall_time) signal[fall_mask] = 1 / (1 + np.exp(10 * (t[fall_mask] - (rise_time + pulse_width)) / fall_time - 5)) return signal
# 示例:1ms上升沿,1ms下降沿,5ms脉冲宽度 pulse = generate_pulse_signal(1e-3, 1e-3, 5e-3, sample_rate=1e6, duration=0.02)
模拟实际电路中的热噪声或背景噪声。
pythondef add_gaussian_noise(signal, snr_db): """添加高斯白噪声 Args: signal: 原始信号(NumPy数组) snr_db: 信噪比(dB) Returns: 带噪声的信号 """ signal_power = np.mean(signal**2) noise_power = signal_power / (10 ** (snr_db / 10)) noise = np.random.normal(0, np.sqrt(noise_power), len(signal)) return signal + noise
# 示例:添加信噪比为20dB的噪声 noisy_signal = add_gaussian_noise(signal, snr_db=20)
通过多项式函数模拟放大器或传输通道的非线性特性(如谐波失真、交叉调制)。
pythondef add_nonlinear_distortion(signal, coeffs): """添加非线性失真 Args: signal: 原始信号(NumPy数组) coeffs: 多项式系数列表(如[1.0, 0.1, 0.01]表示1*x + 0.1*x^2 + 0.01*x^3) Returns: 失真后的信号 """ distorted = np.zeros_like(signal) for i, coeff in enumerate(coeffs): distorted += coeff * (signal ** (i + 1)) # i=0对应线性项,i=1对应二次项... return distorted
# 示例:添加二次和三次谐波失真(系数0.1和0.01) distorted_signal = add_nonlinear_distortion(signal, coeffs=[1.0, 0.1, 0.01])
通过滤波器模拟实际通道的频率响应特性(如低通衰减、相位延迟)。
pythonfrom scipy.signal import butter, lfilter
def add_frequency_response(signal, cutoff, sample_rate, order=4): """添加低通滤波失真 Args: signal: 原始信号 cutoff: 截止频率(Hz) sample_rate: 采样率(Hz) order: 滤波器阶数 Returns: 滤波后的信号 """ b, a = butter(order, cutoff / (0.5 * sample_rate), btype="low") return lfilter(b, a, signal)
# 示例:模拟截止频率为5kHz的低通滤波 filtered_signal = add_frequency_response(signal, cutoff=5e3, sample_rate=10e3)
考虑DAC的分辨率、量化噪声和输出范围限制。
pythondef simulate_dac(signal, bits=12, vref=5.0): """模拟DAC输出 Args: signal: 输入信号(范围:-1~1) bits: DAC位数 vref: 参考电压(V) Returns: 量化后的DAC输出(V) """ max_val = 2 ** bits - 1 scaled = (signal + 1) / 2 * max_val # 缩放到0~max_val quantized = np.round(scaled) # 量化 return (quantized / max_val * 2 - 1) * vref # 还原为电压值(范围:-vref~vref)
# 示例:12位DAC,5V参考电压 dac_output = simulate_dac(signal, bits=12, vref=5.0)
模拟实际系统中的闭环控制(如自动增益控制AGC),验证信号发生器的稳定性。
pythondef simulate_agc(signal, target_level=0.5, attack_time=1e-3, release_time=10e-3, sample_rate=1e6): """模拟AGC反馈环路 Args: signal: 输入信号 target_level: 目标幅度(0~1) attack_time: 上升时间常数(秒) release_time: 下降时间常数(秒) sample_rate: 采样率(Hz) Returns: 经过AGC调整的信号 """ gain = np.ones_like(signal) env = np.abs(signal) alpha_attack = 1 - np.exp(-1 / (attack_time * sample_rate)) alpha_release = 1 - np.exp(-1 / (release_time * sample_rate)) for i in range(1, len(signal)): if env[i] > env[i-1]: # 上升沿 gain[i] = gain[i-1] * (1 - alpha_attack) + alpha_attack * (target_level / env[i]) else: # 下降沿 gain[i] = gain[i-1] * (1 - alpha_release) + alpha_release * (target_level / env[i]) return signal * gain
# 示例:AGC调整突发信号 agc_output = simulate_agc(pulse, target_level=0.7, sample_rate=1e6)
设计覆盖不同场景的测试用例,包括:
使用pytest或unittest框架,结合硬件接口库(如PyVISA、PySerial)实现自动化测试。
pythonimport pytest import numpy as np from signal_generator import SignalGenerator from hardware import DACDriver
@pytest.fixture def signal_gen(): return SignalGenerator(sample_rate=10e6)
@pytest.fixture def dac(): return DACDriver(device_path="/dev/ttyUSB0")
def test_sine_wave_accuracy(signal_gen, dac): """测试正弦波输出精度""" freq = 1e3 amp = 1.0 signal_gen.set_parameters(freq, amp, "sine") samples = signal_gen.generate(duration=0.01) dac.write(samples) # 写入DAC # 从ADC读取实际输出(需硬件支持) adc_samples = dac.read_adc(num_samples=len(samples)) # 计算误差(例如均方根误差RMSE) rmse = np.sqrt(np.mean((samples - adc_samples) ** 2)) assert rmse < 0.01 # 允许误差<1%
生成测试报告,包含时域波形图、频谱分析图和关键指标(如THD、SNR)。
pythonimport matplotlib.pyplot as plt
def generate_report(signal, noisy_signal, distorted_signal, freq): """生成测试报告""" plt.figure(figsize=(12, 8)) # 时域波形 plt.subplot(2, 1, 1) plt.plot(signal, label="原始信号") plt.plot(noisy_signal, label="带噪声信号") plt.plot(distorted_signal, label="失真信号") plt.title("时域波形") plt.legend() # 频谱分析 plt.subplot(2, 1, 2) fft_original = np.fft.fft(signal) fft_noisy = np.fft.fft(noisy_signal) fft_distorted = np.fft.fft(distorted_signal) freqs = np.fft.fftfreq(len(signal), d=1/10e3) plt.plot(freqs[:len(freqs)//2], np.abs(fft_original[:len(freqs)//2]), label="原始频谱") plt.plot(freqs[:len(freqs)//2], np.abs(fft_noisy[:len(freqs)//2]), label="噪声频谱") plt.plot(freqs[:len(freqs)//2], np.abs(fft_distorted[:len(freqs)//2]), label="失真频谱") plt.xlim(0, freq * 5) # 显示前5次谐波 plt.title("频谱分析") plt.legend() plt.tight_layout() plt.savefig("test_report.png")
np.random.seed(42)),确保测试可复现。通过多频叠加、调制信号、噪声与失真模拟,结合硬件接口和自动化测试框架,可全面验证信号发生器在实际场景中的性能。关键步骤包括:
这种方法能够高效发现信号发生器的潜在问题,确保其在实际应用中的可靠性。