Files
waveform-analysis/src/core/data.ts

60 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-07-20 10:21:30 +08:00
import type { SingleWaveformData, WaveformData, WaveformPoint, NormalizedWaveformSeries } from '../types'
/**
*
* @param data samples points
* @returns
*/
export function normalizeWaveformData(data: SingleWaveformData): WaveformPoint[] {
if (data.kind === 'samples') {
if (!Number.isFinite(data.sampleRate) || data.sampleRate <= 0) return []
const startTime = Number.isFinite(data.startTime) ? (data.startTime ?? 0) : 0
return data.values.flatMap((value, index) =>
Number.isFinite(value) ? [{ x: startTime + index / data.sampleRate, y: value }] : [],
)
}
return data.points
.filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y))
.map((point) => ({ ...point }))
.sort((left, right) => left.x - right.x)
}
/**
*
* @param data
* @returns
*/
export function normalizeWaveformSeries(data: WaveformData): NormalizedWaveformSeries[] {
if (data.kind !== 'series') {
const points = normalizeWaveformData(data)
return points.length > 0 ? [{ id: 'series-0', name: '', points }] : []
}
const usedIds = new Set<string>()
return data.series
.map((series, index) => {
const id = series.id?.trim() || `series-${index}`
// 确保 ID 唯一,如果重复则添加后缀
let uniqueId = id
let suffix = 1
while (usedIds.has(uniqueId)) {
uniqueId = `${id}-${suffix}`
suffix++
}
usedIds.add(uniqueId)
return {
id: uniqueId,
name: series.name,
unit: series.unit,
color: series.color,
points: normalizeWaveformData(series.data),
}
})
.filter((series) => series.points.length > 0)
}