在信号发生器自动化测试中,模拟实际信号是验证设备性能、发现潜在问题的关键步骤。实际信号通常具有噪声、非线性失真、动态变化等特性,因此需要从信号生成、环境模拟、硬件接口和测试验证四个层面进行综合设计。以下是具体方法及实现示例:
模拟实际信号中常见的多频分量,通过叠加不同频率、幅度和相位的正弦波生成复杂信号。
python
import
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),验证信号发生器对调制信号的响应能力。
python
def
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)
模拟实际中的突发信号(如脉冲、阶跃变化),测试信号发生器的动态响应能力。
python
def
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
signal[rise_mask] =
1
/ (1
+ np.exp(-10
* (t[rise_mask] / rise_time -
0.5)))
# 脉冲平台
plateau_mask = (t >= rise_time) & (t
signal[plateau_mask] =
1
# 下降沿
fall_mask = (t >= rise_time + pulse_width) & (t
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)
模拟实际电路中的热噪声或背景噪声。
python
def
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)
通过多项式函数模拟放大器或传输通道的非线性特性(如谐波失真、交叉调制)。
python
def
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])
通过滤波器模拟实际通道的频率响应特性(如低通衰减、相位延迟)。
python
from
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的分辨率、量化噪声和输出范围限制。
python
def
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),验证信号发生器的稳定性。
python
def
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)实现自动化测试。
python
import
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)。
python
import
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)
),确保测试可复现。
通过多频叠加、调制信号、噪声与失真模拟,结合硬件接口和自动化测试框架,可全面验证信号发生器在实际场景中的性能。关键步骤包括:
这种方法能够高效发现信号发生器的潜在问题,确保其在实际应用中的可靠性。