Skip to content

Calibration System Architecture

Overview

El Calibration System es un framework modular para calibración y ajuste fino de componentes DSP. Implementa un pipeline estándar de 5 etapas y soporta optimización multi-objetivo.

Core Concepts

1. Calibration Target

Un CalibrationTarget encapsula: - El componente a calibrar (ICalibratableComponent) - Una o más especificaciones (CalibrationSpecification) - Método para calcular error entre respuesta medida y target

CalibrationTarget target("FilterID", componentPtr);
target.addSpecification(spec1);
target.addSpecification(spec2);  // Multi-objective

2. Calibration Specification

Define el comportamiento target:

CalibrationSpecification spec(TargetType::FREQUENCY_RESPONSE);
spec.idealResponse = { /* target curve */ };
spec.tolerances = { /* per-point tolerances */ };
spec.importance = 1.0f;  // Weight for multi-objective
spec.errorThreshold = 0.1f;  // Convergence criterion

3. Calibration Process

Pipeline estándar de 5 etapas:

1. Preparation → Setup test signals, initialize optimizer
2. Measurement → Inject stimulus, capture response
3. Optimization → Iteratively adjust parameters
4. Validation → Verify stability, consistency
5. Storage → Save and apply results

Implementado como clase base CalibrationProcess con métodos virtuales.

4. Measured Response

Datos capturados del componente:

struct MeasuredResponse {
    std::vector<float> frequencies;
    std::vector<float> magnitudes;  // dB
    std::vector<float> phases;      // radians
    std::map<std::string, float> metrics;
};

5. Calibration Result

Output final:

struct CalibrationResult {
    bool success;
    std::map<std::string, float> parameters;  // Optimized values
    CalibrationError error;
    int iterationsUsed;
    MeasuredResponse finalResponse;
};

Architecture Diagrams

Component Hierarchy

ICalibratableComponent
CalibrationTarget (wraps component + specs)
CalibrationProcess (abstract base)
Concrete Calibrators:
    - FilterCalibrator
    - DynamicsCalibrator
    - NonlinearCalibrator
    - etc.

Data Flow

Component Parameters
Test Signal Generator → Component → Measurement
Error Calculation (vs Target)
Optimizer → New Parameters
Repeat until convergence

Multi-Objective Optimization

Population of Solutions
Evaluate all objectives
Calculate Pareto Ranks
Calculate Crowding Distances
Select next generation
Crossover & Mutation
Repeat until convergence
Select best from Pareto front

Subsystems

00_calibration_framework

Core framework con estructuras base: - CalibrationTarget: Define qué calibrar - CalibrationProcess: Pipeline estándar - MultiObjectiveOptimizer: NSGA-II implementation - CalibrationSignalGenerator: Test signal generation

01_frequency_calibration

Calibración de respuesta en frecuencia: - FilterCalibrator: Filtros y EQs - Log sweep o discrete tone measurement - Gradient descent optimization

02_dynamics_calibration

Calibración de procesadores dinámicos: - Curvas de compresión - Tiempos de attack/release - Gate/expander thresholds

03_nonlinear_calibration

Calibración de no-linealidades: - Contenido armónico - Transfer functions - Saturación y distorsión

04_modulation_calibration

Calibración de moduladores: - Rangos de LFO - Curvas de envelope - Depths musicales

05_level_calibration

Calibración de niveles: - Gain staging - Unity gain - Headroom management

06_latency_calibration

Medición y compensación de latencia: - Sample-accurate measurement - Phase-locked loops - Delay compensation

07_reference_matching

Matching de referencias: - Hardware emulation - Null test calibration - Component matching

08_psychoacoustic_calibration

Calibración perceptual: - Loudness calibration - Equal loudness curves - Masking-aware optimization

09_adaptive_calibration

Auto-calibración: - Continuous calibration - ML-based parameter prediction - User preference learning

10_standards_compliance

Conformidad con estándares: - AES17 audio measurement - EBU R128 loudness - ITU-R BS.1770

Optimization Algorithms

