Несмещенная двумерная автокорреляционная функция - PullRequest
0 голосов
/ 07 марта 2019

Мне удалось написать несмещенную функцию автокорреляции для 1d - массивов:

import numpy as np

def autocorr(x):
        x_norm = (x - x.mean())/x.std()
        result = np.correlate(x_norm, x_norm, mode='full')
        vec_unbi = np.array([x.size - abs(i) for i in range(0, x.size)])
        return result[result.size//2:]/x.size

    def autocorr_unbiased(x):
        vec_unbi = np.array([x.size - abs(i) for i in range(0, x.size)])
        return x.size*autocorr(x)/vec_unbi

, который хорошо работает:

N_samples = 1000
t = np.linspace(0,1000,N_samples)
y = np.sin(2*np.pi*t/200)

plt.figure()
plt.plot(autocorr(y), label = 'biased')
plt.plot(autocorr_unbiased(y), label = 'unbiased')
plt.legend()
plt.savefig('test.png')
plt.show()

enter image description here

Теперь у меня есть 2d функция автокорреляции:

from scipy.signal import fftconvolve
def autocorr2D(A):
    return fftconvolve(A,A[::-1, ::-1])

Что смещено:

x = np.linspace(0,500,500)
y = np.linspace(0,500,500)
X, Y = np.meshgrid(y,x)

h = np.sin((2*np.pi/100)*(np.cos(np.pi/3)*X + np.sin(np.pi/3)*Y))

plt.figure()
plt.contourf(autocorr2D(h))
plt.show()

enter image description here

Как мне сместить это, чтобы соответствовать теоретической статистической автокорреляции моего 2D-синуса?

...