transfertFunction.py
79 lines
| 2.4 KiB
| text/x-python
|
PythonLexer
/ lppinstru / transfertFunction.py
Alexis Jeandet
|
r1 | #!/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 | ||||
Alexis Jeandet
|
r3 | powI=np.abs(FFTi[int(index-1):int(index+1)]) | ||
i=int(np.argmax(powI)+index-1) | ||||
Alexis Jeandet
|
r1 | 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] | ||||
Alexis Jeandet
|
r3 | 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] | ||||
Alexis Jeandet
|
r1 | 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) | ||||
Alexis Jeandet
|
r3 | 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]))) | ||||
Alexis Jeandet
|
r1 | return __parseFFT(FFTi,FFTo,freq,res[1]) | ||
Alexis Jeandet
|
r3 | 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 | ||||
Alexis Jeandet
|
r1 | |||
def computeTF(device,startFreq=1.0,stopFreq=100.0,offset=0.0,maxAmp=5.0,nstep=100): | ||||
Alexis Jeandet
|
r3 | freqs=generateLogFreq(startFreq,stopFreq,nstep) | ||
Alexis Jeandet
|
r1 | f=[] | ||
mod=[] | ||||
arg=[] | ||||
lastAmp=0.1 | ||||
Alexis Jeandet
|
r3 | for freq in freqs: | ||
step=__step(device,freq,offset=offset,maxAmp=maxAmp,lastAmp=lastAmp) | ||||
Alexis Jeandet
|
r1 | f.append(step[0]) | ||
mod.append(step[1]) | ||||
arg.append(step[2]) | ||||
return [f,mod,arg] | ||||
if __name__ == '__main__': | ||||
print("") | ||||