Gradient Descent

Para espacios de parámetros suaves: - Learning rate adaptativo - Momentum para convergencia más rápida - Backtracking line search

Genetic Algorithm

Para espacios complejos: - Tournament selection - Uniform crossover - Gaussian mutation

Particle Swarm

Para optimización rápida: - Swarm intelligence - Global y local best - Inertia weight

Multi-Objective (NSGA-II)

Para objetivos competing: - Pareto optimization - Crowding distance para diversidad - Elitism

Extension Points

Custom Calibrators

Inherit from CalibrationProcess:

class MyCustomCalibrator : public CalibrationProcess {
protected:
    bool prepare(CalibrationTarget& target) override {
        // Custom preparation
    }

    MeasuredResponse measure(CalibrationTarget& target) override {
        // Custom measurement
    }

    CalibrationResult optimize(/* ... */) override {
        // Custom optimization
    }

    bool validate(/* ... */) override {
        // Custom validation
    }

    void store(/* ... */) override {
        // Custom storage
    }
};

Custom Components

Implement ICalibratableComponent:

class MyComponent : public ICalibratableComponent {
public:
    std::string getComponentId() const override;
    void process(const float* input, float* output, size_t numSamples) override;
    void setParameter(const std::string& name, float value) override;
    float getParameter(const std::string& name) const override;
    // ... etc
};

Custom Objectives

Add to CalibrationSpecification:

CalibrationSpecification spec(TargetType::CUSTOM);
spec.idealResponse = computeCustomTarget();
spec.importance = 0.8f;

Performance Considerations

Measurement Speed

  • Log sweeps más rápidos que discrete tones
  • Averaging reduce noise pero aumenta tiempo
  • Cache resultados de mediciones idénticas

Optimization Speed

  • Gradient descent rápido pero puede quedar stuck
  • GA/PSO más robusto pero más lento
  • Multi-objetivo significativamente más costoso

Memory Usage

  • Response data puede ser grande (muchas frecuencias)
  • Population-based algorithms usan mucha memoria
  • Stream processing para señales largas

Error Handling

Component Errors

try {
    result = calibrator.calibrate(target);
} catch (const std::exception& e) {
    // Handle calibration failure
}

Convergence Failures

if (!result.success) {
    // Check result.notes for reason
    // Use best found parameters anyway?
}

Validation Failures

if (result.success && !calibrator.validate(target, result)) {
    // Calibration succeeded but validation failed
    // May indicate instability
}

Thread Safety

  • CalibrationProcess is NOT thread-safe
  • Each thread should have its own calibrator instance
  • Components should be thread-safe for parallel evaluation
  • Use mutex for shared resources (databases, files)

Future Enhancements

Planned Features

  • FFT-based frequency analysis
  • Phase measurement
  • Harmonic analysis
  • Noise floor measurement
  • Multi-channel calibration
  • Real-time calibration
  • Cloud-based calibration profiles
  • ML-based parameter prediction

Performance Improvements

  • Parallel evaluation in GA/PSO
  • GPU acceleration for FFT
  • Cache optimization
  • SIMD for signal processing

Usability Improvements

  • GUI for calibration visualization
  • Preset calibration profiles
  • Automatic component discovery
  • Calibration scheduling

References

Academic Papers

  • "Multi-Objective Optimization Using Evolutionary Algorithms" (Deb, 2001)
  • "A Fast Elitist Non-Dominated Sorting Genetic Algorithm: NSGA-II" (Deb et al., 2002)
  • "Audio Measurement Handbook" (Metzler, 2005)

Standards

  • AES17: Digital Audio Measurement
  • EBU R128: Loudness normalisation
  • ITU-R BS.1770: Loudness measurement
  • IEC 61606: Digital Audio Interfaces

Tools

  • Audio Precision APx series
  • QuantAsylum QA400 series
  • MATLAB Audio Toolbox
  • Python librosa, scipy.signal

Version: 1.0.0 Last Updated: 2025-10-14 Maintainer: AudioLab Team