10 #ifndef _utl_FFTDataContainerAlgorithm_h_
11 #define _utl_FFTDataContainerAlgorithm_h_
13 #include <utl/fft++.h>
16 #include <boost/rational.hpp>
17 #include <utl/AugerException.h>
18 #include <utl/FFTDataContainer.h>
19 #include <utl/MathConstants.h>
21 #include <utl/TimeInterval.h>
51 template<
template<
typename X>
class C,
typename T,
typename F>
60 for (
unsigned int i = 0; i < spectrum.GetSize(); ++i)
62 std::exp(-std::complex<double>(0,1) *
kTwoPi * container.GetFrequencyOfBin(i) * shift.
GetInterval());
66 template<
template<
typename X>
class C,
typename T,
typename F>
76 const F offset = spectrum[0];
85 C<F> upsampledSpectrum((spectrum.GetSize()-1)*upsamplingFactor+1, spectrum.GetBinning(), 0);
90 for (
unsigned int i = 0; i < spectrum.GetSize(); ++i)
91 upsampledSpectrum[i] = spectrum[i];
93 const int lastentry = 2*(spectrum.GetSize()-1);
94 for (
int i = spectrum.GetSize()-1; i >= 0; --i)
95 upsampledSpectrum[lastentry-i] = std::conj(spectrum[i]);
96 upsampledSpectrum[lastentry] *= 0.5;
97 upsampledSpectrum[spectrum.GetSize()-1] *= 0.5;
103 spectrum.Swap(upsampledSpectrum);
107 spectrum[0] = offset;
114 template<
template<
typename X>
class C,
typename T,
typename F>
124 const F offset = spectrum[0];
133 C<F> upsampledSpectrum(newSize, spectrum.GetBinning(), 0);
136 for (
unsigned int i = 0; i < spectrum.GetSize(); ++i)
137 upsampledSpectrum[i] = spectrum[i];
143 spectrum.Swap(upsampledSpectrum);
147 spectrum[0] = offset;
154 template<
template<
typename X>
class C,
typename T,
typename F>
159 if (resampleBinning <= 0)
161 const long maxUpsamplingFactor = 500;
163 double origBinning = container.GetConstTimeSeries().GetBinning();
164 double targetBinning = resampleBinning;
167 const boost::rational<long> resamplingFactor = origBinningRational / targetBinningRational;
168 if (resamplingFactor.numerator() > maxUpsamplingFactor)
170 if (resamplingFactor.numerator() != 1)
172 if (resamplingFactor.denominator() != 1)
177 template<
template<
typename X>
class C,
typename T,
typename F>
184 C<T> thinnedtimeseries(static_cast<unsigned int>(timeseries.GetSize()/thinOutFactor), timeseries.GetBinning()*thinOutFactor);
187 for (
unsigned int i = 0; i < thinnedtimeseries.GetSize(); ++i)
188 thinnedtimeseries[i] = timeseries[i * thinOutFactor];
191 timeseries.Swap(thinnedtimeseries);
195 template<
template<
typename X>
class C,
typename T,
typename F>
199 template<
template<
typename X>
class C,
typename T,
typename F>
212 boost::rational<long>
215 const double abortprecision = 1e-5;
216 const double orgfpn = fpn;
217 long denominator = 1;
219 while (std::modf(fpn, &fpn_int)/fpn > abortprecision) {
227 return boost::rational<long>(denominator, long(fpn+0.5));
230 const boost::rational<long> firstresult =
231 boost::rational<long>(long(fpn+0.5), denominator);
232 const boost::rational<long> secondresult =
236 return (firstresult.denominator() < secondresult.denominator()) ? firstresult : secondresult;
239 friend class ::testFFTDataContainerAlgorithm;
static void HilbertEnvelope(FFTDataContainer< C, T, F > &container)
applies a HilbertEnvelope to the time series data
unsigned int GetNyquistZone() const
get the Nyquist zone
static void UpsampleTimeSeries(FFTDataContainer< C, T, F > &container, const unsigned int upsamplingFactor, const bool removeOffset)
upsamples a trace by the given upsampling factor, removes DC offset if instructed so ...
static void ThinOutTimeSeries(FFTDataContainer< C, T, F > &container, const long thinOutFactor)
thins out a time series by a given factor
C< F > & GetFrequencySpectrum()
read out the frequency spectrum (write access)
static void ResampleTimeSeries(FFTDataContainer< C, T, F > &container, const double resampleBinning)
resamples a time series to a given sampling timebase
static void ShiftTimeSeries(FFTDataContainer< C, T, F > &container, const TimeInterval &shift)
shifts the time series of the FFTDataContainer in time
C< T > & GetTimeSeries()
read out the time series (write access)
static void zeroPad(FFTDataContainer< C, T, F > &container, const unsigned int newSize, const bool removeOffset)
zero padding to a given number
Algorithms working on FFTDataContainer objects.
Base class for inconsistency/illogicality exceptions.
static boost::rational< long > ConvertDecimalDoubleToRational(double fpn, const bool secondcall)
double GetInterval() const
Get the time interval as a double (in Auger base units)
Template class for a data container that offers and takes both time series and corresponding frequenc...
A TimeInterval is used to represent time elapsed between two events.
static void HilbertTransform(FFTDataContainer< C, T, F > &container)
aplies a HilbertTransform in the data
void SetNyquistZone(const unsigned int zone)
set the Nyquist zone