Один удобный способ - воспользоваться формулой Эйлера e^(i phi) = cos phi + i sin phi
:
def get_cos_params(samples):
N = len(samples)
x = np.linspace(-np.pi, np.pi, N, endpoint=False)
template = np.exp(1j * x)
corr = 2 / N * template@samples
R = np.abs(corr)
phi = np.log(corr).imag
return R, phi
Пример:
N = np.random.randint(10, 1000)
phi = np.random.uniform(-np.pi, np.pi)
R = np.random.uniform(0.1, 10)
x = np.linspace(-np.pi, np.pi, N, endpoint=False)
signal = R * np.cos(x-phi)
R_recon, phi_recon = get_cos_params(signal)
print(np.isclose(R, R_recon), np.isclose(phi, phi_recon))
# True True