🎯要点
- 同步时间序列数据
- 地震时频域信息
- 绘制地震噪声干涉图和频谱
- 计算光变曲线和时滞
- 互相关光变曲线并计算峰值和质心
- 图像几何对应关系算法
- 气候相关矩阵图
- 测量麦克风间距离
- 图像相似性量化及显着性统计测试
- 个体同步性量化分析
- 计算绘制有无泊松噪声的光曲线
- 地震幅度和时间检测
- 判别同类型音频信号
Python和MATLAB互相关
在信号处理中,互相关是对两个系列的相似性的度量,作为一个系列相对于另一个系列的位移的函数。这也称为滑动点积或滑动内积。它通常用于在长信号中搜索较短的已知特征。它在模式识别、单粒子分析、电子断层扫描、平均、密码分析和神经生理学方面有应用。互相关本质上类似于两个函数的卷积。在自相关(即信号与其自身的互相关)中,始终会在零滞后处出现峰值,其大小就是信号能量。
在概率和统计中,互相关是指两个随机向量 X X X和 Y Y Y的条目之间的相关性,而随机向量 X X X的相关性是 X X X本身的条目之间的相关性,那些形成 X X X的相关矩阵。如果 X X X 和 Y Y Y 中的每一个都是在时间序列中重复实现的标量随机变量,则 X X X 的各个时间实例的相关性称为 X X X 的自相关性,而互相关性称为 X X X 的自相关性 X X X 与 Y Y Y 随时间的变化是时间互相关。在概率和统计学中,相关性的定义始终包含标准化因子,使得相关性的值介于 -1 和 +1 之间。
显示了几个时间延迟的互相关的直观示例:
应用于:
- 相位噪声分析:未知振荡器的相位噪声测量通常会受到测量电子设备本身的附加噪声的限制。为了解决这一难题,可以将设备馈入两个不同的解调通道。对两个结果信号进行互相关分析可以消除由单独的本地振荡器添加的不相关噪声,同时保留相关噪声,这是感兴趣的数字。这样可以测量低于测量设备本身的相位噪声。
- 时间延迟估计:当两个相似信号在时间上匹配时,它们之间的互相关函数会产生幅度最大值。这一特性在确定雷达测量中的距离或飞行时间,或同步电信中的信号等应用中非常有用。
- 信号分析:使用互相关分析地震信号、雷达、声纳和其他信号。将传入信号与已知模板进行比较可以帮助检测低于噪声阈值的事件、提取信息或识别特定事件。
互相关数学
对于连续函数
f
f
f 和
g
g
g,互相关定义为:
(
f
⋆
g
)
(
τ
)
≜
∫
−
∞
∞
f
(
t
)
‾
g
(
t
+
τ
)
d
t
(f \star g)(\tau) \triangleq \int_{-\infty}^{\infty} \overline{f(t)} g(t+\tau) d t
(f⋆g)(τ)≜∫−∞∞f(t)g(t+τ)dt
等同于
(
f
⋆
g
)
(
τ
)
≜
∫
−
∞
∞
f
(
t
−
τ
)
‾
g
(
t
)
d
t
(f \star g)(\tau) \triangleq \int_{-\infty}^{\infty} \overline{f(t-\tau)} g(t) d t
(f⋆g)(τ)≜∫−∞∞f(t−τ)g(t)dt
其中
f
(
t
)
‾
\overline{f(t)}
f(t)表示
f
(
t
)
f(t)
f(t)的复共轭,
τ
\tau
τ称为位移或滞后。对于高度相关的
f
f
f 和
g
g
g,它们在特定的
τ
\tau
τ 处具有最大互相关性,
t
t
t 处的
f
f
f 中的特征稍后也会出现在
t
+
τ
t+\tau
t+τ 处的
g
g
g 中。
Python互相关方式
方式1:
import math
import random
t = [i * 0.1 for i in range(100)]
signal1 = [math.sin(2 * math.pi * 2 * i) + 0.5 * math.cos(2 * math.pi * 3 * i) + random.normalvariate(0, 0.1) for i in t]
signal2 = [math.sin(2 * math.pi * 2 * i) + 0.5 * math.cos(2 * math.pi * 3 * i) + random.normalvariate(0, 0.1) for i in t]
def mean(arr):
return sum(arr) / len(arr)
def cross_correlation(x, y):
x_mean = mean(x)
y_mean = mean(y)
numerator = sum((a - x_mean) * (b - y_mean) for a, b in zip(x, y))
x_sq_diff = sum((a - x_mean) ** 2 for a in x)
y_sq_diff = sum((b - y_mean) ** 2 for b in y)
denominator = math.sqrt(x_sq_diff * y_sq_diff)
correlation = numerator / denominator
return correlation
correlation = cross_correlation(signal1, signal2)
print('Correlation:', correlation)
输出:
Manual Correlation: 0.9837294963190838
方式2:
import numpy as np
t = np.arange(0, 10, 0.1)
signal1 = np.sin(2 * np.pi * 2 * t) + 0.5 * np.cos(2 * np.pi * 3 * t) + np.random.normal(0, 0.1, len(t))
signal2 = np.sin(2 * np.pi * 2 * t) + 0.5 * np.cos(2 * np.pi * 3 * t) + np.random.normal(0, 0.1, len(t))
numpy_correlation = np.corrcoef(signal1, signal2)[0, 1]
print('NumPy Correlation:', numpy_correlation)
NumPy Correlation: 0.9796920509627758
方式3:
import numpy as np
t = np.arange(0, 10, 0.1)
signal1 = np.sin(2 * np.pi * 2 * t) + 0.5 * np.cos(2 * np.pi * 3 * t) + np.random.normal(0, 0.1, len(t))
signal2 = np.sin(2 * np.pi * 2 * t) + 0.5 * np.cos(2 * np.pi * 3 * t) + np.random.normal(0, 0.1, len(t))
from scipy.stats import pearsonr
scipy_correlation, _ = pearsonr(signal1, signal2)
print('SciPy Correlation:', scipy_correlation)
SciPy Correlation: 0.9865169592702046
MATLAB互相关方式
n = 0:15;
x = 0.84.^n;
y = circshift(x, 5);
[c, lags] = xcorr(x, y);
figure;
stem(lags, c);
title('Cross-Correlation of x and y');
xlabel('Lag');
ylabel('Cross-Correlation');
lags = -15:15
c = [0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]
MATLAB计算相关系数
x = randn(100, 1);
y = 2 * x + randn(100, 1);
R = corrcoef(x, y);
disp('Correlation Coefficient Matrix:');
disp(R);
Correlation Coefficient Matrix:
1.0000 0.8945
0.8945 1.0000