Removed deprecated DaFFT module. This module is replaced by DamarisFFT,

which extends the ADC_Result and Accumulation class.
This commit is contained in:
Markus Rosenstihl 2014-12-15 20:04:51 +00:00
parent 31d809a618
commit e457a5071f

View File

@ -1,211 +0,0 @@
import warnings
# enable warnings in Python 2.7
warnings.simplefilter('default')
warnings.warn("use of DaFFT is deprecated, please use the methods of Accumulation and ADC_data classes provided by DamarisFFT.", DeprecationWarning)
import numpy as N
import numpy.fft as F
class FFT:
def __init__(self, one_result):
# create copy of one_result and work only on the copy
# also extract some informations
self.the_result = one_result + 0
self.timepoints = N.array(one_result.x)
self.sampling_rate = one_result.get_sampling_rate()
self.data_points = one_result.get_ydata(0).size
self.aquisition_time = self.data_points / float(self.sampling_rate)
self.the_result.set_xlabel('Frequency [Hz]')
def write_n(self, afile):
filename = open(afile,'w')
filename = open(afile,'a')
#print self.the_result.get_description_dictionary()
#filename.write('%s'%self.get_description_dictionary())
for i in range(self.data_points):
filename.write('%e\t%e\t%e\n'%(self.the_result.x[i], self.the_result.y[0][i], self.the_result.y[1][i]))
filename.close()
return self
def base_corr(self, cutoff=0.3, show=0):
"""
Subtracts the mean of the last cutoff % of the timsignal
to get rid of the DC part in the FFT and returns the
new data.
If cutoff is not given, the mean of the last 30% will be
subtracted.
If show=1 the result is return and not the instance. This allows to plot the baseline corrected signal
Example:
base_corr(cutoff=0.2, show=1)
"""
last_points = int(cutoff*self.data_points)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i] - self.the_result.y[i][-last_points:].mean()
if show == 1 :
return self.the_result
return self
def abs_fft(self, points=None, zoom=None,write = 'off'):
"""
Fourier transforms the timesignal;
points is the number of points to transform, if more points given than data points
the rest is zero padded
absfft(points=4096)
"""
realdata = N.array(self.the_result.y[0])
imdata = N.array(self.the_result.y[1])
data = realdata + 1j*imdata
fftdata = F.fftshift(F.fft(data, points))
absfft = N.sqrt(fftdata.real**2 + fftdata.imag**2)
# create our x axis
n = fftdata.size
self.the_result.x = F.fftshift(F.fftfreq(n, 1.0/self.sampling_rate))
self.the_result.y[0] = absfft
self.the_result.y[1] = N.zeros(n)
if write == 'on':
return self
else:
if zoom is None:
return self.the_result
else:
center, width = zoom
return self.zoom(self.the_result, center, width)
def fft(self, points=None, zoom=None, write='off'):
realdata = N.array(self.the_result.y[0])
imdata = N.array(self.the_result.y[1])
data = realdata + 1j*imdata
fftdata = F.fftshift(F.fft(data, points))
# create our x axis
n = fftdata.size
self.the_result.x = F.fftshift(F.fftfreq(n, 1.0/self.sampling_rate))
self.the_result.y[0] = fftdata.real
self.the_result.y[1] = fftdata.imag
if write == 'on':
return self
else:
if zoom is None:
return self.the_result
else:
center, width = zoom
return self.zoom(self.the_result, center, width)
def zoom(self,some_result, center="auto", width=1000):
if center == "auto":
i_center = int(self.the_result.y[0].argmax())
maximum = self.the_result.y[0][i_center]
print "Maximum at Frequency:", self.the_result.x[i_center]
else:
i_center = int(self.data_points/2.0+self.data_points*center/self.sampling_rate)
#print "TODO: set width automagically"
#if width == "auto":
# i_width = int(self.data_points*width)
i_width = int(self.data_points*width/self.sampling_rate)
some_result.x=some_result.x[i_center-i_width/2:i_center+i_width/2]
some_result.y[0]=some_result.y[0][i_center-i_width/2:i_center+i_width/2]
some_result.y[1]=some_result.y[1][i_center-i_width/2:i_center+i_width/2]
return some_result
"""
Apodization functions:
* exp_window and gauss_window are S/N enhancing,
* dexp_window and traf_window are resolution enhancing
* standard windows [hamming, hanning, bartlett, blackman, kaiser-bessel] are also available
self.timepoints = time points
self.aquisition_time = aquisition time (no. samples / sampling_rate)
line_broadening = line broadening factor (standard = 10 Hz)
gaussian_multiplicator = Gaussian Multiplication Factor for
the double exponential apodization
function (standard = 0.3)
"""
def exp_window(self, line_broadening=10, show=0):
apod = N.exp(-self.timepoints*line_broadening)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1 :
return self.the_result
return self
def gauss_window(self, line_broadening=10, show=0):
apod = N.exp(-(self.timepoints*line_broadening)**2)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1 :
return self.the_result
return self
def dexp_window(self, line_broadening=10, gaussian_multiplicator=0.3, show=0):
apod = N.exp(-(self.timepoints*line_broadening - gaussian_multiplicator*self.aquisition_time)**2)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1:
return self.the_result
return self
def traf_window(self, line_broadening=10, show=0):
apod = (N.exp(-self.timepoints*line_broadening))**2 / ( (N.exp(-self.timepoints*line_broadening))**3
+ (N.exp(-self.aquisition_time*line_broadening))**3 )
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1:
return self.the_result
return self
def hanning_window(self, show=0):
apod = N.hanning(self.data_points)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1:
return self.the_result
return self
def hamming_window(self, show=0):
apod = N.hamming(self.data_points)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1:
return self.the_result
return self
def blackman_window(self, show=0):
apod = N.blackman(self.data_points)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1:
return self.the_result
return self
def bartlett_window(self, show=0):
apod = N.bartlett(self.data_points)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1:
return self.the_result
return self
def kaiser_window(self, beta=4, show=0, use_scipy=None):
if use_scipy == None:
# modified Bessel function of zero kind order from somewhere
def I_0(x):
i0=0
fac = lambda n:reduce(lambda a,b:a*(b+1),range(n),1)
for n in range(20):
i0 += ((x/2.0)**n/(fac(n)))**2
return i0
t = N.arange(self.data_points, type=N.Float) - self.data_points/2.0
T = self.data_points
# this is the window function array
apod = I_0(beta*N.sqrt(1-(2*t/T)**2))/I_0(beta)
else:
# alternative method using scipy
import scipy
apod=scipy.kaiser(self.data_points, beta)
for i in range(2):
self.the_result.y[i] = self.the_result.y[i]*apod
if show == 1:
return self.the_result
return self