diff options
author | Johnathan Corgan <johnathan@corganlabs.com> | 2017-04-03 09:33:04 -0700 |
---|---|---|
committer | Johnathan Corgan <johnathan@corganlabs.com> | 2017-04-03 09:33:04 -0700 |
commit | e24b3a8a8d6534a0c922aec7ac3d494ccc1773fa (patch) | |
tree | 2d0deffc937fa4dcea13a891bbef07185fb6b86e | |
parent | b67e493b7d0a2b9da1e64f8ba8232b6d0b7d4207 (diff) | |
parent | c4d4e34dfc3d94ebd8c7b7e9c9872f394f46f808 (diff) |
Merge branch 'master' into next
-rw-r--r-- | gr-digital/grc/digital_costas_loop_cc.xml | 10 | ||||
-rw-r--r-- | gr-digital/lib/costas_loop_cc_impl.cc | 66 |
2 files changed, 36 insertions, 40 deletions
diff --git a/gr-digital/grc/digital_costas_loop_cc.xml b/gr-digital/grc/digital_costas_loop_cc.xml index 40db3a4a6f..23e3ca9037 100644 --- a/gr-digital/grc/digital_costas_loop_cc.xml +++ b/gr-digital/grc/digital_costas_loop_cc.xml @@ -61,4 +61,14 @@ <type>float</type> <optional>1</optional> </source> + <source> + <name>phase</name> + <type>float</type> + <optional>1</optional> + </source> + <source> + <name>error</name> + <type>float</type> + <optional>1</optional> + </source> </block> diff --git a/gr-digital/lib/costas_loop_cc_impl.cc b/gr-digital/lib/costas_loop_cc_impl.cc index d29d95684a..edf0db33ef 100644 --- a/gr-digital/lib/costas_loop_cc_impl.cc +++ b/gr-digital/lib/costas_loop_cc_impl.cc @@ -41,10 +41,13 @@ namespace gr { (new costas_loop_cc_impl(loop_bw, order, use_snr)); } + static int ios[] = { sizeof(gr_complex), sizeof(float), sizeof(float), sizeof(float) }; + static std::vector<int> iosig(ios, ios+sizeof(ios)/sizeof(int)); + costas_loop_cc_impl::costas_loop_cc_impl(float loop_bw, int order, bool use_snr) : sync_block("costas_loop_cc", io_signature::make(1, 1, sizeof(gr_complex)), - io_signature::make2(1, 2, sizeof(gr_complex), sizeof(float))), + io_signature::makev(1, 4, iosig)), blocks::control_loop(loop_bw, 1.0, -1.0), d_order(order), d_error(0), d_noise(1.0), d_phase_detector(NULL) { @@ -180,9 +183,9 @@ namespace gr { { const gr_complex *iptr = (gr_complex *) input_items[0]; gr_complex *optr = (gr_complex *) output_items[0]; - float *foptr = (float *) output_items[1]; - - bool write_foptr = output_items.size() >= 2; + float *freq_optr = output_items.size() >= 2 ? (float *) output_items[1] : NULL; + float *phase_optr = output_items.size() >= 3 ? (float *) output_items[2] : NULL; + float *error_optr = output_items.size() >= 4 ? (float *) output_items[3] : NULL; gr_complex nco_out; @@ -191,47 +194,30 @@ namespace gr { nitems_read(0)+noutput_items, pmt::intern("phase_est")); - if(write_foptr) { - for(int i = 0; i < noutput_items; i++) { - if(tags.size() > 0) { - if(tags[0].offset-nitems_read(0) == (size_t)i) { - d_phase = (float)pmt::to_double(tags[0].value); - tags.erase(tags.begin()); - } + for(int i = 0; i < noutput_items; i++) { + if(tags.size() > 0) { + if(tags[0].offset-nitems_read(0) == (size_t)i) { + d_phase = (float)pmt::to_double(tags[0].value); + tags.erase(tags.begin()); } - - nco_out = gr_expj(-d_phase); - optr[i] = iptr[i] * nco_out; - - d_error = (*this.*d_phase_detector)(optr[i]); - d_error = gr::branchless_clip(d_error, 1.0); - - advance_loop(d_error); - phase_wrap(); - frequency_limit(); - - foptr[i] = d_freq; } - } - else { - for(int i = 0; i < noutput_items; i++) { - if(tags.size() > 0) { - if(tags[0].offset-nitems_read(0) == (size_t)i) { - d_phase = (float)pmt::to_double(tags[0].value); - tags.erase(tags.begin()); - } - } - nco_out = gr_expj(-d_phase); - optr[i] = iptr[i] * nco_out; + nco_out = gr_expj(-d_phase); + optr[i] = iptr[i] * nco_out; - d_error = (*this.*d_phase_detector)(optr[i]); - d_error = gr::branchless_clip(d_error, 1.0); + d_error = (*this.*d_phase_detector)(optr[i]); + d_error = gr::branchless_clip(d_error, 1.0); - advance_loop(d_error); - phase_wrap(); - frequency_limit(); - } + advance_loop(d_error); + phase_wrap(); + frequency_limit(); + + if (freq_optr != NULL) + freq_optr[i] = d_freq; + if (phase_optr != NULL) + phase_optr[i] = d_phase; + if (error_optr != NULL) + error_optr[i] = d_error; } return noutput_items; |