说明¶
相关 — 信号相似度随位移的变化
衡量两个信号的相似度。与卷积的区别:相关不翻转核。
算法原理¶
滑动相关(模板匹配)¶
\[ y[n] = \sum_{k=0}^{M-1} p[k] \cdot s[n + k], \quad n = 0, \dots, L-M \]
模板 \(p\)(长 \(M\))滑过信号 \(s\)(长 \(L\)),各位置点乘。输出长 \(L-M+1\)。
应用:模板匹配、模式识别、峰值位置对应最佳匹配偏移。
完全互相关(信号对齐)¶
\[ y[n] = \sum_{k=0}^{L-1} s[k] \cdot t[n + k], \quad n = -(L-1), \dots, L-1 \]
输出长 \(2L-1\)(双边)。峰值位置 = 两信号的时延估计。
应用:信号对齐、延时估计、DOA 估计。
相关 vs 卷积
| 相关 | 卷积 | |
|---|---|---|
| 核 | 不翻转 | 翻转 |
| 含义 | 相似度 vs 位移 | 系统响应 vs 时间 |
| 交换律 | 不满足 | 满足 |
FFT 加速
长序列的互相关可借助 FFT:\(\text{corr}(s, t) = \text{IFFT}(\text{FFT}(s) \cdot \overline{\text{FFT}(t)})\)
自相关检测周期性
信号与自身的互相关,峰值在延迟 0 处,后续峰值间距 = 周期。
API 参考¶
// 滑动相关(模板匹配)
tiny_error_t tiny_corr_f32(const float *Signal, int siglen,
const float *Pattern, int patlen,
float *corrout);
// 完全互相关(信号对齐)
tiny_error_t tiny_ccorr_f32(const float *Signal, int siglen,
const float *Pattern, int patlen,
float *corrout);
注意事项¶
输出缓冲区大小
滑动相关:\(L - M + 1\);完全互相关:\(L + M - 1\)。
\(siglen < patlen\) 怎么办?
滑动相关要求 \(L \geq M\),否则合理输出为空。完全互相关无此限制。
相关 ≠ 卷积
两个操作数学上只差一个符号:\(\text{corr}(s, p)[n] = \text{conv}(s, p_{\text{flipped}})[n]\)。不要混用。