嵌入式相关函数

信息处理 C 互相关
2022-02-19 22:33:20

我正在尝试在嵌入式设备上编写相关函数。因为它是嵌入式的,所以我需要确保内存/CPU 使用率最低。

这是交易: - 我有一个以 1 MHz 采样的已保存波形 - 我有波形的时序信息 - 我将采用新的时序信息以 200 kHz 拍摄一个新波形 - 两种波形的时序信息都是可比的其中从零开始 - 我想确定一个波形与下一个波形之间的延迟,精确到 1 us。

我打算使用的方法是: - 找到每个波形的最大值(每个波形中应该只有 1 个峰值,并且它们应该匹配) - 设置每个数组的索引,以便波形的最大值匹配向上。为了做到这一点,我将节省我正在移动的时钟周期数量。- 然后我将关联这个并在每个方向移动几个样本并关联。最高的相关值对应于正确的延迟量,我会保留这个值。

问题是我的阵列操作技能有限。我在尝试实现这个算法时很挣扎,特别是因为其中一个波形的采样率是另一个波形的 5 倍。有没有人对此有任何参考或知道我如何轻松实现这一目标?

我遇到的具体问题是: - 如何以不同方式设置索引以使最大值匹配?我不想写一个新的寄存器,因为这会占用内存并且在读/写周期方面需要很长时间。- 如何补偿不同的采样频率?我可以用零填充 200 kHz 波形(这不会影响相关性),但这会占用更多内存而没有实际用途。- 时间信息不准确,因为它们不一定完全对齐。例如,1MHz 信号的时序编号“10000、10020、10040、10060、10080 和 10100”不一定与 200 kHz 信号的“10000、10100”匹配。所以我不能很容易地依赖使用计时数字作为索引。

如果我的要求不是很清楚,我可以尝试对请求进行一些修饰,但我不希望这太长。

1个回答

您尝试分析的信号有多快?您可以处理的最大理论频率将是 100KHz(采样率 / 2)。使用 1MHz 的采样率是不可能给出具有 1 微秒分辨率的“真实”答案的。实际上,这可能无关紧要。

如果没有具体的时间限制,很难给出一个好的答案。为了让您的信号具有相同的采样率,您可以在慢速数据点之间进行线性插值或平均快速数据。

我建议平均你的快速数据。如果您正在处理来自 ADC 的计数,将 5 个快速样本相加并除以 5 会很快。您的编译器可能会使用倒数乘法来避免除法运算。

尝试根据单个峰值排列信号可能会给出不正确的结果。另一种方法是维护一个辅助阵列,其中存储了 N 个最高峰的选择。不要简单地得到N个最大的点;它们可能会聚集在一起,不会产生好的结果。而是跟踪最大点并且不允许出现新峰值,除非信号已降至某个阈值以下(例如峰值的 90%)以引入滞后。应根据数据的形状和所需的置信水平以及内存和 CPU 时间来选择确切的峰值数量。

为了匹配峰,扫描第二个数据集,保持最佳拟合偏移。当您找到可能与第一个峰值匹配的值(某个容差范围内的值)时,您可以比较“未来”峰值。为 N 个峰值点找到误差最小的偏移量并不太麻烦 (sqrt((x_1 - xbar)^2 + ... (x_n - xbar)^2))。

这可以通过每个数据集仅通过一次即可完成,仅需要额外的内存作为保持 N 个峰值点的辅助阵列。