]> Creatis software - clitk.git/blob - common/clitkSignal.h
fftw is not required anymore
[clitk.git] / common / clitkSignal.h
1 #ifndef CLITKSIGNAL_H
2 #define CLITKSIGNAL_H
3
4 //Adapted from Signal.hh in ilr (Simon)
5
6 #include "clitkCommon.h"
7 #include "clitkIO.h"
8
9 //include external library
10 //#include <fftw3.h>
11 #include <complex>
12 #include <iostream>
13 //itk include
14 #include "itkImage.h"
15 #include "itkImageRegionConstIterator.h"
16 #include "itkPointSet.h"
17 // #include "itkBSplineScatteredDataPointSetToImageFilter.h"
18
19 using namespace std;
20
21 namespace clitk{
22
23 class Signal{
24   public:
25
26   //=====================================================================================
27   //Typedefs
28   typedef double SignalValueType;
29   typedef vector< SignalValueType > SignalType;
30   typedef SignalType::iterator iterator;
31   typedef SignalType::const_iterator const_iterator;
32   //typedef vector< complex<double> > SIGNAL_FFT_TYPE;
33   
34   typedef itk::Image<double,1> ImageType;
35   typedef itk::Vector<double,1> VectorType;
36   typedef itk::Image<VectorType,1> VectorImageType;
37  
38   //=====================================================================================
39   //Constructors - Destructors
40   Signal(){SetSamplingPeriod(1.);}
41   Signal(double sp):m_SamplingPeriod(sp){;}
42   Signal(const string fileName){Read(fileName);}
43   Signal(unsigned int size, SignalValueType voidValue=0.)
44   {
45     m_Data.resize(size,voidValue);
46     SetSamplingPeriod(1);
47   };
48   Signal(const Signal & s);
49   
50   ~Signal(){}
51
52   //=====================================================================================  
53   //IO
54   void Read(string fileName);
55   bool Read(string fileName, int col);
56   void ReadXDR(string fileName);
57   void Write(const string fileName);
58   
59   //=====================================================================================
60   //Common vector properties for signals
61   unsigned int size() const {return m_Data.size();}
62   iterator begin(){return m_Data.begin();}
63   iterator end() {return m_Data.end();}
64   const_iterator begin() const {return m_Data.begin();}
65   const_iterator end() const {return m_Data.end();}
66   SignalValueType front() {return m_Data.front();}
67   SignalValueType back() {return m_Data.back();}
68   void push_back(SignalValueType value){return m_Data.push_back(value);}    
69   void resize(unsigned int newSize){return m_Data.resize(newSize);}
70   void clear(){m_Data.clear();}
71   
72   void print(ostream & os = cout, const int level = 0) const;
73     
74   //=====================================================================================
75   //Operators
76   SignalValueType& operator[](int index){return m_Data[index];}
77   const SignalValueType& operator[](int index) const {return m_Data[index];}
78   Signal & operator/=(Signal & d);
79   Signal & operator*=(Signal & d);
80   
81   //Functions
82   void CopyFrom(const Signal & s);
83   Signal Normalize(double newMin=0.,double newMax=1.);
84   vector<double> GetGlobalMinMax() const;
85   double GetGlobalMean() const;
86   Signal MovingAverageFilter ( unsigned int length);
87   Signal GaussLikeFilter ();
88   Signal NormalizeMeanStdDev(double newMean=0.5,double newStdDev=0.5);
89   //Signal HighPassFilter (double sampPeriod, double cutOffFrequency );
90   //Signal LowPassFilter (double sampPeriod, double cutOffFrequency );
91   //double MaxFreq(const Signal &sig,SIGNAL_FFT_TYPE & fft);
92   //void OneDForwardFourier(const Signal& input,SIGNAL_FFT_TYPE & fft);
93   //void OneDBackwardFourier(SIGNAL_FFT_TYPE & fft, Signal &output);
94   Signal DetectLocalExtrema(unsigned int width);
95   Signal LimPhase();
96   Signal MonPhase();
97   Signal MonPhaseDE(double ee, double ei);
98   double SSD(const Signal &sig2) const;
99   Signal LinearlyInterpolateScatteredValues();
100   //   Signal ApproximateScatteredValuesWithBSplines (unsigned int splineOrder, unsigned int numberOfControlPoints); 
101   Signal LimitSignalRange();  
102   
103   void AddValue(double v);
104   void ComputeAugmentedSpace(Signal & outputX, Signal & outputY, unsigned int delay) const;
105
106   void ResampleWithTimeWarpTo(clitk::Signal & output, bool lin=false) const ;
107   double GetValueAtNN(double t) const;
108   double GetValueAtLin(double t) const;
109   void Shift(int s, int length);
110
111   double GetTotalTimeDuration() const { return size()*GetSamplingPeriod(); }
112   double UnormalizedXcov(const Signal &,  Signal &) const;
113   Signal Xcov(const Signal &, int &, double &, double &);
114   double UnormalizedCorrelation(const Signal &input2) const;
115   double Correlation(const Signal &input2) const;
116
117   //     double Compare(Signal & sigRef);
118   //     int DerivateSigne( const_iterator & it) const;
119   //     void CenteredFiniteDifferences(Signal & result,int order,int* weights);
120   //     void FirstDerivate(Signal & result,int order);
121   //     void SecondDerivate(Signal & result,int order);
122   
123   //     void Crop(unsigned int posmin, unsigned int posmax);
124   //     void LinearResample(const unsigned int newSize);
125
126  
127   //=====================================================================================
128   // Get and Set function
129   double GetSamplingPeriod() const {return m_SamplingPeriod;}
130   void SetSamplingPeriod(double sp){m_SamplingPeriod=sp;}
131
132   //=====================================================================================
133   //Conversion for using itk filters
134   Signal ConvertImageToSignal(ImageType::Pointer image);
135   ImageType::Pointer ConvertSignalToImage( Signal);
136   Signal ConvertVectorImageToSignal (VectorImageType::Pointer m);   
137   
138 protected:  
139   SignalType m_Data;
140   double m_SamplingPeriod;
141 };
142 }
143 #endif