import numpy as np
from random import randint as ri

def nasob(p, q):

    fp = np.fft.fft(p)
    fq = np.fft.fft(q)

    fp = np.conj(fp)

    f_res = np.multiply(fp, fq)

    return np.fft.ifft(f_res)

def find_shift(p, q): 
    fp = np.fft.fft(p)
    fq = np.fft.fft(q)

    fp = np.conj(fp) # conj - komplexne zdruzeny vektor

    f_res = np.multiply(fp, fq)
	
    r = np.fft.ifft(f_res)
    return np.argmax(np.real(r)) # vrati index najvacsieho prvku

def find_shift2(p, q): 
    fp = np.fft.fft(p)
    fq = np.fft.fft(q)

    fp_reversed = fp[::-1]  # otocenie
    fp = np.roll(fp_reversed,1)  # posun

    f_res = np.multiply(fp, fq)
	
    r = np.fft.ifft(f_res)
    return np.argmax(np.real(r)) # vrati index najvacsieho prvku

N = 10
data = np.array([60 ,17 ,32, 97, 45, 13, 60, 20, 21,  8])[np.newaxis]
shift = ri(0,N-1)
s_data = np.roll(data, shift)

print(data)
print(s_data)

r_data = nasob(data,s_data)

i = np.argmax(r_data.real)

print(f'vypocitany posun: {i} \npovodny posun: {shift}')

## pre bin data

print('\ntest pre bin data hladanie vzorky')

data = [0,0,1,1,0,0,0,1,0,1]#[ri(0,1) for i in range(N)]
n = 4
shift = 2#ri(0,6)
print(data[shift:shift+n])
s_data = data[shift:shift+n]+[0]*6
print(data)
print(s_data)

data = np.array(data)
s_data = np.array(s_data)
r_data = nasob(data,s_data)

i = np.argmax(np.abs(r_data))

print(f'vypocitany posun: {N-i} \npovodny posun: {shift}')


