J'ai écrit un code Python pour émuler MATLABs fonction xcorr
des corrélations croisées:Python normalisant 1D croix corrélation
def xcorr(x, y, scale='none'):
# Pad shorter array if signals are different lengths
if x.size > y.size:
pad_amount = x.size - y.size
y = np.append(y, np.repeat(0, pad_amount))
elif y.size > x.size:
pad_amount = y.size - x.size
x = np.append(x, np.repeat(0, pad_amount))
corr = np.correlate(x, y, mode='full') # scale = 'none'
lags = np.arange(-(x.size - 1), x.size)
if scale == 'biased':
corr = corr/x.size
elif scale == 'unbiased':
corr /= (x.size - abs(lags))
elif scale == 'coeff':
corr /= np.sqrt(np.dot(x, x) * np.dot(y, y))
Je reçois les mêmes valeurs lorsque l'on compare les valeurs des différents types d'échelle pour la mise en œuvre de MATLABs, donc cela semble correct
Une chose supplémentaire que je voudrais ajouter est la capacité de normaliser les valeurs de corrélation croisée si les pics ne dépassent pas 1.0
, et les vallées DonT descendre en dessous -1.0
coeff
est déjà normalisé, donc je ne suis pas inquiet à ce sujet. Cependant, les autres types d'échelle peuvent dépasser les limites -1/1.
J'ai essayé deux choses:
- Ajout
corr /= max(corr)
à la fin de ma fonction de normalisercorr
quelle que soit l'option choisie est échelle. Cela permet de maintenir la borne supérieure en échec, mais je ne suis pas sûr que cela gère correctement la limite inférieure - Ajout
corr /= np.sqrt(np.dot(x, x) * np.dot(y, y))
à la fin de ma fonction pour toutes les options, mais cela semble écraser mes valeurs loin de 1,0
Quelle est la bonne façon de normaliser none
, biased
, et unbiased
options d'échelle? MATLAB n'a pas la fonctionnalité pour cela, et Google ne donne aucun résultat pour la normalisation des estimations de corrélation croisée biaisée/non biaisée.