In [1]:
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
import scipy as sy
import scipy.optimize as op
import scipy.signal as signal
import scipy.fftpack as fftpack
from scipy.signal import lombscargle as lb
%matplotlib inline
In [2]:
ls
In [3]:
cd data
In [4]:
data = np.loadtxt('manytraces.csv',dtype=np.int32 ,delimiter=',') # get data
In [5]:
# Initial parameters
size = 1024 # size pulse
initial = 0 # plot head
final = 2*size # plot tail
head = size*0.2 # head fit
tail = size*0.8 # tail fit
In [6]:
data2 = data[0,:]-128
In [6]:
In [7]:
Fs = 250e6 # sampling rate
Ts = 1.0/Fs # sampling interval
# print(Ts)
A,B = np.hsplit(data2,2) # divide chA chB
# plt.plot(A)
# plt.plot(B)
# A.shape,B.shape,A[0],B[0]
signal = A[head:tail]
signalB = B[head:tail]
n = signal.size
time = Ts*np.arange(0,n)/1e-9
# plt.plot(time,signal)
# plt.plot(time,signalB)
# plt.xlabel('Time (ns)')
# plt.xlim(0,200)
FTT = np.fft.rfft(signal)
idx = np.argmax(np.abs(FTT))
freq = np.fft.rfftfreq(n,Ts)
freqmax = freq[idx]
Period = 1/freqmax
# print(freqmax/1e6,Period)
# plt.plot(freq,np.abs(FTT))
# plt.xlim(0,10e6)
DataPeriod = np.around(Period/Ts)
DataPeriod
# plt.plot(signal)
# plt.xlim(0,31)
C = np.roll(A,int(-DataPeriod/4))
# plt.plot(A,'k-')
# plt.plot(B,'r-')
# plt.plot(C,'g-')
# plt.xlim(0,200)
Sin = np.multiply(A,B)
Cos = np.multiply(C,B)
# i = 1
# C[i],B[i],C[i]*B[i],Cos[i]
# plt.plot(Sin[0:size],'ko')
# plt.plot(Cos[0:size],'ro')
# plt.xlim(0,500)
# Sin.shape
# Cos.shape
# plt.plot(Sin[0:size],'ko')
# plt.plot(Cos[0:size],'ro')
# Sin.shape[0]/size
SinA = np.asarray(np.hsplit(Sin,Sin.shape[0]/size),dtype=np.int32)
CosA = np.asarray(np.hsplit(Cos,Cos.shape[0]/size),dtype=np.int32)
I = np.mean([SinA[i][head:tail].mean() for i in range(int(Sin.shape[0]/size))])
Q = np.mean([CosA[i][head:tail].mean() for i in range(int(Sin.shape[0]/size))])
I,Q
Out[7]:
In [7]:
In [7]:
In [7]:
In [7]:
In [7]:
In [7]:
In [7]:
In [7]:
In [8]:
def IQ(data2,Fs = 250e6,LC=0.2,HC=0.8):
'''
data: data
Fs : sampling rate
'''
head = size*LC # head fit
tail = size*HC # tail fit
Ts = 1.0/Fs # sampling interval
# print(Ts)
A,B = np.hsplit(data2,2) # divide chA chB
# plt.plot(A)
# plt.plot(B)
# A.shape,B.shape,A[0],B[0]
signal = A[head:tail]
signalB = B[head:tail]
n = signal.size
time = Ts*np.arange(0,n)/1e-9
# plt.plot(time,signal)
# plt.plot(time,signalB)
# plt.xlabel('Time (ns)')
# plt.xlim(0,200)
FTT = np.fft.rfft(signal)
idx = np.argmax(np.abs(FTT))
freq = np.fft.rfftfreq(n,Ts)
freqmax = freq[idx]
Period = 1/freqmax
# print(freqmax/1e6,Period)
# plt.plot(freq,np.abs(FTT))
# plt.xlim(0,10e6)
DataPeriod = np.around(Period/Ts)
# DataPeriod
# plt.plot(signal)
# plt.xlim(0,31)
C = np.roll(A,int(-DataPeriod/4))
# plt.plot(A,'k-')
# plt.plot(B,'r-')
# plt.plot(C,'g-')
# plt.xlim(0,200)
Sin = np.multiply(A,B)
Cos = np.multiply(C,B)
# i = 1
# C[i],B[i],C[i]*B[i],Cos[i]
# plt.plot(Sin[0:size],'ko')
# plt.plot(Cos[0:size],'ro')
# plt.xlim(0,500)
# Sin.shape
# Cos.shape
# plt.plot(Sin[0:size],'ko')
# plt.plot(Cos[0:size],'ro')
# Sin.shape[0]/size
SinA = np.hsplit(Sin,Sin.shape[0]/size)
CosA = np.hsplit(Cos,Cos.shape[0]/size)
I = np.mean([SinA[i][head:tail].mean() for i in range(int(Sin.shape[0]/size))])
Q = np.mean([CosA[i][head:tail].mean() for i in range(int(Sin.shape[0]/size))])
return I,Q
In [9]:
%timeit IQ(data2)
In [10]:
%load_ext cythonmagic
In [11]:
%reload_ext cythonmagic
In [12]:
%%cython_pyximport foo
def primes(int kmax):
cdef int n, k, i
cdef int p[1000]
result = []
if kmax > 1000:
kmax = 1000
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] != 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
In [13]:
%%cython
#--annotate
from __future__ import division
import numpy as np
cimport cython
cimport numpy as np
# DTYPE = np.int32
# ctypedef np.int32_t DTYPE_t
def Test(np.ndarray data2, double Fs ,double LC, double HC, double size ):
'''
data: data
Fs : sampling rate
'''
# assert data2.dtype == DTYPE_t
cdef double Ts
cdef double head
cdef double tail
cdef np.ndarray signal
# cdef np.ndarray signalB
cdef int n
cdef np.ndarray time
cdef np.ndarray FTT
cdef int idx
cdef np.ndarray freq
cdef double freqmax
cdef double Period
cdef int DataPeriod
cdef np.ndarray C
cdef np.ndarray Sin
cdef np.ndarray Cos
cdef np.ndarray SinA
cdef np.ndarray CosA
cdef double I
cdef double Q
cdef np.ndarray A
cdef np.ndarray B
A,B = np.hsplit(data2,2)
head = size*LC # head fit
tail = size*HC # tail fit
Ts = 1/Fs
signal = A[head:tail]
# signalB = B[head:tail]
n = signal.size
time = Ts*np.arange(0,n)/1e-9
FTT = np.fft.rfft(signal)
idx = np.argmax(np.abs(FTT))
freq = np.fft.rfftfreq(n,Ts)
freqmax = freq[idx]
Period = 1/freqmax
DataPeriod = np.around(Period/Ts)
C = np.roll(A,int(-DataPeriod/4))
Sin = np.multiply(A,B)
Cos = np.multiply(C,B)
SinA = np.asarray(np.hsplit(Sin,Sin.shape[0]/size),dtype=np.int32)
CosA = np.asarray(np.hsplit(Cos,Cos.shape[0]/size),dtype=np.int32)
I = np.mean([SinA[i][head:tail].mean() for i in range(int(Sin.shape[0]/size))])
Q = np.mean([CosA[i][head:tail].mean() for i in range(int(Sin.shape[0]/size))])
return I,Q
In [14]:
%timeit Test(data2,250e6,.2,.8,1024)
In [15]:
%%cython
#--annotate
from __future__ import division
import numpy as np
cimport cython
cimport numpy as np
DTYPE = np.int32
ctypedef np.int32_t DTYPE_t
np.import_array()
def Test2(np.ndarray[DTYPE_t, ndim=1] data2, double Fs ,double LC, double HC, double size ):
'''
data: data
'''
cdef np.ndarray[DTYPE_t, ndim=1] A
cdef np.ndarray[DTYPE_t, ndim=1] B
cdef double Ts
cdef double head
cdef double tail
cdef np.ndarray[DTYPE_t, ndim=1] signal
# # cdef np.ndarray signalB
cdef int n
cdef np.ndarray time
cdef np.ndarray FTT
cdef int idx
cdef np.ndarray freq
cdef double freqmax
cdef double Period
cdef int DataPeriod
cdef np.ndarray[DTYPE_t, ndim=1] C
cdef np.ndarray[DTYPE_t, ndim=1] Sin
cdef np.ndarray[DTYPE_t, ndim=1] Cos
cdef np.ndarray[DTYPE_t, ndim=1] SinA
cdef np.ndarray[DTYPE_t, ndim=1] CosA
cdef double I
cdef double Q
A,B = np.hsplit(data2,2)
head = size*LC # head fit
tail = size*HC # tail fit
Ts = 1/Fs
signal = A[head:tail]
n = signal.size
time = Ts*np.arange(0,n)/1e-9
FTT = np.fft.rfft(signal)
idx = np.argmax(np.abs(FTT))
freq = np.fft.rfftfreq(n,Ts)
freqmax = freq[idx]
Period = 1/freqmax
DataPeriod = np.around(Period/Ts)
C = np.roll(A,int(-DataPeriod/4))
Sin = np.multiply(A,B)
Cos = np.multiply(C,B)
SinA = np.asarray(np.hsplit(Sin,Sin.shape[0]/size)[0],dtype=np.int32)
CosA = np.asarray(np.hsplit(Cos,Cos.shape[0]/size)[0],dtype=np.int32)
I = SinA.mean()
Q = CosA.mean()
return I,Q
In [18]:
%timeit
Test2(data2,250e6,.2,.8,1024)
Out[18]:
In [ ]: