# How to normalize output of $\tt scipy.signal.correlate$

I have 2 different signals and I'm trying to cross-correlate then using Python 2.7 and scipy.signal.correlate. How do I normalize my results (such that the max amplitude is 1.0? I tried the following:

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0,2*np.pi,num=1000)
x1 = 10*np.sin(2*np.pi*t)
x2 = np.sin(2*np.pi*t+np.pi/2)
x12 = scipy.signal.correlate(x1,x2,'full')
plt.plot(x12)


results in the following plot

• x12 / np.max(x12) ? May 25, 2017 at 2:40
• Jan 4, 2019 at 16:20

When you say normalized cross-correlation I guess you mean the Pearson correlation. Anyways you just divide the cross correlation by the multiplication of the std(standard deviation) of both signal, or more conveniently: $\rho_{xy} =\frac{<x,y>}{\sigma_x\sigma_y}$

and in code:

x1 = x1/x1.std()
x2 = x2/x2.std() and then as you did it

• i still have to divide x12 by the length of x1 (len(x1)=len(x2)) to get a normalized amplitude (rho(tau)). What is the relevance of that? May 25, 2017 at 18:14
• Yea you'r right, you should divide with the length as well May 26, 2017 at 15:56

To get the cross-correlation function to be normalised between +1 and -1, you can divide the cross correlation like so:

xcorr = scipy.signal.correlate(x2, x1, mode='full')
xcorr /= np.sqrt(np.sum(np.abs(x2)**2)*np.sum(np.abs(x1)**2))


The coefficient seems to be a standard normalisation, see https://gaidi.ca/weblog/normalizing-a-cross-correlation-in-matlab/

e.g. cross correlation of sin(x) and cos(x) as above gives

New contributor
choudhuryh is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.