@@ -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 */
803805template <typename T>
804806void 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
869861inline 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