fix: expose physical aliasing and delayed arrivals
This commit is contained in:
+8
-3
@@ -9,11 +9,16 @@ JSON Schema Draft 2020-12 형식입니다.
|
||||
- `experiment.schema.json`: scan plane/grid, 주파수 대역, STFT/DAS와 peak 검출 임계값
|
||||
- `result.schema.json`: raw/display/후처리 map, 복수 peak, 비확률 beam spread, timing과 평가 지표
|
||||
|
||||
마이크 주파수 응답점은 배열 계약 자체이므로 특정 Scene의 Nyquist와 결합하지 않고 0~1 MHz의
|
||||
안전 범위에서 엄격한 오름차순을 요구합니다. 실제 분석에서는 선택한 Scene/STFT의 bin 주파수만
|
||||
보간합니다. 중복 id, Nyquist, 시간 구간과 참조 무결성은
|
||||
마이크 주파수 응답점과 Scene tone·Experiment band는 특정 Scene의 Nyquist에서 자르지 않고
|
||||
0~1 MHz의 명시적 수치/마이크 모델 검증 범위를 사용합니다. Tone 합성에서는 원 analog 주파수,
|
||||
sampled asset 분석에서는 선택한 Scene/STFT의 baseband bin 주파수로 보간합니다. 중복 id,
|
||||
sampling alias mapping,
|
||||
시간 구간과 참조 무결성은
|
||||
`packages/contracts/validation.js`에서 추가로 검증합니다.
|
||||
|
||||
Array·Scene·Experiment는 1.0.0, sampling provenance와 band별 fold/localization metadata를
|
||||
필수화한 Result는 1.1.0입니다. Result 1.0을 묵시적으로 변환하지 않습니다.
|
||||
|
||||
Scene `acoustics`는 기본 `free-field` 또는 `shoebox`입니다. shoebox는 room bounds, 0/1차
|
||||
반사와 scattering 비율, bounded diffuse tail, 최대 8개의 AABB occluder를 저장합니다.
|
||||
room·occluder의 각 축은 `min < max`여야 하고 source/trajectory와 occluder는 room 안에
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"type": "object", "additionalProperties": false, "required": ["id", "minHz", "maxHz", "color"],
|
||||
"properties": {
|
||||
"id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$" },
|
||||
"minHz": { "type": "number", "minimum": 0 }, "maxHz": { "type": "number", "exclusiveMinimum": 0 },
|
||||
"minHz": { "type": "number", "minimum": 0, "maximum": 1000000 },
|
||||
"maxHz": { "type": "number", "exclusiveMinimum": 0, "maximum": 1000000 },
|
||||
"color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }
|
||||
}
|
||||
}
|
||||
|
||||
+131
-8
@@ -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" } },
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
"signal": {
|
||||
"oneOf": [
|
||||
{ "type": "object", "additionalProperties": false, "required": ["type", "frequency"], "properties": {
|
||||
"type": { "const": "tone" }, "frequency": { "type": "number", "exclusiveMinimum": 0 },
|
||||
"type": { "const": "tone" }, "frequency": { "type": "number", "exclusiveMinimum": 0, "maximum": 1000000 },
|
||||
"phaseDeg": { "type": "number", "minimum": -360, "maximum": 360 }
|
||||
}},
|
||||
{ "type": "object", "additionalProperties": false, "required": ["type", "color"], "properties": {
|
||||
|
||||
Reference in New Issue
Block a user