UNPKG

@rfkit/spectrum-analyzer

Version:

A high-performance spectrum analyzer library for RF signal processing, supporting real-time spectrum analysis, waterfall display, and multi-segment frequency scanning

252 lines 11.1 kB
import type { isValidFloat32Array, ProcessInput, ProcessingOptions, ScanSegment, SpectrumConfig, SpectrumOutputData, TemplateOverData, TimestampedFloat32Array } from './types'; import { ExtraDataMode } from './types'; export default class SpectrumAnalyzer { config: Required<Omit<SpectrumConfig, 'segments' | 'bandwidthConfig' | 'onSpectrumUpdate'>>; private segments; antennaFactorData: Float32Array; antennaFactorSwitch: boolean; protected realData: TimestampedFloat32Array; protected maxData: isValidFloat32Array; protected minData: isValidFloat32Array; protected avgData: isValidFloat32Array; protected templateData: Float32Array; protected occupancyData: Float32Array; protected backgroundNoiseData: Float32Array; protected waterfallData: TimestampedFloat32Array[]; srcIndexCache: Uint32Array; protected realOutputData: Float32Array; protected maxOutputData: Float32Array; protected minOutputData: Float32Array; protected avgOutputData: Float32Array; protected templateOutputData: Float32Array; protected occupancyOutputData: Float32Array; protected backgroundNoiseOutputData: Float32Array; protected waterfallOutputData: TimestampedFloat32Array[]; protected scanProgress: number; protected lastIndex: number; protected processTimes: number; protected lastProcessTime: number; protected cachedExceedingDatas: TemplateOverData[]; protected fluorescenceData: Uint32Array; protected fluorescenceMaxCount: number; protected fluorescenceUpdateCounter: number; extraData: Record<string, Float32Array>; protected extraOutputData: Record<string, Float32Array>; private pendingDataFlags; private hasPendingData; private hasProcessedData; private isProcessing; private readonly onSpectrumUpdate?; constructor(config: Partial<SpectrumConfig>); /** * 处理输入数据,包括验证、拼接、统计、采样等操作。 * @param {ProcessInput} input - 输入数据,包含数据、时间戳、分段偏移和偏移量。 */ process({ data, timestamp, segmentOffset, offset, fluorescenceData, fluorescenceMaxCount }: ProcessInput): void; /** * 初始化扫描分段信息,并更新最大点数。 * @param {ScanSegment[]} segments - 扫描分段信息数组。 */ initializeSegments(segments: ScanSegment[]): void; /** * 设置天线因子数据,并根据开关状态重新输出数据。 * @param {Float32Array} data - 天线因子数据,默认为根据最大点数创建的数组。 */ setAntennaFactor(d: Float32Array | number[]): void; /** * 设置天线因子开关,并根据开关状态重新输出数据。 * @param {boolean} newAntennaFactorSwitch - 新的天线因子开关状态。 */ setAntennaFactorSwitch(newAntennaFactorSwitch: boolean): void; /** * 动态更新处理选项 * @param {Partial<ProcessingOptions>} next - 要更新的处理选项 * * 语义: * - enableMetrics 从 false→true 后从后续帧开始累计;true→false 立即停止累计 * - enableFluorescence 同理 * - enablePeakStats 同理,控制峰值检测开关 * * 注意:此方法会进行浅比较,只有值真正变化时才会更新配置和通知数据更新。 */ updateProcessing(next: Partial<ProcessingOptions>): void; /** * 清空统计指标数据 (Max/Min/Avg) * 将相关数组重置为初始值,并通知更新。 */ clearMetricsData(): void; /** * 初始化 metrics 缓冲区(max/min/avg 及其输出缓存)。 * 仅负责分配内存,不负责填充初始值。 */ private allocateMetricsBuffers; /** * 清空 metrics 缓冲区(max/min/avg 及其输出缓存),并重置 allValid 标记。 * 不会调整数组长度。 */ private clearMetricsBuffers; /** * 设置瀑布图数据,用于从外部导入已缓存的瀑布图数据。 * @param {TimestampedFloat32Array[]} data - 瀑布图数据数组。 */ setWaterfallData(newWaterfallData: TimestampedFloat32Array[]): void; /** * 设置荧光累积数据,用于传入预先计算好的荧光累积数据。 * @param {Uint32Array} fluorescenceData - 荧光累积数据 * @param {number} fluorescenceMaxCount - 荧光数据中的最大计数值 */ setFluorescenceData(fluorescenceData: Uint32Array, fluorescenceMaxCount: number): void; /** * 设置实时值数据,用于从外部导入已缓存的实时值数据。 * @param {TimestampedFloat32Array} data - 实时值数据。 */ setRealData(data: TimestampedFloat32Array): void; /** * 设置最大值数据,用于从外部导入已缓存的最大值数据。 * @param {Float32Array} data - 最大值数据。 */ setMaxData(data: Float32Array): void; /** * 设置最小值数据,用于从外部导入已缓存的最小值数据。 * @param {Float32Array} data - 最小值数据。 */ setMinData(data: Float32Array): void; /** * 设置平均值数据,用于从外部导入已缓存的平均值数据。 * @param {Float32Array} data - 平均值数据。 */ setAvgData(data: Float32Array): void; /** * 设置占用度数据 * @param {Float32Array | number[]} data - 占用度数据 */ setOccupancyData(data?: Float32Array | number[]): void; /** * 重置频谱分析器的状态,包括数据和进度。 */ /** * 设置额外数据 * @param data 数据对象 * @param mode 操作模式:ExtraDataMode.REPLACE(替换全部), ExtraDataMode.MERGE(合并), ExtraDataMode.UPDATE(更新已存在的键) */ setExtraData(data: Record<string, Float32Array | number[]> | null, mode?: ExtraDataMode): void; reset(preserveProcessedFlag?: boolean): void; /** * 获取频谱分析器的性能指标,包括处理时间、数据点数、瀑布图帧数、初始化状态和内存使用情况。 * @returns {Readonly<Record<string, number | boolean>>} - 包含性能指标的对象。 */ getPerformanceMetrics(): Readonly<Record<string, number | boolean>>; /** * 获取当前实时数据的峰值统计信息 * @returns {PeakStats | undefined} - 峰值统计信息,如果未启用峰值检测则返回 undefined */ getPeakStats(): import('./types').PeakStats | undefined; /** * 更新采样范围,并重新输出数据。 * @param {number} start - 采样范围的起始位置。 * @param {number} end - 采样范围的结束位置。 * @returns {Uint32Array} - 输出值对应的原始数据索引数组。 */ updateSamplingRange(start: number, end: number): Uint32Array; /** * 设置模板数据 * @param {Float32Array | number[]} data - 模板数据 * @param {number} templateTolerance - 可选,模板超出计算的容差值 */ setTemplateData(data?: Float32Array | number[], templateTolerance?: number): void; /** * 设置背景噪声数据 * @param {Float32Array | number[]} data - 背景噪声数据 */ setBackgroundNoiseData(data?: Float32Array | number[]): void; /** * 统一的超出数据段计算和缓存更新方法 * @param forceFullCalculation - 是否强制进行全量计算 * @param incrementalRange - 增量计算的范围 * @returns 计算得到的超出数据段 */ private updateTemplateOverData; /** * 对数据进行重采样,生成频谱输出数据。 * @returns {Partial<SpectrumOutputData>} - 包含重采样后的实时数据、最大值、最小值和平均值的对象。 */ protected resampleDataSeries(): Partial<SpectrumOutputData>; /** * 处理 extraData 的重采样,生成 extraOutputData * 利用现有的 srcIndexCache 进行高效重采样 */ /** * 对瀑布图输出数据进行重采样。 */ protected resampleWaterfallOutputData(): void; /** * 更新瀑布图数据,包括添加新数据和移除旧数据。 * @param {TimestampedFloat32Array} data - 输入的实时数据。 * @param {TimestampedFloat32Array} outputData - 输出的实时数据。 */ protected updateWaterfallData(data: TimestampedFloat32Array, outputData: TimestampedFloat32Array): void; /** * 更新最大点数,并重置。 * @param {number} maxPoints - 新的最大点数。 */ protected updateMaxPoints(maxPoints: number): void; /** * 验证输入数据的索引是否在有效范围内。 * @param {Float32Array} data - 输入数据。 * @param {number} index - 数据的起始索引。 */ protected validateInput(data: Float32Array, index: number): void; /** * 统计计算,处理数据点,更新统计值(最大值、最小值、平均值)。 * @param {Float32Array} data - 输入数据。 * @param {number} index - 数据的起始索引。 * @param {boolean} isOver - 数据是否处理完成。 */ private processDataPoints; /** * 更新荧光谱统计数据 */ private updateFluorescenceStats; /** * 设置待处理标记并更新快速检查标记 */ private setPendingFlag; /** * 重采样单个数据数组(统一的重采样逻辑,避免代码重复) */ private resampleSingleData; /** * 处理待处理的数据(在 srcIndexCache 生成后) * 用于解决数据设置和实时数据处理的时序问题 */ private processPendingData; /** * 通知频谱数据更新,调用回调函数。 * @param {SpectrumOutputData} processedData - 处理后的频谱数据。 */ private notifySpectrumUpdate; /** * 计算当前频谱分析器的内存使用情况。 * @returns {number} - 内存使用量(字节)。 */ private calculateMemoryUsage; /** * 获取输出数据,根据配置的输出范围截取数据。 * @param {TimestampedFloat32Array} [data] - 可选的输入数据,默认为实时数据。 * @returns {Readonly<TimestampedFloat32Array>} - 输出数据。 */ private getOutputData; /** * 获取指定范围的荧光谱数据。 * @param {Map<number, number>[] | undefined} data - 荧光谱数据,如果未提供则使用实例的荧光谱数据。 * @returns {Map<number, number>[] | undefined} - 输出范围内的荧光谱数据。 */ private getFluorescenceOutputData; /** * 获取所有原始数据,包括实时数据、最大值、最小值、平均值、模板数据、背景噪声数据和瀑布图数据。 * 注意:返回的是输出数据(重采样后),而不是输入数据。 * 返回的 realData 长度为 outputPoints,与 peaks 的 index 范围一致。 */ getAllRawData(): Readonly<SpectrumOutputData>; } //# sourceMappingURL=index.d.ts.map