4. 基于正弦拟合的增益和偏移估计

基于正弦拟合的增益和偏移估计 学习卡片

任务定义

在高速ADC中,增益误差与偏移误差是影响动态性能的两项主要线性误差。本案例要求:给定一组由ADC采集得到的、已知理想幅度与理想偏移的正弦波采样序列,通过最小二乘正弦拟合法估计实际增益与偏移,并给出估计误差的判定方法。实现语言为Python,不依赖外部信号采集硬件,使用仿真数据验证算法正确性。

算法原理与实现

设ADC理想输入信号为 \( x(t) = A_0 \cos(2\pi f_0 t + \phi_0) + D_0 \),实际ADC输出为 \( y[n] = g \cdot x[n] + d_{\text{off}} + e[n] \),其中 \( g \) 为增益(理想为1),\( d_{\text{off}} \) 为偏移,\( e[n] \) 为量化噪声或随机噪声。通过最小二乘拟合,将观测序列表示为三个基函数(直流、余弦、正弦)的线性组合:

\[ y[n] = c_0 + c_1 \cos(2\pi f_0 n T_s) + c_2 \sin(2\pi f_0 n T_s) \]

拟合系数 \( c_0, c_1, c_2 \) 通过最小二乘正规方程求得。增益估计为 \( \hat{g} = \sqrt{c_1^2 + c_2^2} / A_0 \),偏移估计为 \( \hat{d}_{\text{off}} = c_0 - D_0 \)。

代码实现

import numpy as np

def sine_fit_gain_offset(y, fs, f0, A0, D0):
    """
    基于最小二乘正弦拟合估计增益与偏移
    参数:
        y: ADC采样序列 (numpy数组)
        fs: 采样率 (Hz)
        f0: 正弦信号频率 (Hz)
        A0: 理想输入幅度
        D0: 理想输入直流偏移
    返回:
        g_est: 增益估计值
        d_est: 偏移估计值 (相对于理想偏移的差值)
    """
    N = len(y)
    n = np.arange(N)
    t = n / fs
    
    # 构建设计矩阵: [1, cos(2πf0t), sin(2πf0t)]
    H = np.column_stack([
        np.ones(N),
        np.cos(2 * np.pi * f0 * t),
        np.sin(2 * np.pi * f0 * t)
    ])
    
    # 最小二乘求解
    coeffs, _, _, _ = np.linalg.lstsq(H, y, rcond=None)
    c0, c1, c2 = coeffs
    
    # 增益与偏移估计
    amp_est = np.sqrt(c1**2 + c2**2)
    g_est = amp_est / A0
    d_est = c0 - D0
    
    return g_est, d_est

# ===== 仿真验证 =====
fs = 100e6          # 采样率 100 MHz
f0 = 10.1e6         # 信号频率 10.1 MHz (非相干采样)
N = 1024            # 采样点数
A0 = 0.8            # 理想幅度
D0 = 0.05           # 理想直流偏移
true_gain = 1.15    # 实际增益
true_offset = 0.12  # 实际偏移

# 生成理想正弦序列
n = np.arange(N)
t = n / fs
x_ideal = A0 * np.cos(2 * np.pi * f0 * t) + D0

# 施加增益与偏移
y = true_gain * x_ideal + true_offset

# 添加少量噪声模拟量化效应
np.random.seed(42)
noise = 0.001 * np.random.randn(N)
y_noisy = y + noise

# 执行估计
g_est, d_est = sine_fit_gain_offset(y_noisy, fs, f0, A0, D0)

# 输出结果
print(f"真实增益: {true_gain:.6f}")
print(f"估计增益: {g_est:.6f}")
print(f"增益误差: {abs(g_est - true_gain):.2e}")
print(f"真实偏移: {true_offset:.6f}")
print(f"估计偏移: {d_est:.6f}")
print(f"偏移误差: {abs(d_est - true_offset):.2e}")

落地与验证

运行方式:将上述代码保存为 sine_fit_calib.py,在已安装NumPy的Python 3环境中执行 python sine_fit_calib.py。

验证判定标准:程序输出中,增益估计值应接近1.15,偏移估计值应接近0.12。由于加入了幅度为0.001的高斯噪声,增益误差应小于1e-3量级,偏移误差应小于1e-3量级。若误差显著偏大,需检查输入频率是否满足奈奎斯特条件以及采样点数是否足够覆盖多个信号周期。

正弦拟合增益/偏移估计流程 ADC采样序列 y[n], fs, f0, A0, D0 构建设计矩阵 H = [1, cos, sin] 最小二乘求解 lstsq(H, y) → c0,c1,c2 参数计算 g = √(c₁²+c₂²) / A₀ d = c₀ − D₀ 输出估计值 ĝ, d̂ 验证: 误差 < 1e-3 |ĝ−g|, |d̂−d| 判定通过

关键说明

本实现采用非相干采样(10.1 MHz信号在100 MHz采样率下),避免了相干采样对频率精度的苛刻要求。最小二乘拟合直接对原始采样点进行,无需加窗或FFT预处理。若实际ADC采样序列包含明显非线性失真,本方法仅估计线性增益与偏移,非线性误差不在本案例范围内。代码中噪声幅度设为0.001,用于模拟量化噪声,实际ADC的估计精度受噪声与采样点数共同影响,可通过增加N或降低噪声改善估计结果。