fix: expose physical aliasing and delayed arrivals

This commit is contained in:
2026-08-29 10:21:33 +09:00
parent e048ccbadc
commit de0053eae3
38 changed files with 3086 additions and 214 deletions
+131 -8
View File
@@ -5,11 +5,11 @@
"type": "object",
"additionalProperties": false,
"required": [
"schemaVersion", "kind", "experimentId", "arrayId", "sceneId", "createdAt", "backend",
"schemaVersion", "kind", "experimentId", "arrayId", "sceneId", "createdAt", "algorithm", "backend",
"inputHash", "signalStats", "timingMs", "bands"
],
"properties": {
"schemaVersion": { "const": "1.0.0" },
"schemaVersion": { "const": "1.1.0" },
"kind": { "const": "micarrsim.result" },
"experimentId": { "type": "string", "minLength": 1 },
"arrayId": { "type": "string", "minLength": 1 },
@@ -20,7 +20,7 @@
"inputHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
"signalStats": {
"type": "object", "additionalProperties": false,
"required": ["preNormalizationPeak", "appliedScale", "clippedSampleCount"],
"required": ["preNormalizationPeak", "appliedScale", "clippedSampleCount", "sampling"],
"properties": {
"preNormalizationPeak": { "type": "number", "minimum": 0 },
"appliedScale": { "type": "number", "minimum": 0 },
@@ -36,11 +36,13 @@
"diffraction": { "type": "integer", "minimum": 0 },
"diffuse": { "type": "integer", "minimum": 0 }
}
}
},
"sampling": { "$ref": "#/$defs/sampling" }
}
},
"timingMs": {
"type": "object", "additionalProperties": false, "required": ["total", "beamforming"],
"type": "object", "additionalProperties": false,
"required": ["total", "localization", "beamforming"],
"properties": {
"total": { "type": "number", "minimum": 0 },
"signalGeneration": { "type": "number", "minimum": 0 },
@@ -60,6 +62,123 @@
"prefixItems": [{ "type": "number" }, { "type": "number" }, { "type": "number" }],
"items": false, "minItems": 3, "maxItems": 3
},
"sampling": {
"type": "object", "additionalProperties": false,
"required": ["model", "sampleRate", "nyquistHz", "toneObservations"],
"properties": {
"model": { "const": "ideal-real-sampler-no-antialias-filter" },
"sampleRate": { "type": "integer", "minimum": 8000, "maximum": 192000 },
"nyquistHz": { "type": "number", "exclusiveMinimum": 0 },
"toneObservations": {
"type": "array", "maxItems": 64,
"items": {
"type": "object", "additionalProperties": false,
"required": [
"scope", "id", "analogFrequencyHz", "adcFrequencyHz",
"signedAdcFrequencyHz", "aliased", "spectralInversion", "dcEdge",
"nyquistEdge", "phaseDegenerate"
],
"properties": {
"scope": { "enum": ["source", "ambient"] },
"id": { "type": "string", "minLength": 1 },
"analogFrequencyHz": {
"type": "number", "exclusiveMinimum": 0, "maximum": 1000000
},
"adcFrequencyHz": { "type": "number", "minimum": 0 },
"signedAdcFrequencyHz": { "type": "number" },
"aliased": { "type": "boolean" },
"spectralInversion": { "type": "boolean" },
"dcEdge": { "type": "boolean" },
"nyquistEdge": { "type": "boolean" },
"phaseDegenerate": { "type": "boolean" }
}
}
}
}
},
"frequencyObservation": {
"type": "object", "additionalProperties": false,
"required": [
"model", "sampleRate", "nyquistHz", "fftSize", "binWidthHz",
"requestedMinHz", "requestedMaxHz", "aliased", "crossesFirstNyquist",
"localizationInputModel", "selectionModel", "localizationModel", "originalCarrierUsed",
"aliasOrderResolution", "foldBoundaryCount", "continuousManyToOne",
"gridManyToOne", "foldSegments", "adcBins",
"adcBinCenterRanges", "adcBinSetKey", "equivalentBandIds"
],
"properties": {
"model": { "const": "ideal-real-sampler-no-antialias-filter" },
"sampleRate": { "type": "integer", "minimum": 8000, "maximum": 192000 },
"nyquistHz": { "type": "number", "exclusiveMinimum": 0 },
"fftSize": { "enum": [128, 256, 512, 1024, 2048, 4096] },
"binWidthHz": { "type": "number", "exclusiveMinimum": 0 },
"requestedMinHz": { "type": "number", "minimum": 0, "maximum": 1000000 },
"requestedMaxHz": {
"type": "number", "exclusiveMinimum": 0, "maximum": 1000000
},
"aliased": { "type": "boolean" },
"crossesFirstNyquist": { "type": "boolean" },
"localizationInputModel": { "const": "observed-one-sided-real-fft-bins" },
"selectionModel": { "const": "fft-bin-center-membership" },
"localizationModel": {
"enum": [
"spherical-steering-at-positive-adc-bin-frequency",
"band-limited-gcc-phat-geometric-lag"
]
},
"originalCarrierUsed": { "const": false },
"aliasOrderResolution": { "enum": ["not-applicable", "not-attempted"] },
"foldBoundaryCount": { "type": "integer", "minimum": 0, "maximum": 512 },
"continuousManyToOne": { "type": "boolean" },
"gridManyToOne": { "type": "boolean" },
"foldSegments": {
"type": "array", "minItems": 1, "maxItems": 513,
"items": { "$ref": "#/$defs/foldSegment" }
},
"adcBins": {
"type": "array", "minItems": 1, "maxItems": 2049, "uniqueItems": true,
"items": { "type": "integer", "minimum": 0, "maximum": 2048 }
},
"adcBinCenterRanges": {
"type": "array", "minItems": 1, "maxItems": 2049,
"items": {
"type": "object", "additionalProperties": false,
"required": [
"firstBin", "lastBin", "firstBinCenterHz", "lastBinCenterHz"
],
"properties": {
"firstBin": { "type": "integer", "minimum": 0, "maximum": 2048 },
"lastBin": { "type": "integer", "minimum": 0, "maximum": 2048 },
"firstBinCenterHz": { "type": "number", "minimum": 0 },
"lastBinCenterHz": { "type": "number", "minimum": 0 }
}
}
},
"adcBinSetKey": { "type": "string", "minLength": 1, "maxLength": 16384 },
"equivalentBandIds": {
"type": "array", "maxItems": 7, "uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
}
}
},
"foldSegment": {
"type": "object", "additionalProperties": false,
"required": [
"analogMinHz", "analogMaxHz", "signedAdcStartHz", "signedAdcEndHz",
"inverted", "aliasOrder", "nyquistZone"
],
"properties": {
"analogMinHz": { "type": "number", "minimum": 0, "maximum": 1000000 },
"analogMaxHz": {
"type": "number", "exclusiveMinimum": 0, "maximum": 1000000
},
"signedAdcStartHz": { "type": "number" },
"signedAdcEndHz": { "type": "number" },
"inverted": { "type": "boolean" },
"aliasOrder": { "type": "integer", "minimum": 0 },
"nyquistZone": { "type": "integer", "minimum": 1 }
}
},
"map": {
"type": "object", "additionalProperties": false,
"required": ["rows", "columns", "scale", "values"],
@@ -132,7 +251,7 @@
"required": [
"version", "truthRadiusM", "matchToleranceM", "detectionThresholdRatio",
"detectionThresholdValue", "minimumPeakDistanceM", "sidelobeExclusionRadiusM",
"halfPowerRatio", "dynamicRangeDb", "maximumDetections"
"halfPowerRatio", "dynamicRangeDb", "maximumDetections", "truthSelection"
],
"properties": {
"version": { "const": "1.0.0" },
@@ -147,7 +266,10 @@
"sidelobeExclusionRadiusM": { "type": "number", "minimum": 0 },
"halfPowerRatio": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 },
"dynamicRangeDb": { "type": "number", "minimum": 0 },
"maximumDetections": { "type": "integer", "minimum": 1, "maximum": 128 }
"maximumDetections": { "type": "integer", "minimum": 1, "maximum": 128 },
"truthSelection": {
"const": "tone-analog-interval-or-nearest-adc-bin-and-all-nontone-sources"
}
}
},
"processedMap": {
@@ -159,12 +281,13 @@
},
"bandResult": {
"type": "object", "additionalProperties": false,
"required": ["id", "color", "rawMap", "peaks", "metrics"],
"required": ["id", "color", "rawMap", "frequencyObservation", "peaks", "metrics"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
"rawMap": { "$ref": "#/$defs/map" },
"displayMap": { "$ref": "#/$defs/map" },
"frequencyObservation": { "$ref": "#/$defs/frequencyObservation" },
"evaluation": { "$ref": "#/$defs/evaluation" },
"processedMaps": { "type": "array", "maxItems": 8, "items": { "$ref": "#/$defs/processedMap" } },
"peaks": { "type": "array", "maxItems": 128, "items": { "$ref": "#/$defs/peak" } },