Xmipp  v3.23.11-Nereus
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
KaiserBessel Class Reference

#include <xmipp_funcs.h>

Public Member Functions

 KaiserBessel (double alpha_, int K, double r_, double v_, int N_, double vtable_=0., int ntable_=5999)
 
double I0table_maxerror ()
 
std::vector< double > dump_table () const
 
double sinhwin (double x) const
 
double i0win (double x) const
 
double i0win_tab (double x) const
 
int get_window_size () const
 

Protected Member Functions

void build_I0table ()
 

Protected Attributes

double alpha
 
double v
 
double r
 
int N
 
int K
 
double vtable
 
int ntable
 
std::vector< double > i0table
 
double dtable
 
double alphar
 
double fac
 
double vadjust
 
double facadj
 
double fltb
 

Detailed Description

Kaiser-Bessel function

This code was modified from SPARX and originally written by Pawel Penczek at the University of Texas - Houston Medical School

see P. A. Penczek, R. Renka, and H. Schomberg, J. Opt. Soc. Am. 21, 449 (2004)

The I0 version can be tabulated and interpolated upon demand, but the max error needs to be checked. The "vtable" parameter corresponds to the maximum value of x for which the I0 selfWindow is non-zero. Setting "vtable" different from "v" corresponds to a change in units of x. In practice, it is often handy to replace x in some sort of absolute units with x described in terms of grid intervals.

The get_kbsinh_win and get_kbi0_win functions return single-argument function objects, which is what a generic routine is likely to want.

kb = KaiserBessel(alpha, K, r, v , N);
double wx = kb.sinhwin(32);
double tablex1 = kb.i0win_tab(delx-inxold+3);

Definition at line 149 of file xmipp_funcs.h.

Constructor & Destructor Documentation

◆ KaiserBessel()

KaiserBessel::KaiserBessel ( double  alpha_,
int  K,
double  r_,
double  v_,
int  N_,
double  vtable_ = 0.,
int  ntable_ = 5999 
)

Constructor with parameters

Definition at line 53 of file xmipp_funcs.cpp.

55  : alpha(alpha_), v(v_), r(r_), N(N_), K(K_), vtable(vtable_),
56  ntable(ntable_)
57 {
58  // Default values are alpha=1.25, K=6, r=0.5, v = K/2
59  if (0.f == v)
60  v = double(K)/2;
61  if (0.f == vtable)
62  vtable = v;
63  alphar = alpha*r;
64  fac = static_cast<double>(2.*PI)*alphar*v;
65  vadjust = 1.0f*v;
66  facadj = static_cast<double>(2.*PI)*alphar*vadjust;
67  build_I0table();
68 }
double vadjust
Definition: xmipp_funcs.h:161
double facadj
Definition: xmipp_funcs.h:162
double vtable
Definition: xmipp_funcs.h:155
double * f
void build_I0table()
Definition: xmipp_funcs.cpp:83
double alphar
Definition: xmipp_funcs.h:159
#define PI
Definition: tools.h:43
double alpha
Definition: xmipp_funcs.h:152

Member Function Documentation

◆ build_I0table()

void KaiserBessel::build_I0table ( )
protected

2*pi*alpha*r*vadjust

Definition at line 83 of file xmipp_funcs.cpp.

84 {
85  i0table.resize(ntable+1); // i0table[0:ntable]
86  int ltab = int(ROUND(double(ntable)/1.25f));
87  fltb = double(ltab)/(K/2);
88  //double val0 = gsl_sf_bessel_I0(facadj);
89  double val0 = bessi0(facadj);
90  for (int i=ltab+1; i <= ntable; i++)
91  i0table[i] = 0.f;
92  for (int i=0; i <= ltab; i++)
93  {
94  double s = double(i)/fltb/N;
95  if (s < vadjust)
96  {
97  double rt = sqrt(1.f - pow(s/vadjust, 2));
98  //i0table[i] = gsl_sf_bessel_I0(facadj*rt)/val0;
99  i0table[i] = bessi0(facadj*rt)/val0;
100  }
101  else
102  {
103  i0table[i] = 0.f;
104  }
105  }
106 }
double vadjust
Definition: xmipp_funcs.h:161
void sqrt(Image< double > &op)
double facadj
Definition: xmipp_funcs.h:162
#define i
__device__ float bessi0(float x)
double * f
#define ROUND(x)
Definition: xmipp_macros.h:210
std::vector< double > i0table
Definition: xmipp_funcs.h:157

◆ dump_table()

std::vector<double> KaiserBessel::dump_table ( ) const
inline

Definition at line 174 of file xmipp_funcs.h.

175  {
176  return i0table;
177  }
std::vector< double > i0table
Definition: xmipp_funcs.h:157

◆ get_window_size()

int KaiserBessel::get_window_size ( ) const
inline

