I want to calculate the Power Spectrum of a 8192 data vector through the usage of cumulants. I calculated autocorrrelation with 128 max shiftings, reduced it by the signal's mean and performed an fft. The result was complex instead of real and positive. Where did I go wrong?
This is my code.
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import acf
import pandas as pd
#Creating the random variables
φ=[]
for i in range(0,6):
if(i==2):
φ.append((φ[0]+φ[1]))
elif(i==5):
φ.append((φ[3]+φ[4]))
else:
φ.append(np.random.uniform(0,2*np.pi))
#Creating the λ variables
λ=[0.12,0.3,0.42,0.19,0.17,0.36]
#Building the x process
x=[]
samples=8192
for k in range(0,samples):
x.append(0)
for i in range(0,6):
x[k]+=np.cos(k*2*λ[i]*np.pi+φ[i])
#Preparing The Plot and adding x to it
fig, [ax1,ax2,ax3,ax4]=plt.subplots(nrows=4,ncols=1)
ax1.plot(x)
ax1.set_title("Time Signal")
#Building The Autocorellation function
lags=128
corr=[]
temp=[]
for i in range(0,lags):
for k in range(0,samples):
if(i+k>=samples):
temp.append(0)
else:
temp.append(x[k+i]*x[k])
corr.append(np.mean(temp))
corr[i]-=(np.mean(x))**2
temp.clear()
#Calculating The Power Spectrum
C2=np.fft.fft(corr)
print(C2)