在信號發(fā)生器自動(dòng)化測試中,模擬實(shí)際信號是驗(yàn)證設(shè)備性能、發(fā)現(xiàn)潛在問題的關(guān)鍵步驟。實(shí)際信號通常具有噪聲、非線性失真、動(dòng)態(tài)變化等特性,因此需要從信號生成、環(huán)境模擬、硬件接口和測試驗(yàn)證四個(gè)層面進(jìn)行綜合設(shè)計(jì)。以下是具體方法及實(shí)現(xiàn)示例:
模擬實(shí)際信號中常見的多頻分量,通過疊加不同頻率、幅度和相位的正弦波生成復(fù)雜信號。
pythonimport numpy as np
def generate_complex_signal(freqs, amps, phases, sample_rate, duration): """生成多頻疊加信號 Args: freqs: 頻率列表(Hz) amps: 幅度列表 phases: 相位列表(弧度) sample_rate: 采樣率(Hz) duration: 持續(xù)時(shí)間(秒) Returns: NumPy數(shù)組,包含疊加后的信號 """ 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)
模擬通信中的調(diào)制信號(如AM、FM、PM),驗(yàn)證信號發(fā)生器對調(diào)制信號的響應(yīng)能力。
pythondef generate_am_signal(carrier_freq, mod_freq, mod_index, sample_rate, duration): """生成AM調(diào)制信號 Args: carrier_freq: 載波頻率(Hz) mod_freq: 調(diào)制頻率(Hz) mod_index: 調(diào)制指數(shù)(0~1) sample_rate: 采樣率(Hz) duration: 持續(xù)時(shí)間(秒) Returns: NumPy數(shù)組,包含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) # 調(diào)制信號 return carrier * modulator
# 示例:10kHz載波,1kHz調(diào)制,調(diào)制指數(shù)0.5 am_signal = generate_am_signal(10e3, 1e3, 0.5, sample_rate=100e3, duration=0.01)
模擬實(shí)際中的突發(fā)信號(如脈沖、階躍變化),測試信號發(fā)生器的動(dòng)態(tài)響應(yīng)能力。
pythondef generate_pulse_signal(rise_time, fall_time, pulse_width, sample_rate, duration): """生成帶上升/下降沿的脈沖信號 Args: rise_time: 上升沿時(shí)間(秒) fall_time: 下降沿時(shí)間(秒) pulse_width: 脈沖寬度(秒) sample_rate: 采樣率(Hz) duration: 總持續(xù)時(shí)間(秒) Returns: NumPy數(shù)組,包含脈沖信號(0~1) """ t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) signal = np.zeros_like(t) # 上升沿(Sigmoid函數(shù)模擬) 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)
模擬實(shí)際電路中的熱噪聲或背景噪聲。
pythondef add_gaussian_noise(signal, snr_db): """添加高斯白噪聲 Args: signal: 原始信號(NumPy數(shù)組) 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)
通過多項(xiàng)式函數(shù)模擬放大器或傳輸通道的非線性特性(如諧波失真、交叉調(diào)制)。
pythondef add_nonlinear_distortion(signal, coeffs): """添加非線性失真 Args: signal: 原始信號(NumPy數(shù)組) coeffs: 多項(xiàng)式系數(shù)列表(如[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對應(yīng)線性項(xiàng),i=1對應(yīng)二次項(xiàng)... return distorted
# 示例:添加二次和三次諧波失真(系數(shù)0.1和0.01) distorted_signal = add_nonlinear_distortion(signal, coeffs=[1.0, 0.1, 0.01])
通過濾波器模擬實(shí)際通道的頻率響應(yīng)特性(如低通衰減、相位延遲)。
pythonfrom scipy.signal import butter, lfilter
def add_frequency_response(signal, cutoff, sample_rate, order=4): """添加低通濾波失真 Args: signal: 原始信號 cutoff: 截止頻率(Hz) sample_rate: 采樣率(Hz) order: 濾波器階數(shù) 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位數(shù) 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)
模擬實(shí)際系統(tǒng)中的閉環(huán)控制(如自動(dòng)增益控制AGC),驗(yàn)證信號發(fā)生器的穩(wěn)定性。
pythondef simulate_agc(signal, target_level=0.5, attack_time=1e-3, release_time=10e-3, sample_rate=1e6): """模擬AGC反饋環(huán)路 Args: signal: 輸入信號 target_level: 目標(biāo)幅度(0~1) attack_time: 上升時(shí)間常數(shù)(秒) release_time: 下降時(shí)間常數(shù)(秒) sample_rate: 采樣率(Hz) Returns: 經(jīng)過AGC調(diào)整的信號 """ 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調(diào)整突發(fā)信號 agc_output = simulate_agc(pulse, target_level=0.7, sample_rate=1e6)
設(shè)計(jì)覆蓋不同場景的測試用例,包括:
使用pytest或unittest框架,結(jié)合硬件接口庫(如PyVISA、PySerial)實(shí)現(xiàn)自動(dòng)化測試。
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讀取實(shí)際輸出(需硬件支持) adc_samples = dac.read_adc(num_samples=len(samples)) # 計(jì)算誤差(例如均方根誤差RMSE) rmse = np.sqrt(np.mean((samples - adc_samples) ** 2)) assert rmse < 0.01 # 允許誤差<1%
生成測試報(bào)告,包含時(shí)域波形圖、頻譜分析圖和關(guān)鍵指標(biāo)(如THD、SNR)。
pythonimport matplotlib.pyplot as plt
def generate_report(signal, noisy_signal, distorted_signal, freq): """生成測試報(bào)告""" plt.figure(figsize=(12, 8)) # 時(shí)域波形 plt.subplot(2, 1, 1) plt.plot(signal, label="原始信號") plt.plot(noisy_signal, label="帶噪聲信號") plt.plot(distorted_signal, label="失真信號") plt.title("時(shí)域波形") 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)),確保測試可復(fù)現(xiàn)。通過多頻疊加、調(diào)制信號、噪聲與失真模擬,結(jié)合硬件接口和自動(dòng)化測試框架,可全面驗(yàn)證信號發(fā)生器在實(shí)際場景中的性能。關(guān)鍵步驟包括:
這種方法能夠高效發(fā)現(xiàn)信號發(fā)生器的潛在問題,確保其在實(shí)際應(yīng)用中的可靠性。