|
|
#!/usr/bin/env python
|
|
|
#-*- coding: utf-8 -*-
|
|
|
"""Simple python library to compute transfert functions
|
|
|
"""
|
|
|
import time
|
|
|
import sys
|
|
|
import os
|
|
|
import matplotlib.pyplot as plt
|
|
|
import numpy as np
|
|
|
from scipy import fftpack
|
|
|
|
|
|
__author__ = "Alexis Jeandet"
|
|
|
__copyright__ = "Copyright 2015, Laboratory of Plasma Physics"
|
|
|
__credits__ = []
|
|
|
__license__ = "GPLv2"
|
|
|
__version__ = "1.0.0"
|
|
|
__maintainer__ = "Alexis Jeandet"
|
|
|
__email__ = "alexis.jeandet@member.fsf.org"
|
|
|
__status__ = "Development"
|
|
|
|
|
|
|
|
|
|
|
|
def __parseFFT(FFTi,FFTo,signalFreq,samplingFreq):
|
|
|
index=signalFreq*len(FFTi)/samplingFreq
|
|
|
powI=np.abs(FFTi[index-4:index+4])
|
|
|
i=np.argmax(powI)+index-4
|
|
|
mod=np.abs(FFTo[i])/np.abs(FFTi[i])
|
|
|
arg=np.angle(FFTo[i])-np.angle(FFTi[i])
|
|
|
if arg<-np.pi:
|
|
|
arg = (np.pi*2)+arg
|
|
|
if arg>np.pi:
|
|
|
arg = (-np.pi*2)+arg
|
|
|
return [signalFreq,mod,arg]
|
|
|
|
|
|
def __step(device,freq,offset=0.0,maxAmp=5.0,lastAmp=1.0):
|
|
|
device.analog_out_gen(freq, shape='Sine', channel=0, amplitude=lastAmp, offset=offset)
|
|
|
samplesCount=8192
|
|
|
if freq > 500000:
|
|
|
FS=freq*samplesCount/500.0
|
|
|
elif freq > 100000:
|
|
|
FS=freq*samplesCount/50.0
|
|
|
else:
|
|
|
FS=freq*samplesCount/10.0
|
|
|
res=device.analog_in_read(ch1=True,ch2=True,frequency=FS,samplesCount=samplesCount,ch1range=5.0,ch2range=5.0)
|
|
|
FFTi=fftpack.fft(res[0][0])
|
|
|
FFTo=fftpack.fft(res[0][1])
|
|
|
return __parseFFT(FFTi,FFTo,freq,res[1])
|
|
|
|
|
|
|
|
|
def computeTF(device,startFreq=1.0,stopFreq=100.0,offset=0.0,maxAmp=5.0,nstep=100):
|
|
|
freq=np.zeros(nstep)
|
|
|
f=[]
|
|
|
mod=[]
|
|
|
arg=[]
|
|
|
for i in range(int(nstep)) :
|
|
|
freq[i]=startFreq*np.power(10,((np.log10(stopFreq/startFreq))*i/(nstep-1)))
|
|
|
lastAmp=0.1
|
|
|
for i in range(len(freq)):
|
|
|
step=__step(device,freq[i],offset=offset,maxAmp=maxAmp,lastAmp=lastAmp)
|
|
|
f.append(step[0])
|
|
|
mod.append(step[1])
|
|
|
arg.append(step[2])
|
|
|
return [f,mod,arg]
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
print("")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|