Skip to content

Commit 416fc77

Browse files
committed
Info about bspline paper added + some cleanups
1 parent 4c690eb commit 416fc77

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

src/algorithm/ComputeGradient.hpp

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,15 @@ void ComputeGradient::bspline_filt_rec_y(MeshData<T>& image,float lambda,float t
110110
//
111111
// Bevan Cheeseman 2016
112112
//
113-
// Recursive Filter Implimentation for Smoothing BSplines (Unser 199*?)
113+
// Recursive Filter Implimentation for Smoothing BSplines
114+
// B-Spline Signal Processing: Part 11-Efficient Design and Applications, Unser 1993
114115

115-
float xi = 1 - 96*lambda + 24*lambda*sqrt(3 + 144*lambda);
116-
float rho = (24*lambda - 1 - sqrt(xi))/(24*lambda)*sqrt((1/xi)*(48*lambda + 24*lambda*sqrt(3 + 144*lambda)));
117-
float omg = atan(sqrt((1/xi)*(144*lambda - 1)));
118-
float c0 = (1+ pow(rho,2))/(1-pow(rho,2)) * (1 - 2*rho*cos(omg) + pow(rho,2))/(1 + 2*rho*cos(omg) + pow(rho,2));
119-
float gamma = (1-pow(rho,2))/(1+pow(rho,2)) * (1/tan(omg));
116+
float xi = 1 - 96*lambda + 24*lambda*sqrt(3 + 144*lambda); // eq 4.6
117+
float rho = (24*lambda - 1 - sqrt(xi))/(24*lambda)*sqrt((1/xi)*(48*lambda + 24*lambda*sqrt(3 + 144*lambda))); // eq 4.5
118+
float omg = atan(sqrt((1/xi)*(144*lambda - 1))); // eq 4.6
119+
120+
float c0 = (1+ pow(rho,2))/(1-pow(rho,2)) * (1 - 2*rho*cos(omg) + pow(rho,2))/(1 + 2*rho*cos(omg) + pow(rho,2)); // eq 4.8
121+
float gamma = (1-pow(rho,2))/(1+pow(rho,2)) * (1/tan(omg)); // eq 4.8
120122

121123
const float b1 = 2*rho*cos(omg);
122124
const float b2 = -pow(rho,2.0);
@@ -802,13 +804,9 @@ void ComputeGradient::calc_bspline_fd_ds_mag(const MeshData<S> &input, MeshData<
802804
*/
803805
template<typename T>
804806
void ComputeGradient::calc_inv_bspline_y(MeshData<T>& input){
805-
//
806-
//
807807
// Bevan Cheeseman 2016
808808
//
809809
// Inverse cubic bspline inverse filter in y direciton (Memory direction)
810-
//
811-
//
812810

813811
const int64_t z_num = input.z_num;
814812
const int64_t x_num = input.x_num;
@@ -818,35 +816,29 @@ void ComputeGradient::calc_inv_bspline_y(MeshData<T>& input){
818816
const float a2 = 4.0/6.0;
819817
const float a3 = 1.0/6.0;
820818

821-
std::vector<float> temp_vec;
822-
temp_vec.resize(y_num,0);
819+
std::vector<float> temp_vec(y_num, 0);
823820

824-
//loop unrolling
825-
826-
int64_t i, k, j;
827-
828-
#ifdef HAVE_OPENMP
829-
#pragma omp parallel for default(shared) private(i, k, j) firstprivate(temp_vec)
830-
#endif
831-
for(j = 0;j < z_num;j++){
832-
833-
for(i = 0;i < x_num;i++){
821+
#ifdef HAVE_OPENMP
822+
#pragma omp parallel for default(shared) firstprivate(temp_vec)
823+
#endif
824+
for (int64_t j = 0; j < z_num; ++j) {
825+
for (int64_t i = 0;i < x_num; ++i) {
834826

835-
#ifdef HAVE_OPENMP
836-
#pragma omp simd
837-
#endif
838-
for (k = 0; k < (y_num);k++){
839-
temp_vec[k] = input.mesh[j*x_num*y_num + i*y_num + k];
827+
#ifdef HAVE_OPENMP
828+
#pragma omp simd
829+
#endif
830+
for (int64_t k = 0; k < (y_num); ++k) {
831+
int64_t idx = j * x_num * y_num + i * y_num + k;
832+
temp_vec[k] = input.mesh[idx];
840833
}
841834

842835
//LHS boundary condition
843836
input.mesh[j*x_num*y_num + i*y_num] = a2*temp_vec[0];
844837
input.mesh[j*x_num*y_num + i*y_num] += (a1+a3)*temp_vec[1];
845838

846-
for (k = 1; k < (y_num-1);k++){
847-
input.mesh[j*x_num*y_num + i*y_num + k] = a1*temp_vec[k-1];
848-
input.mesh[j*x_num*y_num + i*y_num + k] += a2*temp_vec[k];
849-
input.mesh[j*x_num*y_num + i*y_num + k] += a3*temp_vec[k+1];
839+
for (int64_t k = 1; k < (y_num-1);k++){
840+
const int64_t idx = j * x_num * y_num + i * y_num + k;
841+
input.mesh[idx] = a1*temp_vec[k-1] + a2*temp_vec[k] + a3*temp_vec[k+1];
850842
}
851843

852844
//RHS boundary condition
@@ -862,13 +854,13 @@ inline float ComputeGradient::impulse_resp(float k,float rho,float omg){
862854
//
863855
//
864856

865-
return (pow(rho,(std::abs(k)))*sin((std::abs(k) + 1)*omg))/(sin(omg));
857+
return (pow(rho,(std::abs(k)))*sin((std::abs(k) + 1)*omg)) / sin(omg);
866858

867859
}
868860

869861
inline float ComputeGradient::impulse_resp_back(float k,float rho,float omg,float gamma,float c0){
870862
//
871-
// Impulse Response Function
863+
// Impulse Response Function (nominator eq. 4.8, denominator from eq. 4.7)
872864
//
873865
//
874866

0 commit comments

Comments
 (0)