Return the size of the I0 selfWindow

Definition at line 197 of file xmipp_funcs.h.

198  {
199  return K;
200  }

◆ I0table_maxerror()

double KaiserBessel::I0table_maxerror ( )

Compute the maximum error in the table

Definition at line 109 of file xmipp_funcs.cpp.

110 {
111  double maxdiff = 0.f;
112  for (int i = 1; i <= ntable; i++)
113  {
114  double diff = fabs(i0table[i] - i0table[i-1]);
115  if (diff > maxdiff)
116  maxdiff = diff;
117  }
118  return maxdiff;
119 }
#define i
std::vector< double > i0table
Definition: xmipp_funcs.h:157

◆ i0win()

double KaiserBessel::i0win ( double  x) const

Kaiser-Bessel I0 selfWindow function

Definition at line 71 of file xmipp_funcs.cpp.

72 {
73  double val0 = double(bessi0(facadj));
74  double absx = fabs(x);
75  if (absx > vadjust)
76  return 0.f;
77  double rt = sqrt(1.f - pow(absx/vadjust, 2));
78  double res = bessi0(facadj*rt)/val0;
79  return res;
80 }
double vadjust
Definition: xmipp_funcs.h:161
void sqrt(Image< double > &op)
double facadj
Definition: xmipp_funcs.h:162
doublereal * x
__device__ float bessi0(float x)
double * f

◆ i0win_tab()

double KaiserBessel::i0win_tab ( double  x) const
inline

Kaiser-Bessel I0 selfWindow function (uses table lookup)

Definition at line 186 of file xmipp_funcs.h.

187  {
188  double xt;
189  if(x<0.)
190  xt = -x*fltb+0.5;
191  else
192  xt = x*fltb+0.5;
193  return i0table[ (int) xt];
194  }
doublereal * x
std::vector< double > i0table
Definition: xmipp_funcs.h:157

◆ sinhwin()

double KaiserBessel::sinhwin ( double  x) const

Kaiser-Bessel Sinh selfWindow function

Definition at line 122 of file xmipp_funcs.cpp.

123 {
124  double val0 = sinh(fac)/fac;
125  double absx = fabs(x);
126  if (0.0 == x)
127  {
128  double res = 1.0f;
129  return res;
130  }
131  else if (absx == alphar)
132  {
133  return 1.0f/val0;
134  }
135  else if (absx < alphar)
136  {
137  double rt = sqrt(1.0f - pow((x/alphar), 2));
138  double facrt = fac*rt;
139  double res = (sinh(facrt)/facrt)/val0;
140  return res;
141  }
142  else
143  {
144  double rt = sqrt(pow((x/alphar),2) - 1.f);
145  double facrt = fac*rt;
146  double res = (sin(facrt)/facrt)/val0;
147  return res;
148  }
149 }
void sqrt(Image< double > &op)
doublereal * x
double * f
double alphar
Definition: xmipp_funcs.h:159

Member Data Documentation

◆ alpha

double KaiserBessel::alpha
protected

Definition at line 152 of file xmipp_funcs.h.

◆ alphar

double KaiserBessel::alphar
protected

table spastd::cing

Definition at line 159 of file xmipp_funcs.h.

◆ dtable

double KaiserBessel::dtable
protected

Definition at line 158 of file xmipp_funcs.h.

◆ fac

double KaiserBessel::fac
protected

alpha*r

Definition at line 160 of file xmipp_funcs.h.

◆ facadj

double KaiserBessel::facadj
protected

Definition at line 162 of file xmipp_funcs.h.

◆ fltb

double KaiserBessel::fltb
protected

Tabulate I0 selfWindow for speed

Definition at line 164 of file xmipp_funcs.h.

◆ i0table

std::vector<double> KaiserBessel::i0table
protected

Definition at line 157 of file xmipp_funcs.h.

◆ K

int KaiserBessel::K
protected

size in Ix-space

Definition at line 154 of file xmipp_funcs.h.

◆ N

int KaiserBessel::N
protected

Kaiser-Bessel parameters

Definition at line 153 of file xmipp_funcs.h.

◆ ntable

int KaiserBessel::ntable
protected

table I0 non-zero domain maximum

Definition at line 156 of file xmipp_funcs.h.

◆ r

double KaiserBessel::r
protected

Definition at line 152 of file xmipp_funcs.h.

◆ v

double KaiserBessel::v
protected

Definition at line 152 of file xmipp_funcs.h.

◆ vadjust

double KaiserBessel::vadjust
protected

2*pi*alpha*r*v

Definition at line 161 of file xmipp_funcs.h.

◆ vtable

double KaiserBessel::vtable
protected

I0 selfWindow size

Definition at line 155 of file xmipp_funcs.h.


The documentation for this class was generated from the following files: