diff options
Diffstat (limited to 'gr-digital/lib/costas_loop_cc_impl.cc')
-rw-r--r-- | gr-digital/lib/costas_loop_cc_impl.cc | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/gr-digital/lib/costas_loop_cc_impl.cc b/gr-digital/lib/costas_loop_cc_impl.cc index c3b30834eb..4129dd05fa 100644 --- a/gr-digital/lib/costas_loop_cc_impl.cc +++ b/gr-digital/lib/costas_loop_cc_impl.cc @@ -50,36 +50,8 @@ costas_loop_cc_impl::costas_loop_cc_impl(float loop_bw, int order, bool use_snr) d_order(order), d_error(0), d_noise(1.0), - d_phase_detector(NULL) + d_phase_detector(choose_phase_detector(order, use_snr)) { - // Set up the phase detector to use based on the constellation order - switch (d_order) { - case 2: - if (use_snr) - d_phase_detector = &costas_loop_cc_impl::phase_detector_snr_2; - else - d_phase_detector = &costas_loop_cc_impl::phase_detector_2; - break; - - case 4: - if (use_snr) - d_phase_detector = &costas_loop_cc_impl::phase_detector_snr_4; - else - d_phase_detector = &costas_loop_cc_impl::phase_detector_4; - break; - - case 8: - if (use_snr) - d_phase_detector = &costas_loop_cc_impl::phase_detector_snr_8; - else - d_phase_detector = &costas_loop_cc_impl::phase_detector_8; - break; - - default: - throw std::invalid_argument("order must be 2, 4, or 8"); - break; - } - message_port_register_in(pmt::mp("noise")); set_msg_handler(pmt::mp("noise"), boost::bind(&costas_loop_cc_impl::handle_set_noise, this, _1)); @@ -87,6 +59,30 @@ costas_loop_cc_impl::costas_loop_cc_impl(float loop_bw, int order, bool use_snr) costas_loop_cc_impl::~costas_loop_cc_impl() {} +costas_loop_cc_impl::d_phase_detector_t costas_loop_cc_impl::choose_phase_detector(int order, bool use_snr) +{ + switch (order) { + case 2: + if (use_snr) { + return &costas_loop_cc_impl::phase_detector_snr_2; + } + return &costas_loop_cc_impl::phase_detector_2; + + case 4: + if (use_snr) { + return &costas_loop_cc_impl::phase_detector_snr_4; + } + return &costas_loop_cc_impl::phase_detector_4; + + case 8: + if (use_snr) { + return &costas_loop_cc_impl::phase_detector_snr_8; + } + return &costas_loop_cc_impl::phase_detector_8; + } + throw std::invalid_argument("order must be 2, 4, or 8"); +} + float costas_loop_cc_impl::phase_detector_8(gr_complex sample) const { /* This technique splits the 8PSK constellation into 2 squashed @@ -103,7 +99,7 @@ float costas_loop_cc_impl::phase_detector_8(gr_complex sample) const Circuits and Systems, Vol. 2, pp. 1447 - 1450, 2004. */ - float K = (sqrt(2.0) - 1); + const float K = (sqrt(2.0) - 1); if (fabsf(sample.real()) >= fabsf(sample.imag())) { return ((sample.real() > 0 ? 1.0 : -1.0) * sample.imag() - (sample.imag() > 0 ? 1.0 : -1.0) * sample.real() * K); @@ -126,8 +122,8 @@ float costas_loop_cc_impl::phase_detector_2(gr_complex sample) const float costas_loop_cc_impl::phase_detector_snr_8(gr_complex sample) const { - float K = (sqrt(2.0) - 1); - float snr = abs(sample) * abs(sample) / d_noise; + const float K = (sqrt(2.0) - 1); + const float snr = abs(sample) * abs(sample) / d_noise; if (fabsf(sample.real()) >= fabsf(sample.imag())) { return ((blocks::tanhf_lut(snr * sample.real()) * sample.imag()) - (blocks::tanhf_lut(snr * sample.imag()) * sample.real() * K)); @@ -139,14 +135,14 @@ float costas_loop_cc_impl::phase_detector_snr_8(gr_complex sample) const float costas_loop_cc_impl::phase_detector_snr_4(gr_complex sample) const { - float snr = abs(sample) * abs(sample) / d_noise; + const float snr = abs(sample) * abs(sample) / d_noise; return ((blocks::tanhf_lut(snr * sample.real()) * sample.imag()) - (blocks::tanhf_lut(snr * sample.imag()) * sample.real())); } float costas_loop_cc_impl::phase_detector_snr_2(gr_complex sample) const { - float snr = abs(sample) * abs(sample) / d_noise; + const float snr = abs(sample) * abs(sample) / d_noise; return blocks::tanhf_lut(snr * sample.real()) * sample.imag(); } |