在信號發生器自動化(huà)測試中,模擬實際信號是驗證設(shè)備性能、發現潛在問題的(de)關鍵步驟。實際信號通常具有噪(zào)聲、非線性失真、動態變化等特性(xìng),因此需要從信號生成、環境模擬、硬件接口和測試驗證四(sì)個(gè)層麵進行綜合設計。以下是具體方法及實現(xiàn)示例:
模擬(nǐ)實際(jì)信(xìn)號(hào)中常見的多頻分量,通過疊加不(bú)同頻(pín)率、幅度和(hé)相位的正弦波生成複雜信號。
pythonimport numpy as np
def generate_complex_signal(freqs, amps, phases, sample_rate, duration): """生(shēng)成多頻(pín)疊加信號 Args: freqs: 頻率列表(Hz) amps: 幅度列表 phases: 相位列表(弧(hú)度) sample_rate: 采樣率(Hz) duration: 持續時間(秒) Returns: NumPy數組,包含(hán)疊加後的信號 """ 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] # 三次諧(xié)波(bō)幅度為基波的30% phases = [0, np.pi/4] signal = generate_complex_signal(freqs, amps, phases, sample_rate=10e3, duration=0.1)
模擬通信中的調製(zhì)信號(如AM、FM、PM),驗證信號發生器對調製信號的響應(yīng)能(néng)力。
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: 采樣(yàng)率(Hz) duration: 持續時間(jiān)(秒(miǎo)) 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) # 調製信號(hào) return carrier * modulator
# 示例:10kHz載波(bō),1kHz調製,調製指數0.5 am_signal = generate_am_signal(10e3, 1e3, 0.5, sample_rate=100e3, duration=0.01)
模擬實際中的突發信號(如脈衝、階躍變化),測試信號發生器的動態響應能(néng)力。
pythondef generate_pulse_signal(rise_time, fall_time, pulse_width, sample_rate, duration): """生成帶上升(shēng)/下降沿的脈衝(chōng)信號 Args: rise_time: 上升沿時間(秒) fall_time: 下降沿時間(秒) pulse_width: 脈衝寬度(秒) sample_rate: 采樣率(Hz) duration: 總(zǒng)持續時間(秒) Returns: NumPy數組,包含脈衝信號(0~1) """ t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) signal = np.zeros_like(t) # 上升沿(yán)(Sigmoid函數(shù)模擬) rise_mask = (t >= 0) & (t < rise_time) signal[rise_mask] = 1 / (1 + np.exp(-10 * (t[rise_mask] / rise_time - 0.5))) # 脈衝(chōng)平台 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下降(jiàng)沿(yán),5ms脈衝寬度 pulse = generate_pulse_signal(1e-3, 1e-3, 5e-3, sample_rate=1e6, duration=0.02)
模擬實際電路中的熱噪聲或(huò)背景噪(zào)聲。
pythondef add_gaussian_noise(signal, snr_db): """添加高斯白噪聲 Args: signal: 原始信號(NumPy數組) snr_db: 信噪(zào)比(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)
通過(guò)多項式函數模擬放大器或傳輸通道的(de)非線性特性(如諧波失真、交叉調製)。
pythondef add_nonlinear_distortion(signal, coeffs): """添加非線性失(shī)真 Args: signal: 原始(shǐ)信號(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和(hé)0.01) distorted_signal = add_nonlinear_distortion(signal, coeffs=[1.0, 0.1, 0.01])
通(tōng)過濾波器模擬實際通道的頻率響應特性(如(rú)低通衰減、相位延遲)。
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)
# 示例:模擬(nǐ)截止頻率為5kHz的低通濾波 filtered_signal = add_frequency_response(signal, cutoff=5e3, sample_rate=10e3)
考慮DAC的分辨(biàn)率、量化噪聲和輸出範圍限製。
pythondef simulate_dac(signal, bits=12, vref=5.0): """模擬DAC輸出 Args: signal: 輸入(rù)信號(範圍(wéi):-1~1) bits: DAC位數 vref: 參考電壓(yā)(V) Returns: 量化(huà)後的(de)DAC輸出(chū)(V) """ max_val = 2 ** bits - 1 scaled = (signal + 1) / 2 * max_val # 縮放到(dào)0~max_val quantized = np.round(scaled) # 量化 return (quantized / max_val * 2 - 1) * vref # 還原為電壓值(範圍:-vref~vref)
# 示(shì)例:12位DAC,5V參(cān)考電壓 dac_output = simulate_dac(signal, bits=12, vref=5.0)
模擬實際係統中的(de)閉(bì)環控製(如自(zì)動增益控製AGC),驗(yàn)證(zhèng)信號發生器的(de)穩定性。
pythondef simulate_agc(signal, target_level=0.5, attack_time=1e-3, release_time=10e-3, sample_rate=1e6): """模擬(nǐ)AGC反饋環路 Args: signal: 輸(shū)入信(xìn)號 target_level: 目標幅度(dù)(0~1) attack_time: 上升時間(jiān)常數(秒) release_time: 下降時間常數(shù)(秒) 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]: # 上升沿(yán) gain[i] = gain[i-1] * (1 - alpha_attack) + alpha_attack * (target_level / env[i]) else: # 下降(jiàng)沿 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或(huò)unittest框架,結(jié)合硬(yìng)件(jiàn)接口庫(如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): """測試(shì)正弦波輸出精度""" freq = 1e3 amp = 1.0 signal_gen.set_parameters(freq, amp, "sine") samples = signal_gen.generate(duration=0.01) dac.write(samples) # 寫入DAC # 從ADC讀取實際(jì)輸出(需硬(yìng)件支持) adc_samples = dac.read_adc(num_samples=len(samples)) # 計算誤差(例如均方根誤差RMSE) rmse = np.sqrt(np.mean((samples - adc_samples) ** 2)) assert rmse < 0.01 # 允許誤差<1%
生成(chéng)測試報告,包含時域波形圖、頻譜分(fèn)析圖和(hé)關鍵指標(如THD、SNR)。
pythonimport matplotlib.pyplot as plt
def generate_report(signal, noisy_signal, distorted_signal, freq): """生成測試報告""" plt.figure(figsize=(12, 8)) # 時域(yù)波形 plt.subplot(2, 1, 1) plt.plot(signal, label="原始信號") plt.plot(noisy_signal, label="帶噪聲信號(hào)") 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="原始(shǐ)頻譜") 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="失真(zhēn)頻譜") plt.xlim(0, freq * 5) # 顯(xiǎn)示前(qián)5次諧波(bō) plt.title("頻譜分(fèn)析") plt.legend() plt.tight_layout() plt.savefig("test_report.png")
np.random.seed(42)),確保測試可複現。通過多頻疊加、調製信號、噪聲與失真模擬,結合硬件(jiàn)接口和自動化測試框架,可全麵驗證信(xìn)號發生器在(zài)實際場景中的性能。關鍵步驟包括:
這(zhè)種方法(fǎ)能夠高效發現信號發生(shēng)器(qì)的潛在問題,確保其在實(shí)際應用中的可靠(kào)性。