##// END OF EJS Templates
analog discovery:...
analog discovery: added analog out status getter added wait, runDuration and symetry on analog_out method

File last commit:

r3:d444d1cc3fbf default
r8:438467acb8ed default
Show More
transfertFunction.py
79 lines | 2.4 KiB | text/x-python | PythonLexer
#!/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[int(index-1):int(index+1)])
i=int(np.argmax(powI)+index-1)
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 __compute_params(device,freq):
Periods=5
Fs=(freq*device.max_sampling_buffer)/Periods
if Fs < device.min_sampling_freq :
return [device.min_sampling_freq,device.max_sampling_buffer]
while Fs > (0.98*device.max_sampling_freq) :
Periods=Periods+1
Fs=(freq*device.max_sampling_buffer)/Periods
return [Fs,device.max_sampling_buffer]
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)
params=__compute_params(device,freq)
res=device.analog_in_read(ch1=True,ch2=True,frequency=params[0],samplesCount=params[1],ch1range=5.0,ch2range=5.0)
meanI=np.mean(res[0][0])
meanO=np.mean(res[0][1])
FFTi=fftpack.fft((res[0][0]-meanI)*np.hamming(len(res[0][0])))
FFTo=fftpack.fft((res[0][1]-meanO)*np.hamming(len(res[0][1])))
return __parseFFT(FFTi,FFTo,freq,res[1])
def generateLogFreq(startFreq=1.0,stopFreq=100.0,nstep=100):
freq=np.zeros(nstep)
for i in range(int(nstep)) :
freq[i]=startFreq*np.power(10,((np.log10(stopFreq/startFreq))*i/(nstep-1)))
return freq
def computeTF(device,startFreq=1.0,stopFreq=100.0,offset=0.0,maxAmp=5.0,nstep=100):
freqs=generateLogFreq(startFreq,stopFreq,nstep)
f=[]
mod=[]
arg=[]
lastAmp=0.1
for freq in freqs:
step=__step(device,freq,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("")