资讯中心

联系我们

深圳市维立信电子科技有限公司
地址:深圳市福田区红荔路第一世界广场A座8D-E
咨询电话:0755-83766766
E-mail:info@welissom.com

信号发生器自动化测试中如何模拟实际信号?

2025-10-13 11:01:11  点击:

在信号发生器自动化测试中,模拟实际信号是验证设备性能、发现潜在问题的关键步骤。实际信号通常具有噪声、非线性失真、动态变化等特性,因此需要从信号生成、环境模拟、硬件接口和测试验证四个层面进行综合设计。以下是具体方法及实现示例:

一、信号生成:构建复杂测试信号

1. 基础波形叠加

模拟实际信号中常见的多频分量,通过叠加不同频率、幅度和相位的正弦波生成复杂信号。

  • 示例:生成包含主频和谐波的信号
    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)

2. 调制信号模拟

模拟通信中的调制信号(如AM、FM、PM),验证信号发生器对调制信号的响应能力。

  • 示例:生成幅度调制(AM)信号
    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)

3. 瞬态信号模拟

模拟实际中的突发信号(如脉冲、阶跃变化),测试信号发生器的动态响应能力。

  • 示例:生成带上升/下降沿的脉冲信号
    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 < 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)

二、环境模拟:添加噪声与失真

1. 添加高斯白噪声

模拟实际电路中的热噪声或背景噪声。

  • 示例
    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)

2. 模拟非线性失真

通过多项式函数模拟放大器或传输通道的非线性特性(如谐波失真、交叉调制)。

  • 示例
    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])

3. 模拟频率响应失真

通过滤波器模拟实际通道的频率响应特性(如低通衰减、相位延迟)。

  • 示例
    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与反馈控制

1. 模拟DAC输出特性

考虑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)

2. 反馈环路模拟

模拟实际系统中的闭环控制(如自动增益控制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)

四、测试验证:自动化测试流程

1. 测试用例设计

设计覆盖不同场景的测试用例,包括:

  • 基础功能测试:单频正弦波输出精度。
  • 动态性能测试:频率/幅度跳变的过渡时间。
  • 噪声与失真测试:信噪比(SNR)、总谐波失真(THD)。
  • 长期稳定性测试:连续运行24小时的幅度/频率漂移。

2. 自动化测试框架

使用pytestunittest框架,结合硬件接口库(如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%

3. 结果分析与报告

生成测试报告,包含时域波形图、频谱分析图和关键指标(如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")

五、关键注意事项

  1. 信号同步:确保生成信号与硬件时钟同步,避免采样偏移。
  2. 资源限制:模拟高采样率或长持续时间信号时,注意内存和计算资源。
  3. 硬件校准:定期校准DAC/ADC,消除系统误差。
  4. 可重复性:固定随机种子(如np.random.seed(42)),确保测试可复现。

总结

通过多频叠加、调制信号、噪声与失真模拟,结合硬件接口和自动化测试框架,可全面验证信号发生器在实际场景中的性能。关键步骤包括:

  1. 信号生成:构建复杂测试信号(多频、调制、瞬态)。
  2. 环境模拟:添加噪声、非线性失真和频率响应失真。
  3. 硬件接口:模拟DAC输出和反馈控制。
  4. 自动化测试:设计测试用例、执行自动化测试并生成报告。

这种方法能够高效发现信号发生器的潜在问题,确保其在实际应用中的可靠性。