adctoolbox.calibration.calibrate_weight_sine_lite 源代码
"""Minimal ADC calibration using sinewave input at known frequency."""
import numpy as np
from scipy.linalg import lstsq
[文档]
def calibrate_weight_sine_lite(
bits: np.ndarray,
freq: float
) -> np.ndarray:
"""
Minimal calibration at known frequency. Returns normalized weights.
Expects well-conditioned binary data (N samples x M bits).
"""
n_samples, bit_width = bits.shape
# Build fundamental basis
t = np.arange(n_samples)
phase = 2.0 * np.pi * freq * t
cos_basis = np.cos(phase)
sin_basis = np.sin(phase)
# Cosine=1 assumption
offset_col = np.ones((n_samples, 1))
A = np.column_stack([bits, offset_col, sin_basis])
b = -cos_basis
coeffs, _, _, _ = lstsq(A, b)
# Extract weights and normalization
weights_raw = coeffs[:bit_width]
sin_coeff = coeffs[-1]
norm_factor = np.sqrt(1.0 + sin_coeff**2)
weights = weights_raw / norm_factor
# Polarity correction (ensure positive sum)
if np.sum(weights) < 0:
weights = -weights
return weights