mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +00:00 
			
		
		
		
	Improve const correctness
This commit is contained in:
		| @@ -85,12 +85,12 @@ uint32_t getbitu(const uint8_t *buff, uint32_t pos, uint8_t len) | ||||
|  */ | ||||
| int32_t getbits(const uint8_t *buff, uint32_t pos, uint8_t len) | ||||
| { | ||||
|     int32_t bits = (int32_t)getbitu(buff, pos, len); | ||||
|     const int32_t bits = (int32_t)getbitu(buff, pos, len); | ||||
|  | ||||
|     /* Sign extend, taken from: | ||||
|      * http://graphics.stanford.edu/~seander/bithacks.html#VariableSignExtend | ||||
|      */ | ||||
|     int32_t m = 1U << (len - 1); | ||||
|     const int32_t m = 1U << (len - 1); | ||||
|     return (bits ^ m) - m; | ||||
| } | ||||
|  | ||||
| @@ -161,9 +161,9 @@ void bitshl(void *buf, uint32_t size, uint32_t shift) | ||||
|     unsigned char *dst = buf;                          /* Destination byte. */ | ||||
|     const unsigned char *src = dst + shift / CHAR_BIT; /* First source byte, possibly incomplete. */ | ||||
|  | ||||
|     uint32_t copy_bits = size * CHAR_BIT - shift; /* Number of bits to move */ | ||||
|     uint32_t byte_shift = copy_bits % CHAR_BIT;   /* Shift of data */ | ||||
|     uint32_t full_bytes = copy_bits / CHAR_BIT;   /* Number of bytes to move */ | ||||
|     const uint32_t copy_bits = size * CHAR_BIT - shift; /* Number of bits to move */ | ||||
|     const uint32_t byte_shift = copy_bits % CHAR_BIT;   /* Shift of data */ | ||||
|     const uint32_t full_bytes = copy_bits / CHAR_BIT;   /* Number of bytes to move */ | ||||
|  | ||||
|     if (0 == byte_shift) | ||||
|         { | ||||
| @@ -209,19 +209,19 @@ void bitshl(void *buf, uint32_t size, uint32_t shift) | ||||
| void bitcopy(void *dst, uint32_t dst_index, const void *src, uint32_t src_index, | ||||
|     uint32_t count) | ||||
| { | ||||
|     uint32_t limit1 = count / 32; | ||||
|     uint32_t limit2 = count % 32; | ||||
|     const uint32_t limit1 = count / 32; | ||||
|     const uint32_t limit2 = count % 32; | ||||
|     uint32_t idx = 0; | ||||
|     for (idx = 0; idx < limit1; ++idx) | ||||
|         { | ||||
|             uint32_t tmp = getbitu(src, src_index, 32); | ||||
|             const uint32_t tmp = getbitu(src, src_index, 32); | ||||
|             setbitu(dst, dst_index, 32, tmp); | ||||
|             src_index += 32; | ||||
|             dst_index += 32; | ||||
|         } | ||||
|     if (0 != limit2) | ||||
|         { | ||||
|             uint32_t tmp = getbitu(src, src_index, limit2); | ||||
|             const uint32_t tmp = getbitu(src, src_index, limit2); | ||||
|             setbitu(dst, dst_index, limit2, tmp); | ||||
|         } | ||||
| } | ||||
|   | ||||
| @@ -126,7 +126,7 @@ static void _cnav_rescan_preamble(cnav_v27_part_t *part) | ||||
|             size_t j = 0; | ||||
|             for (i = 1, j = part->n_decoded - GPS_CNAV_PREAMBLE_LENGTH; i < j; ++i) | ||||
|                 { | ||||
|                     uint32_t c = getbitu(part->decoded, i, GPS_CNAV_PREAMBLE_LENGTH); | ||||
|                     const uint32_t c = getbitu(part->decoded, i, GPS_CNAV_PREAMBLE_LENGTH); | ||||
|                     if (GPS_CNAV_PREAMBLE1 == c || GPS_CNAV_PREAMBLE2 == c) | ||||
|                         { | ||||
|                             part->preamble_seen = true; | ||||
| @@ -182,7 +182,7 @@ static void _cnav_add_symbol(cnav_v27_part_t *part, uint8_t ch) | ||||
|  | ||||
|     /* Feed accumulated symbols into the buffer, reset the number of accumulated | ||||
|      * symbols. */ | ||||
|     v27_update(&part->dec, part->symbols, part->n_symbols / 2); | ||||
|     v27_update(&part->dec, part->symbols, (int)part->n_symbols / 2); | ||||
|     part->n_symbols = 0; | ||||
|  | ||||
|     /* Decode N+M bits, where: | ||||
| @@ -230,8 +230,8 @@ static void _cnav_add_symbol(cnav_v27_part_t *part, uint8_t ch) | ||||
|                 { | ||||
|                     /* We have collected 300 bits starting from message preamble. Now try | ||||
|                      * to compute CRC-24Q */ | ||||
|                     uint32_t crc = _cnav_compute_crc(part); | ||||
|                     uint32_t crc2 = _cnav_extract_crc(part); | ||||
|                     const uint32_t crc = _cnav_compute_crc(part); | ||||
|                     const uint32_t crc2 = _cnav_extract_crc(part); | ||||
|  | ||||
|                     if (part->message_lock) | ||||
|                         { | ||||
|   | ||||
| @@ -108,7 +108,7 @@ uint32_t crc24q_bits(uint32_t crc, const uint8_t *buf, uint32_t n_bits, bool inv | ||||
| { | ||||
|     uint16_t acc = 0; | ||||
|     uint8_t b = 0; | ||||
|     uint32_t shift = 8 - n_bits % 8; | ||||
|     const uint32_t shift = 8 - n_bits % 8; | ||||
|  | ||||
|     uint32_t i = 0; | ||||
|     for (i = 0; i < n_bits / 8; ++i) | ||||
|   | ||||
| @@ -115,7 +115,6 @@ void v27_update(v27_t *v, const unsigned char *syms, int nbits) | ||||
|     unsigned char sym0; | ||||
|     unsigned char sym1; | ||||
|     unsigned int *tmp; | ||||
|     int normalize = 0; | ||||
|  | ||||
|     while (nbits--) | ||||
|         { | ||||
| @@ -176,8 +175,6 @@ void v27_update(v27_t *v, const unsigned char *syms, int nbits) | ||||
|                         { | ||||
|                             v->new_metrics[i] -= minmetric; | ||||
|                         } | ||||
|  | ||||
|                     normalize += minmetric; | ||||
|                 } | ||||
|  | ||||
|             /* Advance decision index */ | ||||
|   | ||||
| @@ -74,9 +74,6 @@ void Viterbi_Decoder::reset() | ||||
|  */ | ||||
| float Viterbi_Decoder::decode_block(const double input_c[], int output_u_int[], const int LL) | ||||
| { | ||||
|     int state; | ||||
|     int decoding_length_mismatch; | ||||
|  | ||||
|     VLOG(FLOW) << "decode_block(): LL=" << LL; | ||||
|  | ||||
|     // init | ||||
| @@ -84,9 +81,9 @@ float Viterbi_Decoder::decode_block(const double input_c[], int output_u_int[], | ||||
|     // do add compare select | ||||
|     do_acs(input_c, LL + d_mm); | ||||
|     // tail, no need to output -> traceback, but don't decode | ||||
|     state = do_traceback(d_mm); | ||||
|     const int state = do_traceback(d_mm); | ||||
|     // traceback and decode | ||||
|     decoding_length_mismatch = do_tb_and_decode(d_mm, LL, state, output_u_int, d_indicator_metric); | ||||
|     const int decoding_length_mismatch = do_tb_and_decode(d_mm, LL, state, output_u_int, d_indicator_metric); | ||||
|  | ||||
|     VLOG(FLOW) << "decoding length mismatch: " << decoding_length_mismatch; | ||||
|  | ||||
| @@ -100,18 +97,15 @@ float Viterbi_Decoder::decode_continuous(const double sym[], | ||||
|     const int nbits_requested, | ||||
|     int& nbits_decoded) | ||||
| { | ||||
|     int state; | ||||
|     int decoding_length_mismatch; | ||||
|  | ||||
|     VLOG(FLOW) << "decode_continuous(): nbits_requested=" << nbits_requested; | ||||
|  | ||||
|     // do add compare select | ||||
|     do_acs(sym, nbits_requested); | ||||
|     // the ML sequence in the newest part of the trellis can not be decoded | ||||
|     // since it depends on the future values -> traceback, but don't decode | ||||
|     state = do_traceback(traceback_depth); | ||||
|     const int state = do_traceback(traceback_depth); | ||||
|     // traceback and decode | ||||
|     decoding_length_mismatch = do_tb_and_decode(traceback_depth, nbits_requested, state, bits, d_indicator_metric); | ||||
|     const int decoding_length_mismatch = do_tb_and_decode(traceback_depth, nbits_requested, state, bits, d_indicator_metric); | ||||
|     nbits_decoded = nbits_requested + decoding_length_mismatch; | ||||
|  | ||||
|     VLOG(FLOW) << "decoding length mismatch (continuous decoding): " << decoding_length_mismatch; | ||||
| @@ -193,11 +187,11 @@ int Viterbi_Decoder::do_acs(const double sym[], int nbits) | ||||
|             /* step through all states */ | ||||
|             for (state_at_t = 0; state_at_t < d_states; state_at_t++) | ||||
|                 { | ||||
|                     int next_state_if_0 = d_state0[state_at_t]; | ||||
|                     int next_state_if_1 = d_state1[state_at_t]; | ||||
|                     const int next_state_if_0 = d_state0[state_at_t]; | ||||
|                     const int next_state_if_1 = d_state1[state_at_t]; | ||||
|  | ||||
|                     /* hypothesis: info bit is a zero */ | ||||
|                     float bm_0 = d_metric_c[d_out0[state_at_t]]; | ||||
|                     const float bm_0 = d_metric_c[d_out0[state_at_t]]; | ||||
|                     metric = d_pm_t[state_at_t] + bm_0;  // path metric + zerobranch metric | ||||
|  | ||||
|                     /* store new metric if more than metric in storage */ | ||||
| @@ -210,7 +204,7 @@ int Viterbi_Decoder::do_acs(const double sym[], int nbits) | ||||
|                         } | ||||
|  | ||||
|                     /* hypothesis: info bit is a one */ | ||||
|                     float bm_1 = d_metric_c[d_out1[state_at_t]]; | ||||
|                     const float bm_1 = d_metric_c[d_out1[state_at_t]]; | ||||
|                     metric = d_pm_t[state_at_t] + bm_1;  // path metric + onebranch metric | ||||
|  | ||||
|                     /* store new metric if more than metric in storage */ | ||||
| @@ -272,17 +266,14 @@ int Viterbi_Decoder::do_traceback(size_t traceback_length) | ||||
| int Viterbi_Decoder::do_tb_and_decode(int traceback_length, int requested_decoding_length, int state, int output_u_int[], float& indicator_metric) | ||||
| { | ||||
|     int n_of_branches_for_indicator_metric = 500; | ||||
|     int t_out; | ||||
|     std::deque<Prev>::iterator it; | ||||
|     int decoding_length_mismatch; | ||||
|     int overstep_length; | ||||
|     int n_im = 0; | ||||
|  | ||||
|     VLOG(FLOW) << "do_tb_and_decode(): requested_decoding_length=" << requested_decoding_length; | ||||
|     // decode only decode_length bits -> overstep newer bits which are too much | ||||
|     decoding_length_mismatch = static_cast<int>(d_trellis_paths.size()) - (traceback_length + requested_decoding_length); | ||||
|     const int decoding_length_mismatch = static_cast<int>(d_trellis_paths.size()) - (traceback_length + requested_decoding_length); | ||||
|     VLOG(BLOCK) << "decoding_length_mismatch=" << decoding_length_mismatch; | ||||
|     overstep_length = decoding_length_mismatch >= 0 ? decoding_length_mismatch : 0; | ||||
|     const int overstep_length = decoding_length_mismatch >= 0 ? decoding_length_mismatch : 0; | ||||
|     VLOG(BLOCK) << "overstep_length=" << overstep_length; | ||||
|  | ||||
|     for (it = d_trellis_paths.begin() + traceback_length; | ||||
| @@ -290,7 +281,7 @@ int Viterbi_Decoder::do_tb_and_decode(int traceback_length, int requested_decodi | ||||
|         { | ||||
|             state = it->get_anchestor_state_of_current_state(state); | ||||
|         } | ||||
|     t_out = static_cast<int>(d_trellis_paths.end() - (d_trellis_paths.begin() + traceback_length + overstep_length) - 1);  // requested_decoding_length-1; | ||||
|     int t_out = static_cast<int>(d_trellis_paths.end() - (d_trellis_paths.begin() + traceback_length + overstep_length) - 1);  // requested_decoding_length-1; | ||||
|     indicator_metric = 0; | ||||
|     for (it = d_trellis_paths.begin() + traceback_length + overstep_length; it < d_trellis_paths.end(); ++it) | ||||
|         { | ||||
| @@ -358,8 +349,7 @@ void Viterbi_Decoder::nsc_transit(int output_p[], int trans_p[], int input, cons | ||||
| { | ||||
|     int nextstate[1]; | ||||
|     int state; | ||||
|     int states; | ||||
|     states = static_cast<int>(1U << (KK - 1)); /* The number of states: 2^mm */ | ||||
|     const int states = static_cast<int>(1U << (KK - 1)); /* The number of states: 2^mm */ | ||||
|  | ||||
|     /* Determine the output and next state for each possible starting state */ | ||||
|     for (state = 0; state < states; state++) | ||||
| @@ -411,6 +401,7 @@ int Viterbi_Decoder::nsc_enc_bit(int state_out_p[], int input, int state_in, | ||||
|     return (out); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* function parity_counter() | ||||
|  | ||||
|  Description: Determines if a symbol has odd (1) or even (0) parity | ||||
|   | ||||
| @@ -41,7 +41,7 @@ GalileoE5bDllPllTracking::GalileoE5bDllPllTracking( | ||||
|     DLOG(INFO) << "role " << role; | ||||
|     trk_params.SetFromConfiguration(configuration, role); | ||||
|  | ||||
|     auto vector_length = static_cast<int>(std::round(trk_params.fs_in / (GALILEO_E5B_CODE_CHIP_RATE_CPS / GALILEO_E5B_CODE_LENGTH_CHIPS))); | ||||
|     const auto vector_length = static_cast<int>(std::round(trk_params.fs_in / (GALILEO_E5B_CODE_CHIP_RATE_CPS / GALILEO_E5B_CODE_LENGTH_CHIPS))); | ||||
|     trk_params.vector_length = vector_length; | ||||
|     if (trk_params.extend_correlation_symbols < 1) | ||||
|         { | ||||
| @@ -58,7 +58,7 @@ GalileoE5bDllPllTracking::GalileoE5bDllPllTracking( | ||||
|             std::cout << TEXT_RED << "WARNING: Galileo E5b. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << '\n'; | ||||
|         } | ||||
|     trk_params.system = 'E'; | ||||
|     std::array<char, 3> sig_{'7', 'X', '\0'}; | ||||
|     const std::array<char, 3> sig_{'7', 'X', '\0'}; | ||||
|     std::memcpy(trk_params.signal, sig_.data(), 3); | ||||
|  | ||||
|     // ################# Make a GNU Radio Tracking block object ################ | ||||
|   | ||||
| @@ -693,7 +693,7 @@ void dll_pll_veml_tracking::start_tracking() | ||||
|     else if (d_systemName == "Galileo" and d_signal_type == "7X") | ||||
|         { | ||||
|             volk_gnsssdr::vector<gr_complex> aux_code(d_code_length_chips); | ||||
|             std::array<char, 3> signal_type_ = {{'7', 'X', '\0'}}; | ||||
|             const std::array<char, 3> signal_type_ = {{'7', 'X', '\0'}}; | ||||
|             galileo_e5_b_code_gen_complex_primary(aux_code, d_acquisition_gnss_synchro->PRN, signal_type_); | ||||
|             if (d_trk_parameters.track_pilot) | ||||
|                 { | ||||
| @@ -1076,10 +1076,10 @@ void dll_pll_veml_tracking::run_dll_pll() | ||||
|  | ||||
|                     if (d_dll_filt_history.full()) | ||||
|                         { | ||||
|                             float avg_code_error_chips_s = static_cast<float>(std::accumulate(d_dll_filt_history.begin(), d_dll_filt_history.end(), 0.0)) / static_cast<float>(d_dll_filt_history.capacity()); | ||||
|                             const float avg_code_error_chips_s = static_cast<float>(std::accumulate(d_dll_filt_history.begin(), d_dll_filt_history.end(), 0.0)) / static_cast<float>(d_dll_filt_history.capacity()); | ||||
|                             if (std::fabs(avg_code_error_chips_s) > 1.0) | ||||
|                                 { | ||||
|                                     float carrier_doppler_error_hz = static_cast<float>(d_signal_carrier_freq) * avg_code_error_chips_s / static_cast<float>(d_code_chip_rate); | ||||
|                                     const float carrier_doppler_error_hz = static_cast<float>(d_signal_carrier_freq) * avg_code_error_chips_s / static_cast<float>(d_code_chip_rate); | ||||
|                                     LOG(INFO) << "Detected and corrected carrier doppler error: " << carrier_doppler_error_hz << " [Hz] on sat " << Gnss_Satellite(d_systemName, d_acquisition_gnss_synchro->PRN); | ||||
|                                     d_carrier_loop_filter.initialize(static_cast<float>(d_carrier_doppler_hz) - carrier_doppler_error_hz); | ||||
|                                     d_corrected_doppler = true; | ||||
|   | ||||
| @@ -98,7 +98,7 @@ float cn0_m2m4_estimator(const gr_complex* Prompt_buffer, int length, float coh_ | ||||
|     float m_2 = 0.0; | ||||
|     float m_4 = 0.0; | ||||
|     float aux; | ||||
|     auto n = static_cast<float>(length); | ||||
|     const auto n = static_cast<float>(length); | ||||
|     for (int i = 0; i < length; i++) | ||||
|         { | ||||
|             Psig += std::abs(Prompt_buffer[i].real()); | ||||
|   | ||||
| @@ -30,7 +30,7 @@ | ||||
| void Tracking_2nd_DLL_filter::calculate_lopp_coef(float* tau1, float* tau2, float lbw, float zeta, float k) | ||||
| { | ||||
|     // Solve natural frequency | ||||
|     float Wn = lbw * 8.0F * zeta / (4.0F * zeta * zeta + 1.0F); | ||||
|     const float Wn = lbw * 8.0F * zeta / (4.0F * zeta * zeta + 1.0F); | ||||
|     // solve for t1 & t2 | ||||
|     *tau1 = k / (Wn * Wn); | ||||
|     *tau2 = 2.0F * zeta / Wn; | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
| void Tracking_2nd_PLL_filter::calculate_lopp_coef(float* tau1, float* tau2, float lbw, float zeta, float k) | ||||
| { | ||||
|     // Solve natural frequency | ||||
|     float Wn = lbw * 8.0F * zeta / (4.0F * zeta * zeta + 1.0F); | ||||
|     const float Wn = lbw * 8.0F * zeta / (4.0F * zeta * zeta + 1.0F); | ||||
|     // solve for t1 & t2 | ||||
|     *tau1 = k / (Wn * Wn); | ||||
|     *tau2 = 2.0F * zeta / Wn; | ||||
|   | ||||
| @@ -105,8 +105,7 @@ float Tracking_FLL_PLL_filter::get_carrier_error(float FLL_discriminator, float | ||||
|             /* | ||||
|              * 2nd order PLL with 1st order FLL assist | ||||
|              */ | ||||
|             float pll_w_new; | ||||
|             pll_w_new = d_pll_w + PLL_discriminator * d_pll_w0p2 * correlation_time_s + FLL_discriminator * d_pll_w0f * correlation_time_s; | ||||
|             const float pll_w_new = d_pll_w + PLL_discriminator * d_pll_w0p2 * correlation_time_s + FLL_discriminator * d_pll_w0f * correlation_time_s; | ||||
|             carrier_error_hz = 0.5F * (pll_w_new + d_pll_w) + d_pll_a2 * d_pll_w0p * PLL_discriminator; | ||||
|             d_pll_w = pll_w_new; | ||||
|             /* std::cout << " d_pll_w = " << carrier_error_hz << ", pll_w_new = " << pll_w_new | ||||
|   | ||||
| @@ -54,10 +54,8 @@ double phase_unwrap(double phase_rad) | ||||
|  */ | ||||
| double fll_four_quadrant_atan(gr_complex prompt_s1, gr_complex prompt_s2, double t1, double t2) | ||||
| { | ||||
|     float cross; | ||||
|     float dot; | ||||
|     dot = prompt_s1.real() * prompt_s2.real() + prompt_s1.imag() * prompt_s2.imag(); | ||||
|     cross = prompt_s1.real() * prompt_s2.imag() - prompt_s2.real() * prompt_s1.imag(); | ||||
|     const float dot = prompt_s1.real() * prompt_s2.real() + prompt_s1.imag() * prompt_s2.imag(); | ||||
|     const float cross = prompt_s1.real() * prompt_s2.imag() - prompt_s2.real() * prompt_s1.imag(); | ||||
|     return std::atan2(cross, dot) / (t2 - t1); | ||||
| } | ||||
|  | ||||
| @@ -120,9 +118,9 @@ double pll_cloop_two_quadrant_atan(gr_complex prompt_s1) | ||||
|  */ | ||||
| double dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1, float spc, float slope, float y_intercept) | ||||
| { | ||||
|     double P_early = std::abs(early_s1); | ||||
|     double P_late = std::abs(late_s1); | ||||
|     double E_plus_L = P_early + P_late; | ||||
|     const double P_early = std::abs(early_s1); | ||||
|     const double P_late = std::abs(late_s1); | ||||
|     const double E_plus_L = P_early + P_late; | ||||
|     if (E_plus_L == 0.0) | ||||
|         { | ||||
|             return 0.0; | ||||
| @@ -142,10 +140,9 @@ double dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1, floa | ||||
|  */ | ||||
| double dll_nc_vemlp_normalized(gr_complex very_early_s1, gr_complex early_s1, gr_complex late_s1, gr_complex very_late_s1) | ||||
| { | ||||
|     double Early = std::sqrt(very_early_s1.real() * very_early_s1.real() + very_early_s1.imag() * very_early_s1.imag() + early_s1.real() * early_s1.real() + early_s1.imag() * early_s1.imag()); | ||||
|     double Late = std::sqrt(late_s1.real() * late_s1.real() + late_s1.imag() * late_s1.imag() + very_late_s1.real() * very_late_s1.real() + very_late_s1.imag() * very_late_s1.imag()); | ||||
|  | ||||
|     double E_plus_L = Early + Late; | ||||
|     const double Early = std::sqrt(very_early_s1.real() * very_early_s1.real() + very_early_s1.imag() * very_early_s1.imag() + early_s1.real() * early_s1.real() + early_s1.imag() * early_s1.imag()); | ||||
|     const double Late = std::sqrt(late_s1.real() * late_s1.real() + late_s1.imag() * late_s1.imag() + very_late_s1.real() * very_late_s1.real() + very_late_s1.imag() * very_late_s1.imag()); | ||||
|     const double E_plus_L = Early + Late; | ||||
|     if (E_plus_L == 0.0) | ||||
|         { | ||||
|             return 0.0; | ||||
|   | ||||
| @@ -104,9 +104,9 @@ void Tracking_loop_filter::update_coefficients() | ||||
|  | ||||
|     // Natural frequency | ||||
|     float wn; | ||||
|     float T = d_update_interval; | ||||
|     const float T = d_update_interval; | ||||
|  | ||||
|     float zeta = 1.0F / std::sqrt(2.0F); | ||||
|     const float zeta = 1.0F / std::sqrt(2.0F); | ||||
|  | ||||
|     // The following is based on the bilinear transform approximation of | ||||
|     // the analog integrator. The loop format is from Kaplan & Hegarty | ||||
| @@ -167,8 +167,8 @@ void Tracking_loop_filter::update_coefficients() | ||||
|             break; | ||||
|         case 3: | ||||
|             wn = d_noise_bandwidth / 0.7845F;  // From Kaplan | ||||
|             float a3 = 1.1; | ||||
|             float b3 = 2.4; | ||||
|             const float a3 = 1.1; | ||||
|             const float b3 = 2.4; | ||||
|             g1 = wn * wn * wn; | ||||
|             g2 = a3 * wn * wn; | ||||
|             g3 = b3 * wn; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Carles Fernandez
					Carles Fernandez