AcousticDebugFrame.java

package org.hammer.audio.experimental.acoustic.visualization;

import java.util.List;
import org.hammer.audio.experimental.acoustic.AcousticLocalizationSnapshot;
import org.hammer.audio.experimental.acoustic.DelayAndSumBeamformer.BeamformingPoint;
import org.hammer.audio.experimental.acoustic.TdoaEstimate;
import org.hammer.audio.geometry.Vector2;

/** UI-agnostic debug model for spectrogram, geometry, heatmap and TDOA renderers. */
public record AcousticDebugFrame(
    long sourceFrameIndex,
    double trackedFrequencyHz,
    Vector2 estimatedPositionMeters,
    List<TdoaEstimate> tdoaEstimates,
    List<BeamformingPoint> heatmap) {

  /** Create a debug frame from an analysis snapshot. */
  public static AcousticDebugFrame from(AcousticLocalizationSnapshot snapshot) {
    return new AcousticDebugFrame(
        snapshot.sourceFrameIndex(),
        snapshot.trackedFrequency().frequencyHz(),
        snapshot.estimatedPositionMeters(),
        snapshot.tdoaEstimates(),
        snapshot.heatmap());
  }

  /** Create an immutable debug frame. */
  public AcousticDebugFrame {
    if (estimatedPositionMeters == null) {
      throw new IllegalArgumentException("estimatedPositionMeters must not be null");
    }
    tdoaEstimates = List.copyOf(tdoaEstimates);
    heatmap = List.copyOf(heatmap);
  }
}