12 #ifndef mitkConvolutionHelper_h 13 #define mitkConvolutionHelper_h 35 inline itk::Array<double>
wrap1d(itk::Array<double> kernel)
37 int dim = kernel.GetNumberOfElements();
38 itk::Array<double> wrappedKernel(dim);
39 wrappedKernel.fill(0.);
40 for(
int i=0; i< dim; ++i)
42 wrappedKernel.SetElement(i, kernel.GetElement((i+(dim/2))%dim));
53 inline itk::Array<double>
zeropadding1d(itk::Array<double> unpaddedSpectrum,
int paddedDimension)
56 int initialDimension = unpaddedSpectrum.GetNumberOfElements();
58 itk::Array<double> paddedSpectrum(paddedDimension);
59 paddedSpectrum.fill(0.);
61 if(paddedDimension > initialDimension)
63 unsigned int padding = paddedDimension - initialDimension;
65 for(
int i=0; i<initialDimension ;++i)
67 paddedSpectrum.SetElement(i+padding/2, unpaddedSpectrum.GetElement(i));
70 return paddedSpectrum;
75 inline itk::Array<double>
unpadAndScale(itk::Array<double> convolutionResult,
int initialDimension)
77 int transformationDimension = convolutionResult.size();
78 unsigned int padding = transformationDimension - initialDimension;
80 itk::Array<double> scaledResult(initialDimension);
81 scaledResult.fill(0.0);
83 for(
int i = 0; i<initialDimension; ++i)
85 double value = convolutionResult(i+padding/2) / transformationDimension;
86 scaledResult.SetElement(i,value);
95 inline void prepareConvolution(
const itk::Array<double>& kernel,
const itk::Array<double>& spectrum, itk::Array<double>& preparedKernel, itk::Array<double>& preparedSpectrum ){
96 int convolutionDimensions = kernel.GetSize() + spectrum.GetSize();
101 preparedSpectrum =
zeropadding1d(spectrum,convolutionDimensions);
111 typedef itk::Array<double> ConvolutionResultType;
112 ConvolutionResultType
convolution(timeGrid.GetSize());
116 for(
unsigned int i = 0; i< (timeGrid.GetSize()-1); ++i)
118 double dt = timeGrid(i+1) - timeGrid(i);
119 double m = (aif(i+1) - aif(i))/dt;
120 double edt = exp(-lambda *dt);
123 + (aif(i) - m*timeGrid(i))/lambda * (1 - edt )
124 + m/(lambda * lambda) * ((lambda * timeGrid(i+1) - 1) - edt*(lambda*timeGrid(i) -1));
135 typedef itk::Array<double> ConvolutionResultType;
136 ConvolutionResultType
convolution(timeGrid.GetSize());
140 for(
unsigned int i = 0; i< (timeGrid.GetSize()-1); ++i)
142 double dt = timeGrid(i+1) - timeGrid(i);
143 double m = (aif(i+1) - aif(i))/dt;
145 convolution(i+1) =
convolution(i) + constant * (aif(i)*dt + m*timeGrid(i)*dt + m/2*(timeGrid(i+1)*timeGrid(i+1) - timeGrid(i)*timeGrid(i)));
153 #endif // mitkConvolutionHelper_h Helper for itk implementation of vnl fourier transformation This namespace provides functions for the...
DataCollection - Class to facilitate loading/accessing structured data.
itk::Array< double > TimeGridType
itk::Array< double > zeropadding1d(itk::Array< double > unpaddedSpectrum, int paddedDimension)
Fuction for zeropadding (adding zeros) of an Array/vnl_vector, so that is has size paddedDimensions...
itk::Array< double > convoluteAIFWithConstant(mitk::ModelBase::TimeGridType timeGrid, mitk::AIFBasedModelBase::AterialInputFunctionType aif, double constant)
itk::Array< double > wrap1d(itk::Array< double > kernel)
Function that wraps the kernel.
itk::Array< double > unpadAndScale(itk::Array< double > convolutionResult, int initialDimension)
Follow up function after back transformation from fourier space bwd_transform. removes padding and sc...
void prepareConvolution(const itk::Array< double > &kernel, const itk::Array< double > &spectrum, itk::Array< double > &preparedKernel, itk::Array< double > &preparedSpectrum)
Convinience function for preparing 2 array for convolution with each other. Takes both arrays of type...
itk::Array< double > AterialInputFunctionType
itk::Array< double > convoluteAIFWithExponential(mitk::ModelBase::TimeGridType timeGrid, mitk::AIFBasedModelBase::AterialInputFunctionType aif, double lambda)