34 #ifndef AIMS_SIGNALFILTER_IIRFILTER_H
35 #define AIMS_SIGNALFILTER_IIRFILTER_H
98 virtual void setDirections(
bool dirx,
bool diry,
bool dirz,
bool dirt );
140 int dir,
long fullsize,
int binf )
const;
144 virtual long selectCoeff(
long i,
long fullsize,
int binf )
const;
146 virtual long computeK0(
double pole,
double tolerance = -1. )
const;
181 CausalIIRFilter(
const std::vector<double> & num_coeffs = std::vector<double>(),
182 const std::vector<double> & den_coeffs = std::vector<double>(),
184 CausalIIRFilter(
const CausalIIRFilter & other );
185 virtual ~CausalIIRFilter();
186 CausalIIRFilter & operator=(
const CausalIIRFilter & other );
201 const double & b0()
const;
202 const std::vector<double> & numCoeffs()
const;
203 const std::vector<double> & denCoeffs()
const;
204 void setB0(
const double & gain );
205 void setNumCoeff(
const double & coeff );
206 void setNumCoeffs(
const std::vector<double> & coeff );
207 void setDenCoeff(
const double & coeff );
208 void setDenCoeffs(
const std::vector<double> & coeff );
217 long k,
int dir,
long fullsize,
int binf )
const;
221 std::vector<double> _num_coeff;
222 std::vector<double> _den_coeff;
231 class CausalAllPoleIIRFilter:
public IIRFilterBase
245 CausalAllPoleIIRFilter(
const std::vector<double> & coeffs = std::vector<double>(),
246 double gain = 1.,
bool is_pole =
false );
249 CausalAllPoleIIRFilter(
double coeff,
double gain = 1.,
bool is_pole =
false );
250 CausalAllPoleIIRFilter(
const CausalAllPoleIIRFilter & other );
251 virtual ~CausalAllPoleIIRFilter();
252 CausalAllPoleIIRFilter & operator=(
const CausalAllPoleIIRFilter & other );
267 const double & gain()
const;
268 const std::vector<double> & poles()
const;
269 const std::vector<double> & coeffs()
const;
270 void setGain(
const double & gain );
271 void setPole(
const double & pole,
bool is_pole =
true );
272 void setPoles(
const std::vector<double> & pole,
bool is_pole =
true );
273 void setCoeff(
const double & coeff,
bool is_pole =
false );
274 void setCoeffs(
const std::vector<double> & coeff,
bool is_pole =
false );
286 std::vector<double> _coeff;
287 std::vector<long> _k0;
357 template <
typename CausalFilter>
358 class AntiCausalWarperIIRFilter:
public CausalFilter
365 explicit AntiCausalWarperIIRFilter(
const CausalFilter & other = CausalFilter() );
366 AntiCausalWarperIIRFilter(
const AntiCausalWarperIIRFilter & other );
367 virtual ~AntiCausalWarperIIRFilter();
368 AntiCausalWarperIIRFilter & operator=(
const AntiCausalWarperIIRFilter & other );
379 int dir,
long fullsize,
int binf )
const;
386 typedef AntiCausalWarperIIRFilter<CausalIIRFilter> AntiCausalIIRFilter;
387 typedef AntiCausalWarperIIRFilter<CausalAllPoleIIRFilter> AntiCausalAllPoleIIRFilter;
388 typedef AntiCausalWarperIIRFilter<CausalSinglePoleIIRFilter> AntiCausalSinglePoleIIRFilter;
425 const std::vector<double> &
poles = std::vector<double>() );
437 int dir = -1 )
const;
445 const std::vector<double> &
poles()
const;
Special case of Infinite Impulse Response filter.
const double & pole() const
CausalSinglePoleIIRFilter & operator=(const CausalSinglePoleIIRFilter &other)
virtual void filter1d(const carto::VolumeRef< double > in, carto::VolumeRef< double > out, int dir=-1) const
Execution.
void setPole(const double &pole)
void setGain(const double &gain)
CausalSinglePoleIIRFilter(const CausalSinglePoleIIRFilter &other)
virtual ~CausalSinglePoleIIRFilter()
const double & gain() const
Parameters.
CausalSinglePoleIIRFilter(double pole=0., double gain=1.)
Constructor / Destructor / Copy.
Base class for separable infinite impulse response filters.
virtual long computeK0(double pole, double tolerance=-1.) const
compute K0 so that pole^K0 < precision
FilterType::CopyType _copy
virtual void filter1d(carto::VolumeRef< double > vol, int dir=-1, carto::VolumeRef< double > tmp=carto::VolumeRef< double >((carto::Volume< double > *) 0)) const
redirection for in place fitlering
virtual void filter1d(const carto::VolumeRef< double > in, carto::VolumeRef< double > out, int dir=-1) const =0
Actual 1d filter that should be implemented by derived classes.
virtual void setDirections(const std::vector< bool > &dir)
virtual void filter(carto::VolumeRef< double > vol) const
Helpers.
carto::VolumeRef< double > execute(carto::VolumeRef< double > &in, bool inplace=false) const
IIRFilterBase(const IIRFilterBase &other)
virtual double & at(carto::VolumeRef< double > &vector, long k, int dir) const
Fast access : k must be in [0, size-1].
virtual const std::vector< bool > & directions() const
Parameters.
virtual void setDirectionT(bool dirt)
default: false
virtual const FilterType::Boundary & boundary() const
Because the filter is infinite, the signal must be extended outisde the image domain.
virtual void setBoundary(const FilterType::Boundary &boundary)
virtual const double & at(const carto::VolumeRef< double > &vector, long k, int dir) const
Fast access : k must be in [0, size-1].
virtual long mirrorCoeff(long i, long size) const
If i is outside [0, size-1], it is mirrored to fall inside.
virtual void setDirectionY(bool diry)
default: true
virtual long selectCoeff(long i, long fullsize, int binf) const
If i is outside [binf, fullsize-1], it is mirrored to fall inside.
FilterType::Boundary _boundary
virtual void setQuiet()
Set verbosity level to 0 -> Remove all possible traces.
IIRFilterBase()
Constructor / Destructor / Copy.
carto::VolumeRef< double > execute(const carto::VolumeRef< T > &in) const
Execution.
IIRFilterBase & operator=(const IIRFilterBase &other)
virtual double at(const carto::VolumeRef< double > &vector, long k, int dir, long fullsize, int binf) const
Mirror access : k can be outside [0, size - 1].
virtual void setDirectionZ(bool dirz)
default: true
virtual void setDirectionX(bool dirx)
default: true
virtual void setDirections(bool dirx, bool diry, bool dirz, bool dirt)
virtual void setVerbose(int verbose=1)
Verbosity level.
Symmetric, all-pole, infinite impulse response Filter.
void setGain(const double &gain)
Relative to Unser & al, gain = c0.
const std::vector< double > & poles() const
std::vector< double > _poles
SymAllPoleIIRFilter(const double gain=0., const std::vector< double > &poles=std::vector< double >())
Constructor / Destructor / Copy.
void addPole(const double &pole)
SymAllPoleIIRFilter(const SymAllPoleIIRFilter &other)
virtual void filter1d(const carto::VolumeRef< double > in, carto::VolumeRef< double > out, int dir=-1) const
Execution.
void setPoles(const std::vector< double > &poles)
SymAllPoleIIRFilter & operator=(const SymAllPoleIIRFilter &other)
const double & gain() const
Parameters.
virtual ~SymAllPoleIIRFilter()
void computePreciseGain()
void setModePreciseGain(bool precise=true)
If this mode is activated, provided gain should be c * prod(-poles).
const T & at(const carto::VolumeRef< T > &vol, long px, long py, long pz, long pt, const Point4dl &fullsize, const Point4dl &binf)