Numpy Correlate没有提供补偿

Numpy Correlate没有提供补偿,第1张

Numpy Correlate没有提供补偿

您遇到的问题可能是因为您的光谱不是零中心的。无论您以哪种单位绘制,其RMS值均约为100。之所以这样,是因为卷积/互相关函数必须 在频谱上填充零
,以便在“相同”模式下计算出完整的响应。因此,即使您的信号与50个样本之间的偏移量最相似,但当两个信号没有完全对齐时,您将仅对其重叠量进行乘积积分,并丢弃所有偏移量值,因为它们乘以零。这是有问题的,因为您的频谱不是零均值的,并且它们的相关性在重叠中几乎呈线性增加。

请注意,您的互相关结果看起来像一个三角形脉冲,这是您从两个方形脉冲的互相关中所期望的结果(请 参见
矩形“脉冲”与其自身的卷积。这是因为一旦填充后的光谱看起来像一个从零到大约100的高噪声值脉冲的阶跃函数-
有效地是矩形脉冲与高斯噪声的卷积,您可以尝试对其进行卷积

mode='full'
以查看正在相关的两个光谱的整个响应,或者这样一来
mode='valid'
,您应该只获得
一个值 作为回报,因为您的两个光谱长度完全相同,因此只有 一个偏移量 (零!),您可以将它们完全对齐。

要回避此问题,您可以尝试减去频谱的RMS值以使它们处于零中心,或者尝试将两个频谱的长度都填充在任一侧的RMS值中。

编辑 :针对您在评论中的问题,我想我会附上一张图表,以使我想更清楚地描述这一点。

假设我们有两个值向量,与您的频谱并不完全不同,每个向量都与零有较大的偏移量。

# Generate two noisy, but correlated seriest = np.linspace(0,250,250)f = 10*np.exp(-((t-90)**2)/8) + np.random.randn(250) + 40g = 10*np.exp(-((t-180)**2)/8) + np.random.randn(250) + 40

f 在t = 90附近有一个尖峰,而 g 在t = 180附近有一个尖峰。因此,我们期望 gf
相关性在90个时间步长的滞后周围会出现一个尖峰(或频率仓,或您要关联的函数的任何自变量)。

但是为了得到一个输出是相同的形状,我们的投入,如

np.correlate(g,f,mode='same')
,我们以“垫”
与在零一半的长度两侧(默认情况下,你可以与其他值垫)。如果我们 不要t 填充 g (如所示),因为 fg
的长度相同,并且没有空间将一个信号相对于另一个移位,所以
np.correlate(g,f,mode='valid')
我们只会得到 一个
值作为回报(零偏移的相关性)。

在填充之后计算 gf 的相关性时,您会发现当信号 的非零 部分完全对齐时,即原始 fg 之间 没有偏移
时,它达到峰值。这是因为信号的RMS值远高于零 -fg 重叠的大小 __
__与在每个RMS周围具有相对较小的波动相比,在此较高RMS级别上重叠的元素数量要更重要。
我们可以通过从每个序列中减去RMS水平来消除对相关性的巨大贡献。在下图中,右侧的灰线显示了零位居中之前两个序列的互相关,而蓝绿色线显示了之后的互相关。像您第一次尝试一样,灰线是三角形的,两个非零信号重叠。如我们所愿,蓝绿色线更好地反映了两个信号波动之间的相关性。

xcorr = np.correlate(g,f,'same')xcorr_rms = np.correlate(g-40,f-40,'same')fig, axes = plt.subplots(5,2,figsize=(18,18),gridspec_kw={'width_ratios':[5,2]})for n, axis in enumerate(axes):    offset = (0,75,125,215,250)[n]    fp = np.pad(f,[offset,250-offset],mode='constant',constant_values=0.)    gp = np.pad(g,[125,125],mode='constant',constant_values=0.)    axis[0].plot(fp,color='purple',lw=1.65)    axis[0].plot(gp,color='orange',lw=lw)    axis[0].axvspan(max(125,offset),min(375,offset+250),color='blue',alpha=0.06)    axis[0].axvspan(0,max(125,offset),color='brown',alpha=0.03)    axis[0].axvspan(min(375,offset+250),500,color='brown',alpha=0.03)    if n==0:        axis[0].legend(['f','g'])    axis[0].set_title('offset={}'.format(offset-125))    axis[1].plot(xcorr/(40*40),color='gray')    axis[1].plot(xcorr_rms,color='teal')    axis[1].axvline(offset,-100,350,color='maroon',lw=5,alpha=0.5)    if n == 0:        axis[1].legend(["$g star f$","$g' star f'$","offset"],loc='upper left')plt.show()


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5674713.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存