summaryrefslogtreecommitdiff
path: root/gr-digital/lib/costas_loop_cc_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/costas_loop_cc_impl.cc')
-rw-r--r--gr-digital/lib/costas_loop_cc_impl.cc64
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();
}