From: Johnathan Corgan Date: Sat, 29 Aug 2009 18:12:37 +0000 (-0700) Subject: Work in progress, incomplete X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=6b6a5522e0b1d12ef5d697b1067a87dfe584cec6;p=debian%2Fgnuradio Work in progress, incomplete * Renamed noaa.carrier_pll_cc to noaa.hrpt_pll_cc * Added nop noaa.hrpt_sync_cc * Renamed grc apps to use usrp_ prefix and protocol name * Installed grc generated scripts to path --- diff --git a/gr-noaa/grc/Makefile.am b/gr-noaa/grc/Makefile.am index 18144040..c7552977 100644 --- a/gr-noaa/grc/Makefile.am +++ b/gr-noaa/grc/Makefile.am @@ -22,9 +22,15 @@ include $(top_srcdir)/Makefile.common grcblocksdir = $(prefix)/share/gnuradio/grc/blocks + +dist_bin_SCRIPTS = \ + usrp_rx_hrpt.py \ + usrp_rx_lrit.py + dist_grcblocks_DATA = \ - noaa_carrier_pll_cc.xml + noaa_hrpt_pll_cc.xml \ + noaa_hrpt_sync_cc.xml EXTRA_DIST = \ - rx_goes.grc \ - rx_poes.grc + usrp_rx_hrpt.grc \ + usrp_rx_lrit.grc diff --git a/gr-noaa/grc/noaa_carrier_pll_cc.xml b/gr-noaa/grc/noaa_carrier_pll_cc.xml deleted file mode 100644 index 7b1fdc8f..00000000 --- a/gr-noaa/grc/noaa_carrier_pll_cc.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - Carrier PLL - noaa_carrier_pll_cc - NOAA - from gnuradio import noaa - noaa.carrier_pll_cc($alpha, $beta, $max_offset) - set_alpha($alpha) - set_beta($beta) - set_max_offset($max_offset) - - Alpha - alpha - real - - - Beta - beta - real - - - Max Offset - max_offset - real - - - in - complex - - - out - complex - - diff --git a/gr-noaa/grc/noaa_hrpt_pll_cc.xml b/gr-noaa/grc/noaa_hrpt_pll_cc.xml new file mode 100644 index 00000000..e56e0b05 --- /dev/null +++ b/gr-noaa/grc/noaa_hrpt_pll_cc.xml @@ -0,0 +1,34 @@ + + + HRPT PLL + noaa_hrpt_pll_cc + NOAA + from gnuradio import noaa + noaa.hrpt_pll_cc($alpha, $beta, $max_offset) + set_alpha($alpha) + set_beta($beta) + set_max_offset($max_offset) + + Alpha + alpha + real + + + Beta + beta + real + + + Max Offset + max_offset + real + + + in + complex + + + out + complex + + diff --git a/gr-noaa/grc/noaa_hrpt_sync_cc.xml b/gr-noaa/grc/noaa_hrpt_sync_cc.xml new file mode 100644 index 00000000..d311aa94 --- /dev/null +++ b/gr-noaa/grc/noaa_hrpt_sync_cc.xml @@ -0,0 +1,39 @@ + + + HRPT SYNC + noaa_hrpt_sync_cc + NOAA + from gnuradio import noaa + noaa.hrpt_sync_cc($alpha, $beta, $sps, $max_offset) + set_alpha($alpha) + set_beta($beta) + set_max_offset($max_offset) + + Alpha + alpha + real + + + Beta + beta + real + + + Samples/Symbol + sps + real + + + Max Offset + max_offset + real + + + in + complex + + + out + complex + + diff --git a/gr-noaa/grc/rx_goes.grc b/gr-noaa/grc/rx_goes.grc deleted file mode 100755 index ebd21da4..00000000 --- a/gr-noaa/grc/rx_goes.grc +++ /dev/null @@ -1,1454 +0,0 @@ - - - Sat Aug 1 22:58:41 2009 - - options - - id - rx_goes - - - _enabled - True - - - title - USRP GOES Receiver - - - author - - - - description - - - - window_size - 4095, 4095 - - - generate_options - wx_gui - - - category - Custom - - - run - True - - - realtime_scheduling - - - - _coordinate - (10, 10) - - - _rotation - 0 - - - - variable - - id - samp_rate - - - _enabled - True - - - value - 64e6/decim - - - _coordinate - (10, 81) - - - _rotation - 0 - - - - variable - - id - symbol_rate - - - _enabled - True - - - value - 293e3 - - - _coordinate - (11, 148) - - - _rotation - 0 - - - - variable - - id - sps - - - _enabled - True - - - value - samp_rate/symbol_rate - - - _coordinate - (12, 214) - - - _rotation - 0 - - - - variable_slider - - id - gain - - - _enabled - True - - - label - Gain - - - value - saved_gain - - - min - 0 - - - max - 115 - - - num_steps - 115 - - - style - wx.SL_HORIZONTAL - - - converver - float_converter - - - grid_pos - 0, 1, 1, 1 - - - notebook - - - - _coordinate - (392, 12) - - - _rotation - 0 - - - - variable_config - - id - saved_gain - - - _enabled - True - - - value - 33 - - - type - real - - - config_file - rx_goes.cfg - - - section - main - - - option - gain - - - writeback - gain - - - _coordinate - (392, 163) - - - _rotation - 0 - - - - variable_config - - id - saved_gain_mu - - - _enabled - True - - - value - 0.005 - - - type - real - - - config_file - rx_goes.cfg - - - section - main - - - option - gain_mu - - - writeback - gain_mu - - - _coordinate - (835, 162) - - - _rotation - 0 - - - - variable_config - - id - saved_costas_alpha - - - _enabled - True - - - value - 0.005 - - - type - real - - - config_file - rx_goes.cfg - - - section - main - - - option - costas_alpha - - - writeback - costas_alpha - - - _coordinate - (688, 162) - - - _rotation - 0 - - - - variable_slider - - id - gain_mu - - - _enabled - True - - - label - Gain Mu - - - value - saved_gain_mu - - - min - 0 - - - max - 0.5 - - - num_steps - 100 - - - style - wx.SL_HORIZONTAL - - - converver - float_converter - - - grid_pos - 1, 1, 1, 1 - - - notebook - - - - _coordinate - (833, 14) - - - _rotation - 0 - - - - variable_slider - - id - costas_alpha - - - _enabled - True - - - label - Costas Alpha - - - value - saved_costas_alpha - - - min - 0 - - - max - 0.5 - - - num_steps - 100 - - - style - wx.SL_HORIZONTAL - - - converver - float_converter - - - grid_pos - 1, 0, 1, 1 - - - notebook - - - - _coordinate - (688, 13) - - - _rotation - 0 - - - - variable_slider - - id - freq - - - _enabled - True - - - label - Frequency - - - value - saved_freq - - - min - 135e6 - - - max - 139e6 - - - num_steps - 400 - - - style - wx.SL_HORIZONTAL - - - converver - float_converter - - - grid_pos - 0, 2, 1, 1 - - - notebook - - - - _coordinate - (540, 13) - - - _rotation - 0 - - - - variable_config - - id - saved_freq - - - _enabled - True - - - value - 137e6 - - - type - real - - - config_file - rx_goes.cfg - - - section - main - - - option - freq - - - writeback - freq - - - _coordinate - (541, 162) - - - _rotation - 0 - - - - variable_config - - id - saved_decim - - - _enabled - True - - - value - 160 - - - type - int - - - config_file - rx_goes.cfg - - - section - main - - - option - decim - - - writeback - decim - - - _coordinate - (245, 161) - - - _rotation - 0 - - - - variable_text_box - - id - decim - - - _enabled - True - - - label - Decim - - - value - saved_decim - - - converver - int_converter - - - formatter - None - - - grid_pos - 0, 0, 1, 1 - - - notebook - - - - _coordinate - (243, 13) - - - _rotation - 0 - - - - notebook - - id - displays - - - _enabled - True - - - style - wx.NB_TOP - - - labels - ['USRP RX', 'Costas Output'] - - - grid_pos - 2, 0, 1, 3 - - - notebook - - - - _coordinate - (12, 287) - - - _rotation - 0 - - - - wxgui_scopesink2 - - id - wxgui_scopesink2_0 - - - _enabled - True - - - type - complex - - - title - Waveform - - - samp_rate - samp_rate - - - v_scale - 0.5 - - - t_scale - 20.0/samp_rate - - - ac_couple - False - - - xy_mode - True - - - num_inputs - 1 - - - grid_pos - 1, 0, 1, 1 - - - notebook - displays, 0 - - - _coordinate - (434, 551) - - - _rotation - 0 - - - - gr_agc_xx - - id - gr_agc_xx_0 - - - _enabled - True - - - type - complex - - - rate - 1e-6 - - - reference - 1.0 - - - gain - 1.0/32767.0 - - - max_gain - 1.0 - - - _coordinate - (261, 493) - - - _rotation - 0 - - - - root_raised_cosine_filter - - id - root_raised_cosine_filter_0 - - - _enabled - False - - - type - fir_filter_ccf - - - decim - 1 - - - interp - 1 - - - gain - 1 - - - samp_rate - samp_rate - - - sym_rate - symbol_rate - - - alpha - 0.5 - - - ntaps - 50 - - - _coordinate - (618, 373) - - - _rotation - 0 - - - - usrp_simple_source_x - - id - usrp_simple_source_x_0 - - - _enabled - False - - - type - complex - - - format - - - - which - 0 - - - decimation - decim - - - frequency - freq - - - lo_offset - float('inf') - - - gain - gain - - - side - B - - - rx_ant - RXA - - - hb_filters - - - - _coordinate - (11, 477) - - - _rotation - 0 - - - - wxgui_fftsink2 - - id - wxgui_fftsink2_0 - - - _enabled - True - - - type - complex - - - title - Spectrum - - - samp_rate - samp_rate - - - baseband_freq - freq - - - y_per_div - 10 - - - y_divs - 10 - - - ref_level - 50 - - - fft_size - 1024 - - - fft_rate - 30 - - - peak_hold - False - - - average - False - - - avg_alpha - 0 - - - grid_pos - 0, 0, 1, 1 - - - notebook - displays, 0 - - - _coordinate - (434, 337) - - - _rotation - 0 - - - - gr_throttle - - id - gr_throttle_0 - - - _enabled - True - - - type - complex - - - samples_per_second - samp_rate - - - vlen - 1 - - - _coordinate - (181, 663) - - - _rotation - 0 - - - - wxgui_scopesink2 - - id - wxgui_scopesink2_1 - - - _enabled - True - - - type - complex - - - title - Scope Plot - - - samp_rate - samp_rate - - - v_scale - 0.4 - - - t_scale - 20.0/samp_rate - - - ac_couple - False - - - xy_mode - True - - - num_inputs - 1 - - - grid_pos - 0, 0, 1, 1 - - - notebook - displays, 1 - - - _coordinate - (1126, 251) - - - _rotation - 0 - - - - gr_probe_mpsk_snr_c - - id - gr_probe_mpsk_snr_c_0 - - - _enabled - True - - - type - snr - - - alpha - 0.0001 - - - probe_rate - 10 - - - _coordinate - (1126, 723) - - - _rotation - 0 - - - - wxgui_numbersink2 - - id - wxgui_numbersink2_0 - - - _enabled - True - - - type - float - - - title - SNR - - - units - dB - - - samp_rate - 10 - - - min_value - 0 - - - max_value - 30 - - - factor - 1.0 - - - decimal_places - 1 - - - ref_level - 0 - - - number_rate - 10 - - - peak_hold - False - - - average - False - - - avg_alpha - 0 - - - show_gauge - True - - - grid_pos - 2, 0, 1, 1 - - - notebook - displays, 1 - - - _coordinate - (1335, 651) - - - _rotation - 0 - - - - gr_mpsk_receiver_cc - - id - gr_mpsk_receiver_cc_0 - - - _enabled - True - - - M - 2 - - - theta - 0 - - - alpha - costas_alpha - - - beta - costas_alpha*costas_alpha/4.0 - - - fmin - -0.05 - - - fmax - 0.05 - - - mu - 0.5 - - - gain_mu - gain_mu - - - omega - sps - - - gain_omega - gain_mu*gain_mu/4.0 - - - omega_relative_limit - 0.05 - - - _coordinate - (881, 437) - - - _rotation - 0 - - - - gr_complex_to_real - - id - gr_complex_to_real_0 - - - _enabled - True - - - vlen - 1 - - - _coordinate - (1133, 521) - - - _rotation - 0 - - - - gr_char_to_float - - id - gr_char_to_float_0 - - - _enabled - True - - - _coordinate - (1523, 521) - - - _rotation - 0 - - - - gr_binary_slicer_fb - - id - gr_binary_slicer_fb_0 - - - _enabled - True - - - _coordinate - (1343, 521) - - - _rotation - 0 - - - - gr_add_const_vxx - - id - gr_add_const_vxx_0 - - - _enabled - True - - - type - float - - - const - 48.0 - - - vlen - 1 - - - _coordinate - (1707, 517) - - - _rotation - 0 - - - - gr_float_to_char - - id - gr_float_to_char_0 - - - _enabled - True - - - _coordinate - (1878, 521) - - - _rotation - 0 - - - - gr_file_sink - - id - gr_file_sink_0 - - - _enabled - True - - - file - bits.dat - - - type - byte - - - vlen - 1 - - - _coordinate - (2059, 517) - - - _rotation - 0 - - - - gr_file_source - - id - gr_file_source_0 - - - _enabled - True - - - file - lrit.dat - - - type - complex - - - repeat - False - - - vlen - 1 - - - _coordinate - (11, 655) - - - _rotation - 0 - - - - usrp_simple_source_x_0 - gr_agc_xx_0 - 0 - 0 - - - gr_agc_xx_0 - wxgui_scopesink2_0 - 0 - 0 - - - gr_file_source_0 - gr_throttle_0 - 0 - 0 - - - gr_throttle_0 - gr_agc_xx_0 - 0 - 0 - - - gr_probe_mpsk_snr_c_0 - wxgui_numbersink2_0 - 0 - 0 - - - gr_mpsk_receiver_cc_0 - gr_probe_mpsk_snr_c_0 - 0 - 0 - - - gr_agc_xx_0 - gr_mpsk_receiver_cc_0 - 0 - 0 - - - gr_mpsk_receiver_cc_0 - wxgui_scopesink2_1 - 0 - 0 - - - gr_agc_xx_0 - wxgui_fftsink2_0 - 0 - 0 - - - gr_mpsk_receiver_cc_0 - gr_complex_to_real_0 - 0 - 0 - - - gr_complex_to_real_0 - gr_binary_slicer_fb_0 - 0 - 0 - - - gr_binary_slicer_fb_0 - gr_char_to_float_0 - 0 - 0 - - - gr_char_to_float_0 - gr_add_const_vxx_0 - 0 - 0 - - - gr_add_const_vxx_0 - gr_float_to_char_0 - 0 - 0 - - - gr_float_to_char_0 - gr_file_sink_0 - 0 - 0 - - diff --git a/gr-noaa/grc/rx_poes.grc b/gr-noaa/grc/rx_poes.grc deleted file mode 100755 index 1001049a..00000000 --- a/gr-noaa/grc/rx_poes.grc +++ /dev/null @@ -1,806 +0,0 @@ - - - Sat Aug 22 13:06:22 2009 - - options - - id - rx_poes - - - _enabled - True - - - title - - - - author - - - - description - - - - window_size - 4096,4096 - - - generate_options - wx_gui - - - category - Custom - - - run - True - - - realtime_scheduling - - - - _coordinate - (10, 10) - - - _rotation - 0 - - - - variable - - id - decim - - - _enabled - True - - - value - 16 - - - _coordinate - (97, 10) - - - _rotation - 0 - - - - variable - - id - sym_rate - - - _enabled - True - - - value - 600*1109 - - - _coordinate - (286, 10) - - - _rotation - 0 - - - - variable - - id - sample_rate - - - _enabled - True - - - value - 64e6/decim - - - _coordinate - (176, 12) - - - _rotation - 0 - - - - variable - - id - sps - - - _enabled - True - - - value - sample_rate/sym_rate - - - _coordinate - (382, 14) - - - _rotation - 0 - - - - variable - - id - hs - - - _enabled - True - - - value - int(sps/2.0) - - - _coordinate - (492, 16) - - - _rotation - 0 - - - - import - - id - import_0 - - - _enabled - True - - - import - import math - - - _coordinate - (9, 202) - - - _rotation - 0 - - - - variable - - id - max_offset - - - _enabled - True - - - value - 2*math.pi*100e3/sample_rate - - - _coordinate - (342, 95) - - - _rotation - 0 - - - - variable_slider - - id - pll_alpha - - - _enabled - True - - - label - PLL Alpha - - - value - 0.005 - - - min - 0.0 - - - max - 0.5 - - - num_steps - 500 - - - style - wx.SL_HORIZONTAL - - - converver - float_converter - - - grid_pos - 0, 0, 1, 1 - - - notebook - - - - _coordinate - (192, 100) - - - _rotation - 0 - - - - gr_throttle - - id - throttle - - - _enabled - True - - - type - complex - - - samples_per_second - sample_rate - - - vlen - 1 - - - _coordinate - (79, 518) - - - _rotation - 0 - - - - gr_agc_xx - - id - agr - - - _enabled - True - - - type - complex - - - rate - 1e-6 - - - reference - 1.0 - - - gain - 1.0 - - - max_gain - 1.0 - - - _coordinate - (261, 494) - - - _rotation - 0 - - - - gr_moving_average_xx - - id - gr_moving_average_xx_0 - - - _enabled - True - - - type - complex - - - length - hs - - - scale - 1.0/hs - - - max_iter - 4000 - - - _coordinate - (429, 502) - - - _rotation - 0 - - - - noaa_carrier_pll_cc - - id - noaa_carrier_pll_cc_0 - - - _enabled - True - - - alpha - pll_alpha - - - beta - pll_alpha**2/4.0 - - - max_offset - max_offset - - - _coordinate - (636, 502) - - - _rotation - 0 - - - - wxgui_scopesink2 - - id - wxgui_scopesink2_0 - - - _enabled - True - - - type - complex - - - title - RX Waveform - - - samp_rate - sample_rate - - - v_scale - 0 - - - t_scale - 20.0/sample_rate - - - ac_couple - False - - - xy_mode - False - - - num_inputs - 1 - - - grid_pos - 1, 0, 1, 1 - - - notebook - displays, 0 - - - _coordinate - (433, 612) - - - _rotation - 0 - - - - wxgui_fftsink2 - - id - rx_fftsink - - - _enabled - True - - - type - complex - - - title - RX Spectrum - - - samp_rate - sample_rate - - - baseband_freq - 1698e6 - - - y_per_div - 5 - - - y_divs - 8 - - - ref_level - 20 - - - fft_size - 1024 - - - fft_rate - 30 - - - peak_hold - False - - - average - True - - - avg_alpha - 0.1 - - - grid_pos - 0, 0, 1, 1 - - - notebook - displays, 0 - - - _coordinate - (433, 241) - - - _rotation - 0 - - - - gr_complex_to_imag - - id - gr_complex_to_imag_0 - - - _enabled - True - - - vlen - 1 - - - _coordinate - (877, 522) - - - _rotation - 0 - - - - notebook - - id - displays - - - _enabled - True - - - style - wx.NB_TOP - - - labels - ['RX','Baseband'] - - - grid_pos - 1, 0, 1, 1 - - - notebook - - - - _coordinate - (9, 99) - - - _rotation - 0 - - - - wxgui_scopesink2 - - id - wxgui_scopesink2_0_1_0_1 - - - _enabled - True - - - type - float - - - title - Manchester Symbols - - - samp_rate - sample_rate - - - v_scale - 0.5 - - - t_scale - 5.0/sym_rate - - - ac_couple - False - - - xy_mode - False - - - num_inputs - 1 - - - grid_pos - 1, 0, 1, 1 - - - notebook - displays, 1 - - - _coordinate - (856, 343) - - - _rotation - 180 - - - - wxgui_scopesink2 - - id - wxgui_scopesink2_0_0 - - - _enabled - True - - - type - complex - - - title - Post-Filter/PLL - - - samp_rate - sample_rate - - - v_scale - 0.5 - - - t_scale - 20.0/sample_rate - - - ac_couple - False - - - xy_mode - False - - - num_inputs - 1 - - - grid_pos - 0, 0, 1, 1 - - - notebook - displays, 1 - - - _coordinate - (634, 335) - - - _rotation - 180 - - - - gr_file_source - - id - src - - - _enabled - True - - - file - poes-d16.dat - - - type - complex - - - repeat - True - - - vlen - 1 - - - _coordinate - (34, 423) - - - _rotation - 0 - - - - src - throttle - 0 - 0 - - - noaa_carrier_pll_cc_0 - gr_complex_to_imag_0 - 0 - 0 - - - throttle - agr - 0 - 0 - - - agr - gr_moving_average_xx_0 - 0 - 0 - - - agr - rx_fftsink - 0 - 0 - - - agr - wxgui_scopesink2_0 - 0 - 0 - - - gr_moving_average_xx_0 - noaa_carrier_pll_cc_0 - 0 - 0 - - - noaa_carrier_pll_cc_0 - wxgui_scopesink2_0_0 - 0 - 0 - - - gr_complex_to_imag_0 - wxgui_scopesink2_0_1_0_1 - 0 - 0 - - diff --git a/gr-noaa/grc/usrp_rx_hrpt.grc b/gr-noaa/grc/usrp_rx_hrpt.grc new file mode 100644 index 00000000..d3c6603a --- /dev/null +++ b/gr-noaa/grc/usrp_rx_hrpt.grc @@ -0,0 +1,1026 @@ + + + Sat Aug 29 11:48:56 2009 + + options + + id + usrp_rx_hrpt + + + _enabled + True + + + title + USRP HRPT Receiver + + + author + + + + description + + + + window_size + 4096,4096 + + + generate_options + wx_gui + + + category + Custom + + + run + True + + + realtime_scheduling + + + + _coordinate + (10, 10) + + + _rotation + 0 + + + + import + + id + import_0 + + + _enabled + True + + + import + import math + + + _coordinate + (9, 202) + + + _rotation + 0 + + + + gr_throttle + + id + throttle + + + _enabled + True + + + type + complex + + + samples_per_second + sample_rate + + + vlen + 1 + + + _coordinate + (79, 518) + + + _rotation + 0 + + + + gr_file_source + + id + src + + + _enabled + True + + + file + poes-d16.dat + + + type + complex + + + repeat + True + + + vlen + 1 + + + _coordinate + (34, 423) + + + _rotation + 0 + + + + variable + + id + decim + + + _enabled + True + + + value + 16 + + + _coordinate + (186, 10) + + + _rotation + 0 + + + + variable + + id + hs + + + _enabled + True + + + value + int(sps/2.0) + + + _coordinate + (589, 13) + + + _rotation + 0 + + + + variable + + id + sym_rate + + + _enabled + True + + + value + 600*1109 + + + _coordinate + (383, 7) + + + _rotation + 0 + + + + variable + + id + sps + + + _enabled + True + + + value + sample_rate/sym_rate + + + _coordinate + (479, 11) + + + _rotation + 0 + + + + variable + + id + sample_rate + + + _enabled + True + + + value + 64e6/decim + + + _coordinate + (273, 9) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + rx_fftsink + + + _enabled + True + + + type + complex + + + title + RX Spectrum + + + samp_rate + sample_rate + + + baseband_freq + 1698e6 + + + y_per_div + 5 + + + y_divs + 8 + + + ref_level + 20 + + + fft_size + 1024 + + + fft_rate + 30 + + + peak_hold + False + + + average + True + + + avg_alpha + 0.1 + + + grid_pos + 0, 0, 1, 1 + + + notebook + displays, 0 + + + _coordinate + (194, 263) + + + _rotation + 180 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0 + + + _enabled + True + + + type + complex + + + title + RX Waveform + + + samp_rate + sample_rate + + + v_scale + 0 + + + t_scale + 20.0/sample_rate + + + ac_couple + False + + + xy_mode + False + + + num_inputs + 1 + + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 0 + + + _coordinate + (198, 609) + + + _rotation + 180 + + + + gr_agc_xx + + id + agr + + + _enabled + True + + + type + complex + + + rate + 1e-6 + + + reference + 1.0 + + + gain + 1.0 + + + max_gain + 1.0 + + + _coordinate + (261, 494) + + + _rotation + 0 + + + + gr_moving_average_xx + + id + gr_moving_average_xx_0 + + + _enabled + True + + + type + complex + + + length + hs + + + scale + 1.0/hs + + + max_iter + 4000 + + + _coordinate + (434, 502) + + + _rotation + 0 + + + + variable + + id + max_carrier_offset + + + _enabled + True + + + value + 2*math.pi*100e3/sample_rate + + + _coordinate + (668, 107) + + + _rotation + 0 + + + + variable + + id + max_sync_offset + + + _enabled + True + + + value + 0.01 + + + _coordinate + (665, 173) + + + _rotation + 0 + + + + variable_slider + + id + pll_alpha + + + _enabled + True + + + label + PLL Alpha + + + value + 0.005 + + + min + 0.0 + + + max + 0.5 + + + num_steps + 500 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 0, 1, 1 + + + notebook + + + + _coordinate + (192, 100) + + + _rotation + 0 + + + + variable_slider + + id + sync_alpha + + + _enabled + True + + + label + SYNC Alpha + + + value + 0.005 + + + min + 0.0 + + + max + 0.5 + + + num_steps + 500 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 1, 1, 1 + + + notebook + + + + _coordinate + (344, 101) + + + _rotation + 0 + + + + noaa_hrpt_pll_cc + + id + noaa_hrpt_pll_cc_0 + + + _enabled + True + + + alpha + pll_alpha + + + beta + pll_alpha**2/4.0 + + + max_offset + max_carrier_offset + + + _coordinate + (628, 502) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0_0 + + + _enabled + True + + + type + complex + + + title + Post-PLL + + + samp_rate + sample_rate + + + v_scale + 0.5 + + + t_scale + 20.0/sample_rate + + + ac_couple + False + + + xy_mode + False + + + num_inputs + 1 + + + grid_pos + 0, 0, 1, 1 + + + notebook + displays, 1 + + + _coordinate + (618, 335) + + + _rotation + 180 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0_0_1 + + + _enabled + True + + + type + complex + + + title + Post-SYNC + + + samp_rate + sample_rate + + + v_scale + 0.5 + + + t_scale + 20.0/sample_rate + + + ac_couple + False + + + xy_mode + False + + + num_inputs + 1 + + + grid_pos + 0, 0, 1, 1 + + + notebook + displays, 2 + + + _coordinate + (872, 341) + + + _rotation + 180 + + + + notebook + + id + displays + + + _enabled + True + + + style + wx.NB_TOP + + + labels + ['RX','PLL','SYNC'] + + + grid_pos + 1, 0, 1, 2 + + + notebook + + + + _coordinate + (9, 99) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0_0_0 + + + _enabled + True + + + type + complex + + + title + Post-PLL + + + samp_rate + sample_rate + + + v_scale + 0.5 + + + t_scale + 20.0/sample_rate + + + ac_couple + False + + + xy_mode + True + + + num_inputs + 1 + + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 1 + + + _coordinate + (618, 614) + + + _rotation + 180 + + + + noaa_hrpt_sync_cc + + id + sync + + + _enabled + True + + + alpha + sync_alpha + + + beta + sync_alpha**2/4.0 + + + sps + sps + + + max_offset + max_sync_offset + + + _coordinate + (865, 494) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0_0_0_0 + + + _enabled + True + + + type + complex + + + title + Post-SYNC + + + samp_rate + sample_rate + + + v_scale + 0.5 + + + t_scale + 20.0/sample_rate + + + ac_couple + False + + + xy_mode + True + + + num_inputs + 1 + + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 2 + + + _coordinate + (872, 607) + + + _rotation + 180 + + + + src + throttle + 0 + 0 + + + throttle + agr + 0 + 0 + + + agr + gr_moving_average_xx_0 + 0 + 0 + + + agr + rx_fftsink + 0 + 0 + + + agr + wxgui_scopesink2_0 + 0 + 0 + + + gr_moving_average_xx_0 + noaa_hrpt_pll_cc_0 + 0 + 0 + + + noaa_hrpt_pll_cc_0 + wxgui_scopesink2_0_0 + 0 + 0 + + + noaa_hrpt_pll_cc_0 + wxgui_scopesink2_0_0_0 + 0 + 0 + + + noaa_hrpt_pll_cc_0 + sync + 0 + 0 + + + sync + wxgui_scopesink2_0_0_1 + 0 + 0 + + + sync + wxgui_scopesink2_0_0_0_0 + 0 + 0 + + diff --git a/gr-noaa/grc/usrp_rx_hrpt.py b/gr-noaa/grc/usrp_rx_hrpt.py new file mode 100755 index 00000000..ed641733 --- /dev/null +++ b/gr-noaa/grc/usrp_rx_hrpt.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python +################################################## +# Gnuradio Python Flow Graph +# Title: USRP HRPT Receiver +# Generated: Sat Aug 29 11:48:57 2009 +################################################## + +from gnuradio import gr +from gnuradio import noaa +from gnuradio.eng_option import eng_option +from gnuradio.wxgui import fftsink2 +from gnuradio.wxgui import forms +from gnuradio.wxgui import scopesink2 +from grc_gnuradio import wxgui as grc_wxgui +from optparse import OptionParser +import math +import wx + +class usrp_rx_hrpt(grc_wxgui.top_block_gui): + + def __init__(self): + grc_wxgui.top_block_gui.__init__(self, title="USRP HRPT Receiver") + + ################################################## + # Variables + ################################################## + self.decim = decim = 16 + self.sym_rate = sym_rate = 600*1109 + self.sample_rate = sample_rate = 64e6/decim + self.sps = sps = sample_rate/sym_rate + self.sync_alpha = sync_alpha = 0.005 + self.pll_alpha = pll_alpha = 0.005 + self.max_sync_offset = max_sync_offset = 0.01 + self.max_carrier_offset = max_carrier_offset = 2*math.pi*100e3/sample_rate + self.hs = hs = int(sps/2.0) + + ################################################## + # Notebooks + ################################################## + self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP) + self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX") + self.displays.AddPage(grc_wxgui.Panel(self.displays), "PLL") + self.displays.AddPage(grc_wxgui.Panel(self.displays), "SYNC") + self.GridAdd(self.displays, 1, 0, 1, 2) + + ################################################## + # Controls + ################################################## + _sync_alpha_sizer = wx.BoxSizer(wx.VERTICAL) + self._sync_alpha_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_sync_alpha_sizer, + value=self.sync_alpha, + callback=self.set_sync_alpha, + label="SYNC Alpha", + converter=forms.float_converter(), + proportion=0, + ) + self._sync_alpha_slider = forms.slider( + parent=self.GetWin(), + sizer=_sync_alpha_sizer, + value=self.sync_alpha, + callback=self.set_sync_alpha, + minimum=0.0, + maximum=0.5, + num_steps=500, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_sync_alpha_sizer, 0, 1, 1, 1) + _pll_alpha_sizer = wx.BoxSizer(wx.VERTICAL) + self._pll_alpha_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_pll_alpha_sizer, + value=self.pll_alpha, + callback=self.set_pll_alpha, + label="PLL Alpha", + converter=forms.float_converter(), + proportion=0, + ) + self._pll_alpha_slider = forms.slider( + parent=self.GetWin(), + sizer=_pll_alpha_sizer, + value=self.pll_alpha, + callback=self.set_pll_alpha, + minimum=0.0, + maximum=0.5, + num_steps=500, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_pll_alpha_sizer, 0, 0, 1, 1) + + ################################################## + # Blocks + ################################################## + self.agr = gr.agc_cc(1e-6, 1.0, 1.0, 1.0) + self.gr_moving_average_xx_0 = gr.moving_average_cc(hs, 1.0/hs, 4000) + self.noaa_hrpt_pll_cc_0 = noaa.hrpt_pll_cc(pll_alpha, pll_alpha**2/4.0, max_carrier_offset) + self.rx_fftsink = fftsink2.fft_sink_c( + self.displays.GetPage(0).GetWin(), + baseband_freq=1698e6, + y_per_div=5, + y_divs=8, + ref_level=20, + sample_rate=sample_rate, + fft_size=1024, + fft_rate=30, + average=True, + avg_alpha=0.1, + title="RX Spectrum", + peak_hold=False, + ) + self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1) + self.src = gr.file_source(gr.sizeof_gr_complex*1, "poes-d16.dat", True) + self.sync = noaa.hrpt_sync_cc(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset) + self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate) + self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( + self.displays.GetPage(0).GetWin(), + title="RX Waveform", + sample_rate=sample_rate, + v_scale=0, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_c( + self.displays.GetPage(1).GetWin(), + title="Post-PLL", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1) + self.wxgui_scopesink2_0_0_0 = scopesink2.scope_sink_c( + self.displays.GetPage(1).GetWin(), + title="Post-PLL", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_0_0_0_0 = scopesink2.scope_sink_c( + self.displays.GetPage(2).GetWin(), + title="Post-SYNC", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_0_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_0_0_1 = scopesink2.scope_sink_c( + self.displays.GetPage(2).GetWin(), + title="Post-SYNC", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_1.win, 0, 0, 1, 1) + + ################################################## + # Connections + ################################################## + self.connect((self.src, 0), (self.throttle, 0)) + self.connect((self.throttle, 0), (self.agr, 0)) + self.connect((self.agr, 0), (self.gr_moving_average_xx_0, 0)) + self.connect((self.agr, 0), (self.rx_fftsink, 0)) + self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0)) + self.connect((self.gr_moving_average_xx_0, 0), (self.noaa_hrpt_pll_cc_0, 0)) + self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0, 0)) + self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0_0, 0)) + self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.sync, 0)) + self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_1, 0)) + self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_0_0, 0)) + + def set_decim(self, decim): + self.decim = decim + self.set_sample_rate(64e6/self.decim) + + def set_sym_rate(self, sym_rate): + self.sym_rate = sym_rate + self.set_sps(self.sample_rate/self.sym_rate) + + def set_sample_rate(self, sample_rate): + self.sample_rate = sample_rate + self.set_sps(self.sample_rate/self.sym_rate) + self.rx_fftsink.set_sample_rate(self.sample_rate) + self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate) + self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate) + self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_rate) + self.wxgui_scopesink2_0_0_1.set_sample_rate(self.sample_rate) + self.wxgui_scopesink2_0_0_0.set_sample_rate(self.sample_rate) + self.wxgui_scopesink2_0_0_0_0.set_sample_rate(self.sample_rate) + + def set_sps(self, sps): + self.sps = sps + self.set_hs(int(self.sps/2.0)) + + def set_sync_alpha(self, sync_alpha): + self.sync_alpha = sync_alpha + self._sync_alpha_slider.set_value(self.sync_alpha) + self._sync_alpha_text_box.set_value(self.sync_alpha) + self.sync.set_alpha(self.sync_alpha) + self.sync.set_beta(self.sync_alpha**2/4.0) + + def set_pll_alpha(self, pll_alpha): + self.pll_alpha = pll_alpha + self._pll_alpha_slider.set_value(self.pll_alpha) + self._pll_alpha_text_box.set_value(self.pll_alpha) + self.noaa_hrpt_pll_cc_0.set_alpha(self.pll_alpha) + self.noaa_hrpt_pll_cc_0.set_beta(self.pll_alpha**2/4.0) + + def set_max_sync_offset(self, max_sync_offset): + self.max_sync_offset = max_sync_offset + self.sync.set_max_offset(self.max_sync_offset) + + def set_max_carrier_offset(self, max_carrier_offset): + self.max_carrier_offset = max_carrier_offset + self.noaa_hrpt_pll_cc_0.set_max_offset(self.max_carrier_offset) + + def set_hs(self, hs): + self.hs = hs + self.gr_moving_average_xx_0.set_length_and_scale(self.hs, 1.0/self.hs) + +if __name__ == '__main__': + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + (options, args) = parser.parse_args() + tb = usrp_rx_hrpt() + tb.Run(True) + diff --git a/gr-noaa/grc/usrp_rx_lrit.grc b/gr-noaa/grc/usrp_rx_lrit.grc new file mode 100644 index 00000000..55fe3978 --- /dev/null +++ b/gr-noaa/grc/usrp_rx_lrit.grc @@ -0,0 +1,1477 @@ + + + Sat Aug 29 11:26:03 2009 + + options + + id + usrp_rx_lrit + + + _enabled + True + + + title + USRP LRIT Receiver + + + author + + + + description + + + + window_size + 4095, 4095 + + + generate_options + wx_gui + + + category + Custom + + + run + True + + + realtime_scheduling + + + + _coordinate + (10, 10) + + + _rotation + 0 + + + + variable + + id + samp_rate + + + _enabled + True + + + value + 64e6/decim + + + _coordinate + (10, 81) + + + _rotation + 0 + + + + variable + + id + symbol_rate + + + _enabled + True + + + value + 293e3 + + + _coordinate + (11, 148) + + + _rotation + 0 + + + + variable + + id + sps + + + _enabled + True + + + value + samp_rate/symbol_rate + + + _coordinate + (12, 214) + + + _rotation + 0 + + + + variable_text_box + + id + decim + + + _enabled + True + + + label + Decim + + + value + saved_decim + + + converver + int_converter + + + formatter + None + + + grid_pos + 0, 0, 1, 1 + + + notebook + + + + _coordinate + (243, 13) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0 + + + _enabled + True + + + type + complex + + + title + Waveform + + + samp_rate + samp_rate + + + v_scale + 0.5 + + + t_scale + 20.0/samp_rate + + + ac_couple + False + + + xy_mode + True + + + num_inputs + 1 + + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 0 + + + _coordinate + (434, 551) + + + _rotation + 0 + + + + gr_agc_xx + + id + gr_agc_xx_0 + + + _enabled + True + + + type + complex + + + rate + 1e-6 + + + reference + 1.0 + + + gain + 1.0/32767.0 + + + max_gain + 1.0 + + + _coordinate + (261, 493) + + + _rotation + 0 + + + + root_raised_cosine_filter + + id + root_raised_cosine_filter_0 + + + _enabled + False + + + type + fir_filter_ccf + + + decim + 1 + + + interp + 1 + + + gain + 1 + + + samp_rate + samp_rate + + + sym_rate + symbol_rate + + + alpha + 0.5 + + + ntaps + 50 + + + _coordinate + (618, 373) + + + _rotation + 0 + + + + usrp_simple_source_x + + id + usrp_simple_source_x_0 + + + _enabled + False + + + type + complex + + + format + + + + which + 0 + + + decimation + decim + + + frequency + freq + + + lo_offset + float('inf') + + + gain + gain + + + side + B + + + rx_ant + RXA + + + hb_filters + + + + _coordinate + (11, 477) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_0 + + + _enabled + True + + + type + complex + + + title + Spectrum + + + samp_rate + samp_rate + + + baseband_freq + freq + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 50 + + + fft_size + 1024 + + + fft_rate + 30 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + grid_pos + 0, 0, 1, 1 + + + notebook + displays, 0 + + + _coordinate + (434, 337) + + + _rotation + 0 + + + + gr_throttle + + id + gr_throttle_0 + + + _enabled + True + + + type + complex + + + samples_per_second + samp_rate + + + vlen + 1 + + + _coordinate + (181, 663) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_1 + + + _enabled + True + + + type + complex + + + title + Scope Plot + + + samp_rate + samp_rate + + + v_scale + 0.4 + + + t_scale + 20.0/samp_rate + + + ac_couple + False + + + xy_mode + True + + + num_inputs + 1 + + + grid_pos + 0, 0, 1, 1 + + + notebook + displays, 1 + + + _coordinate + (1126, 251) + + + _rotation + 0 + + + + gr_probe_mpsk_snr_c + + id + gr_probe_mpsk_snr_c_0 + + + _enabled + True + + + type + snr + + + alpha + 0.0001 + + + probe_rate + 10 + + + _coordinate + (1126, 723) + + + _rotation + 0 + + + + wxgui_numbersink2 + + id + wxgui_numbersink2_0 + + + _enabled + True + + + type + float + + + title + SNR + + + units + dB + + + samp_rate + 10 + + + min_value + 0 + + + max_value + 30 + + + factor + 1.0 + + + decimal_places + 1 + + + ref_level + 0 + + + number_rate + 10 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + show_gauge + True + + + grid_pos + 2, 0, 1, 1 + + + notebook + displays, 1 + + + _coordinate + (1335, 651) + + + _rotation + 0 + + + + gr_mpsk_receiver_cc + + id + gr_mpsk_receiver_cc_0 + + + _enabled + True + + + M + 2 + + + theta + 0 + + + alpha + costas_alpha + + + beta + costas_alpha*costas_alpha/4.0 + + + fmin + -0.05 + + + fmax + 0.05 + + + mu + 0.5 + + + gain_mu + gain_mu + + + omega + sps + + + gain_omega + gain_mu*gain_mu/4.0 + + + omega_relative_limit + 0.05 + + + _coordinate + (881, 437) + + + _rotation + 0 + + + + gr_complex_to_real + + id + gr_complex_to_real_0 + + + _enabled + True + + + vlen + 1 + + + _coordinate + (1133, 521) + + + _rotation + 0 + + + + gr_char_to_float + + id + gr_char_to_float_0 + + + _enabled + True + + + _coordinate + (1523, 521) + + + _rotation + 0 + + + + gr_binary_slicer_fb + + id + gr_binary_slicer_fb_0 + + + _enabled + True + + + _coordinate + (1343, 521) + + + _rotation + 0 + + + + gr_add_const_vxx + + id + gr_add_const_vxx_0 + + + _enabled + True + + + type + float + + + const + 48.0 + + + vlen + 1 + + + _coordinate + (1707, 517) + + + _rotation + 0 + + + + gr_float_to_char + + id + gr_float_to_char_0 + + + _enabled + True + + + _coordinate + (1878, 521) + + + _rotation + 0 + + + + gr_file_sink + + id + gr_file_sink_0 + + + _enabled + True + + + file + bits.dat + + + type + byte + + + vlen + 1 + + + _coordinate + (2059, 517) + + + _rotation + 0 + + + + gr_file_source + + id + gr_file_source_0 + + + _enabled + True + + + file + lrit.dat + + + type + complex + + + repeat + False + + + vlen + 1 + + + _coordinate + (11, 655) + + + _rotation + 0 + + + + notebook + + id + displays + + + _enabled + True + + + style + wx.NB_TOP + + + labels + ['USRP RX', 'Costas Output'] + + + grid_pos + 2, 0, 1, 3 + + + notebook + + + + _coordinate + (14, 351) + + + _rotation + 0 + + + + variable_config + + id + saved_decim + + + _enabled + True + + + value + 160 + + + type + int + + + config_file + config_filename + + + section + main + + + option + decim + + + writeback + decim + + + _coordinate + (246, 172) + + + _rotation + 0 + + + + variable_slider + + id + gain + + + _enabled + True + + + label + Gain + + + value + saved_gain + + + min + 0 + + + max + 115 + + + num_steps + 115 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 1, 1, 1 + + + notebook + + + + _coordinate + (411, 11) + + + _rotation + 0 + + + + variable_config + + id + saved_gain + + + _enabled + True + + + value + 33 + + + type + real + + + config_file + config_filename + + + section + main + + + option + gain + + + writeback + gain + + + _coordinate + (412, 172) + + + _rotation + 0 + + + + variable_slider + + id + freq + + + _enabled + True + + + label + Frequency + + + value + saved_freq + + + min + 135e6 + + + max + 139e6 + + + num_steps + 400 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 2, 1, 1 + + + notebook + + + + _coordinate + (574, 12) + + + _rotation + 0 + + + + variable_config + + id + saved_freq + + + _enabled + True + + + value + 137e6 + + + type + real + + + config_file + config_filename + + + section + main + + + option + freq + + + writeback + freq + + + _coordinate + (576, 170) + + + _rotation + 0 + + + + variable_slider + + id + costas_alpha + + + _enabled + True + + + label + Costas Alpha + + + value + saved_costas_alpha + + + min + 0 + + + max + 0.5 + + + num_steps + 100 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 1, 0, 1, 1 + + + notebook + + + + _coordinate + (738, 13) + + + _rotation + 0 + + + + variable_config + + id + saved_costas_alpha + + + _enabled + True + + + value + 0.005 + + + type + real + + + config_file + config_filename + + + section + main + + + option + costas_alpha + + + writeback + costas_alpha + + + _coordinate + (739, 170) + + + _rotation + 0 + + + + variable_config + + id + saved_gain_mu + + + _enabled + True + + + value + 0.005 + + + type + real + + + config_file + config_filename + + + section + main + + + option + gain_mu + + + writeback + gain_mu + + + _coordinate + (900, 170) + + + _rotation + 0 + + + + variable_slider + + id + gain_mu + + + _enabled + True + + + label + Gain Mu + + + value + saved_gain_mu + + + min + 0 + + + max + 0.5 + + + num_steps + 100 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 1, 1, 1, 1 + + + notebook + + + + _coordinate + (902, 13) + + + _rotation + 0 + + + + variable + + id + config_filename + + + _enabled + True + + + value + "usrp_rx_lrit.cfg" + + + _coordinate + (13, 283) + + + _rotation + 0 + + + + usrp_simple_source_x_0 + gr_agc_xx_0 + 0 + 0 + + + gr_agc_xx_0 + wxgui_scopesink2_0 + 0 + 0 + + + gr_file_source_0 + gr_throttle_0 + 0 + 0 + + + gr_throttle_0 + gr_agc_xx_0 + 0 + 0 + + + gr_probe_mpsk_snr_c_0 + wxgui_numbersink2_0 + 0 + 0 + + + gr_mpsk_receiver_cc_0 + gr_probe_mpsk_snr_c_0 + 0 + 0 + + + gr_agc_xx_0 + gr_mpsk_receiver_cc_0 + 0 + 0 + + + gr_mpsk_receiver_cc_0 + wxgui_scopesink2_1 + 0 + 0 + + + gr_agc_xx_0 + wxgui_fftsink2_0 + 0 + 0 + + + gr_mpsk_receiver_cc_0 + gr_complex_to_real_0 + 0 + 0 + + + gr_complex_to_real_0 + gr_binary_slicer_fb_0 + 0 + 0 + + + gr_binary_slicer_fb_0 + gr_char_to_float_0 + 0 + 0 + + + gr_char_to_float_0 + gr_add_const_vxx_0 + 0 + 0 + + + gr_add_const_vxx_0 + gr_float_to_char_0 + 0 + 0 + + + gr_float_to_char_0 + gr_file_sink_0 + 0 + 0 + + diff --git a/gr-noaa/grc/usrp_rx_lrit.py b/gr-noaa/grc/usrp_rx_lrit.py new file mode 100755 index 00000000..bc313e3a --- /dev/null +++ b/gr-noaa/grc/usrp_rx_lrit.py @@ -0,0 +1,399 @@ +#!/usr/bin/env python +################################################## +# Gnuradio Python Flow Graph +# Title: USRP LRIT Receiver +# Generated: Sat Aug 29 11:26:03 2009 +################################################## + +from gnuradio import gr +from gnuradio.eng_option import eng_option +from gnuradio.wxgui import fftsink2 +from gnuradio.wxgui import forms +from gnuradio.wxgui import numbersink2 +from gnuradio.wxgui import scopesink2 +from grc_gnuradio import blks2 as grc_blks2 +from grc_gnuradio import wxgui as grc_wxgui +from optparse import OptionParser +import ConfigParser +import wx + +class usrp_rx_lrit(grc_wxgui.top_block_gui): + + def __init__(self): + grc_wxgui.top_block_gui.__init__(self, title="USRP LRIT Receiver") + + ################################################## + # Variables + ################################################## + self.config_filename = config_filename = "usrp_rx_lrit.cfg" + self._saved_decim_config = ConfigParser.ConfigParser() + self._saved_decim_config.read(config_filename) + try: saved_decim = self._saved_decim_config.getint("main", "decim") + except: saved_decim = 160 + self.saved_decim = saved_decim + self.decim = decim = saved_decim + self.symbol_rate = symbol_rate = 293e3 + self._saved_gain_mu_config = ConfigParser.ConfigParser() + self._saved_gain_mu_config.read(config_filename) + try: saved_gain_mu = self._saved_gain_mu_config.getfloat("main", "gain_mu") + except: saved_gain_mu = 0.005 + self.saved_gain_mu = saved_gain_mu + self._saved_gain_config = ConfigParser.ConfigParser() + self._saved_gain_config.read(config_filename) + try: saved_gain = self._saved_gain_config.getfloat("main", "gain") + except: saved_gain = 33 + self.saved_gain = saved_gain + self._saved_freq_config = ConfigParser.ConfigParser() + self._saved_freq_config.read(config_filename) + try: saved_freq = self._saved_freq_config.getfloat("main", "freq") + except: saved_freq = 137e6 + self.saved_freq = saved_freq + self._saved_costas_alpha_config = ConfigParser.ConfigParser() + self._saved_costas_alpha_config.read(config_filename) + try: saved_costas_alpha = self._saved_costas_alpha_config.getfloat("main", "costas_alpha") + except: saved_costas_alpha = 0.005 + self.saved_costas_alpha = saved_costas_alpha + self.samp_rate = samp_rate = 64e6/decim + self.sps = sps = samp_rate/symbol_rate + self.gain_mu = gain_mu = saved_gain_mu + self.gain = gain = saved_gain + self.freq = freq = saved_freq + self.costas_alpha = costas_alpha = saved_costas_alpha + + ################################################## + # Notebooks + ################################################## + self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP) + self.displays.AddPage(grc_wxgui.Panel(self.displays), "USRP RX") + self.displays.AddPage(grc_wxgui.Panel(self.displays), "Costas Output") + self.GridAdd(self.displays, 2, 0, 1, 3) + + ################################################## + # Controls + ################################################## + self._decim_text_box = forms.text_box( + parent=self.GetWin(), + value=self.decim, + callback=self.set_decim, + label="Decim", + converter=forms.int_converter(), + ) + self.GridAdd(self._decim_text_box, 0, 0, 1, 1) + _gain_mu_sizer = wx.BoxSizer(wx.VERTICAL) + self._gain_mu_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_gain_mu_sizer, + value=self.gain_mu, + callback=self.set_gain_mu, + label="Gain Mu", + converter=forms.float_converter(), + proportion=0, + ) + self._gain_mu_slider = forms.slider( + parent=self.GetWin(), + sizer=_gain_mu_sizer, + value=self.gain_mu, + callback=self.set_gain_mu, + minimum=0, + maximum=0.5, + num_steps=100, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_gain_mu_sizer, 1, 1, 1, 1) + _gain_sizer = wx.BoxSizer(wx.VERTICAL) + self._gain_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_gain_sizer, + value=self.gain, + callback=self.set_gain, + label="Gain", + converter=forms.float_converter(), + proportion=0, + ) + self._gain_slider = forms.slider( + parent=self.GetWin(), + sizer=_gain_sizer, + value=self.gain, + callback=self.set_gain, + minimum=0, + maximum=115, + num_steps=115, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_gain_sizer, 0, 1, 1, 1) + _freq_sizer = wx.BoxSizer(wx.VERTICAL) + self._freq_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_freq_sizer, + value=self.freq, + callback=self.set_freq, + label="Frequency", + converter=forms.float_converter(), + proportion=0, + ) + self._freq_slider = forms.slider( + parent=self.GetWin(), + sizer=_freq_sizer, + value=self.freq, + callback=self.set_freq, + minimum=135e6, + maximum=139e6, + num_steps=400, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_freq_sizer, 0, 2, 1, 1) + _costas_alpha_sizer = wx.BoxSizer(wx.VERTICAL) + self._costas_alpha_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_costas_alpha_sizer, + value=self.costas_alpha, + callback=self.set_costas_alpha, + label="Costas Alpha", + converter=forms.float_converter(), + proportion=0, + ) + self._costas_alpha_slider = forms.slider( + parent=self.GetWin(), + sizer=_costas_alpha_sizer, + value=self.costas_alpha, + callback=self.set_costas_alpha, + minimum=0, + maximum=0.5, + num_steps=100, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_costas_alpha_sizer, 1, 0, 1, 1) + + ################################################## + # Blocks + ################################################## + self.gr_add_const_vxx_0 = gr.add_const_vff((48.0, )) + self.gr_agc_xx_0 = gr.agc_cc(1e-6, 1.0, 1.0/32767.0, 1.0) + self.gr_binary_slicer_fb_0 = gr.binary_slicer_fb() + self.gr_char_to_float_0 = gr.char_to_float() + self.gr_complex_to_real_0 = gr.complex_to_real(1) + self.gr_file_sink_0 = gr.file_sink(gr.sizeof_char*1, "bits.dat") + self.gr_file_source_0 = gr.file_source(gr.sizeof_gr_complex*1, "lrit.dat", False) + self.gr_float_to_char_0 = gr.float_to_char() + self.gr_mpsk_receiver_cc_0 = gr.mpsk_receiver_cc(2, 0, costas_alpha, costas_alpha*costas_alpha/4.0, -0.05, 0.05, 0.5, gain_mu, sps, gain_mu*gain_mu/4.0, 0.05) + self.gr_probe_mpsk_snr_c_0 = grc_blks2.probe_mpsk_snr_c( + type='snr', + alpha=0.0001, + probe_rate=10, + ) + self.gr_throttle_0 = gr.throttle(gr.sizeof_gr_complex*1, samp_rate) + self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( + self.displays.GetPage(0).GetWin(), + baseband_freq=freq, + y_per_div=10, + y_divs=10, + ref_level=50, + sample_rate=samp_rate, + fft_size=1024, + fft_rate=30, + average=False, + avg_alpha=None, + title="Spectrum", + peak_hold=False, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1) + self.wxgui_numbersink2_0 = numbersink2.number_sink_f( + self.displays.GetPage(1).GetWin(), + unit="dB", + minval=0, + maxval=30, + factor=1.0, + decimal_places=1, + ref_level=0, + sample_rate=10, + number_rate=10, + average=False, + avg_alpha=None, + label="SNR", + peak_hold=False, + show_gauge=True, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_numbersink2_0.win, 2, 0, 1, 1) + self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( + self.displays.GetPage(0).GetWin(), + title="Waveform", + sample_rate=samp_rate, + v_scale=0.5, + t_scale=20.0/samp_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( + self.displays.GetPage(1).GetWin(), + title="Scope Plot", + sample_rate=samp_rate, + v_scale=0.4, + t_scale=20.0/samp_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_1.win, 0, 0, 1, 1) + + ################################################## + # Connections + ################################################## + self.connect((self.gr_agc_xx_0, 0), (self.wxgui_scopesink2_0, 0)) + self.connect((self.gr_file_source_0, 0), (self.gr_throttle_0, 0)) + self.connect((self.gr_throttle_0, 0), (self.gr_agc_xx_0, 0)) + self.connect((self.gr_probe_mpsk_snr_c_0, 0), (self.wxgui_numbersink2_0, 0)) + self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_probe_mpsk_snr_c_0, 0)) + self.connect((self.gr_agc_xx_0, 0), (self.gr_mpsk_receiver_cc_0, 0)) + self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0)) + self.connect((self.gr_agc_xx_0, 0), (self.wxgui_fftsink2_0, 0)) + self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_complex_to_real_0, 0)) + self.connect((self.gr_complex_to_real_0, 0), (self.gr_binary_slicer_fb_0, 0)) + self.connect((self.gr_binary_slicer_fb_0, 0), (self.gr_char_to_float_0, 0)) + self.connect((self.gr_char_to_float_0, 0), (self.gr_add_const_vxx_0, 0)) + self.connect((self.gr_add_const_vxx_0, 0), (self.gr_float_to_char_0, 0)) + self.connect((self.gr_float_to_char_0, 0), (self.gr_file_sink_0, 0)) + + def set_config_filename(self, config_filename): + self.config_filename = config_filename + self._saved_decim_config = ConfigParser.ConfigParser() + self._saved_decim_config.read(self.config_filename) + if not self._saved_decim_config.has_section("main"): + self._saved_decim_config.add_section("main") + self._saved_decim_config.set("main", "decim", str(self.decim)) + self._saved_decim_config.write(open(self.config_filename, 'w')) + self._saved_gain_config = ConfigParser.ConfigParser() + self._saved_gain_config.read(self.config_filename) + if not self._saved_gain_config.has_section("main"): + self._saved_gain_config.add_section("main") + self._saved_gain_config.set("main", "gain", str(self.gain)) + self._saved_gain_config.write(open(self.config_filename, 'w')) + self._saved_freq_config = ConfigParser.ConfigParser() + self._saved_freq_config.read(self.config_filename) + if not self._saved_freq_config.has_section("main"): + self._saved_freq_config.add_section("main") + self._saved_freq_config.set("main", "freq", str(self.freq)) + self._saved_freq_config.write(open(self.config_filename, 'w')) + self._saved_costas_alpha_config = ConfigParser.ConfigParser() + self._saved_costas_alpha_config.read(self.config_filename) + if not self._saved_costas_alpha_config.has_section("main"): + self._saved_costas_alpha_config.add_section("main") + self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha)) + self._saved_costas_alpha_config.write(open(self.config_filename, 'w')) + self._saved_gain_mu_config = ConfigParser.ConfigParser() + self._saved_gain_mu_config.read(self.config_filename) + if not self._saved_gain_mu_config.has_section("main"): + self._saved_gain_mu_config.add_section("main") + self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu)) + self._saved_gain_mu_config.write(open(self.config_filename, 'w')) + + def set_saved_decim(self, saved_decim): + self.saved_decim = saved_decim + self.set_decim(self.saved_decim) + + def set_decim(self, decim): + self.decim = decim + self.set_samp_rate(64e6/self.decim) + self._decim_text_box.set_value(self.decim) + self._saved_decim_config = ConfigParser.ConfigParser() + self._saved_decim_config.read(self.config_filename) + if not self._saved_decim_config.has_section("main"): + self._saved_decim_config.add_section("main") + self._saved_decim_config.set("main", "decim", str(self.decim)) + self._saved_decim_config.write(open(self.config_filename, 'w')) + + def set_symbol_rate(self, symbol_rate): + self.symbol_rate = symbol_rate + self.set_sps(self.samp_rate/self.symbol_rate) + + def set_saved_gain_mu(self, saved_gain_mu): + self.saved_gain_mu = saved_gain_mu + self.set_gain_mu(self.saved_gain_mu) + + def set_saved_gain(self, saved_gain): + self.saved_gain = saved_gain + self.set_gain(self.saved_gain) + + def set_saved_freq(self, saved_freq): + self.saved_freq = saved_freq + self.set_freq(self.saved_freq) + + def set_saved_costas_alpha(self, saved_costas_alpha): + self.saved_costas_alpha = saved_costas_alpha + self.set_costas_alpha(self.saved_costas_alpha) + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.set_sps(self.samp_rate/self.symbol_rate) + self.wxgui_scopesink2_0.set_sample_rate(self.samp_rate) + self.wxgui_fftsink2_0.set_sample_rate(self.samp_rate) + self.wxgui_scopesink2_1.set_sample_rate(self.samp_rate) + + def set_sps(self, sps): + self.sps = sps + self.gr_mpsk_receiver_cc_0.set_omega(self.sps) + + def set_gain_mu(self, gain_mu): + self.gain_mu = gain_mu + self.gr_mpsk_receiver_cc_0.set_gain_mu(self.gain_mu) + self.gr_mpsk_receiver_cc_0.set_gain_omega(self.gain_mu*self.gain_mu/4.0) + self._saved_gain_mu_config = ConfigParser.ConfigParser() + self._saved_gain_mu_config.read(self.config_filename) + if not self._saved_gain_mu_config.has_section("main"): + self._saved_gain_mu_config.add_section("main") + self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu)) + self._saved_gain_mu_config.write(open(self.config_filename, 'w')) + self._gain_mu_slider.set_value(self.gain_mu) + self._gain_mu_text_box.set_value(self.gain_mu) + + def set_gain(self, gain): + self.gain = gain + self._gain_slider.set_value(self.gain) + self._gain_text_box.set_value(self.gain) + self._saved_gain_config = ConfigParser.ConfigParser() + self._saved_gain_config.read(self.config_filename) + if not self._saved_gain_config.has_section("main"): + self._saved_gain_config.add_section("main") + self._saved_gain_config.set("main", "gain", str(self.gain)) + self._saved_gain_config.write(open(self.config_filename, 'w')) + + def set_freq(self, freq): + self.freq = freq + self.wxgui_fftsink2_0.set_baseband_freq(self.freq) + self._freq_slider.set_value(self.freq) + self._freq_text_box.set_value(self.freq) + self._saved_freq_config = ConfigParser.ConfigParser() + self._saved_freq_config.read(self.config_filename) + if not self._saved_freq_config.has_section("main"): + self._saved_freq_config.add_section("main") + self._saved_freq_config.set("main", "freq", str(self.freq)) + self._saved_freq_config.write(open(self.config_filename, 'w')) + + def set_costas_alpha(self, costas_alpha): + self.costas_alpha = costas_alpha + self.gr_mpsk_receiver_cc_0.set_alpha(self.costas_alpha) + self.gr_mpsk_receiver_cc_0.set_beta(self.costas_alpha*self.costas_alpha/4.0) + self._costas_alpha_slider.set_value(self.costas_alpha) + self._costas_alpha_text_box.set_value(self.costas_alpha) + self._saved_costas_alpha_config = ConfigParser.ConfigParser() + self._saved_costas_alpha_config.read(self.config_filename) + if not self._saved_costas_alpha_config.has_section("main"): + self._saved_costas_alpha_config.add_section("main") + self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha)) + self._saved_costas_alpha_config.write(open(self.config_filename, 'w')) + +if __name__ == '__main__': + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + (options, args) = parser.parse_args() + tb = usrp_rx_lrit() + tb.Run(True) + diff --git a/gr-noaa/lib/Makefile.am b/gr-noaa/lib/Makefile.am index 39a4f115..2690ddb5 100644 --- a/gr-noaa/lib/Makefile.am +++ b/gr-noaa/lib/Makefile.am @@ -29,7 +29,8 @@ lib_LTLIBRARIES = \ libgnuradio-noaa.la libgnuradio_noaa_la_SOURCES = \ - noaa_carrier_pll_cc.cc + noaa_hrpt_pll_cc.cc \ + noaa_hrpt_sync_cc.cc libgnuradio_noaa_la_LIBADD = \ $(GNURADIO_CORE_LA) @@ -37,4 +38,5 @@ libgnuradio_noaa_la_LIBADD = \ libgnuradio_noaa_la_LDFLAGS = $(NO_UNDEFINED) -version-info 0:0:0 grinclude_HEADERS = \ - noaa_carrier_pll_cc.h + noaa_hrpt_pll_cc.h \ + noaa_hrpt_sync_cc.h diff --git a/gr-noaa/lib/noaa_carrier_pll_cc.cc b/gr-noaa/lib/noaa_carrier_pll_cc.cc deleted file mode 100644 index d6a86faa..00000000 --- a/gr-noaa/lib/noaa_carrier_pll_cc.cc +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#define M_TWOPI (2*M_PI) - -noaa_carrier_pll_cc_sptr -noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset) -{ - return gnuradio::get_initial_sptr(new noaa_carrier_pll_cc(alpha, beta, max_offset)); -} - -noaa_carrier_pll_cc::noaa_carrier_pll_cc(float alpha, float beta, float max_offset) - : gr_sync_block("noaa_carrier_pll_cc", - gr_make_io_signature(1, 1, sizeof(gr_complex)), - gr_make_io_signature(1, 1, sizeof(gr_complex))), - d_alpha(alpha), d_beta(beta), d_max_offset(max_offset), - d_phase(0.0), d_freq(0.0) -{ -} - -float -phase_wrap(float phase) -{ - while (phase < -M_PI) - phase += M_TWOPI; - while (phase > M_PI) - phase -= M_TWOPI; - - return phase; -} - -int -noaa_carrier_pll_cc::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) -{ - const gr_complex *in = (const gr_complex *) input_items[0]; - gr_complex *out = (gr_complex *) output_items[0]; - - for (int i = 0; i < noutput_items; i++) { - - // Adjust PLL phase/frequency - float error = phase_wrap(gr_fast_atan2f(in[i].imag(), in[i].real()) - d_phase); - d_freq = gr_branchless_clip(d_freq + error*d_beta, d_max_offset); - d_phase = phase_wrap(d_phase + error*d_alpha + d_freq); - - // Generate and mix out carrier - float re, im; - gr_sincosf(d_phase, &im, &re); - out[i] = in[i]*gr_complex(re, -im); - } - - return noutput_items; -} diff --git a/gr-noaa/lib/noaa_carrier_pll_cc.h b/gr-noaa/lib/noaa_carrier_pll_cc.h deleted file mode 100644 index 8e6de866..00000000 --- a/gr-noaa/lib/noaa_carrier_pll_cc.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_NOAA_CARRIER_PLL_CC_H -#define INCLUDED_NOAA_CARRIER_PLL_CC_H - -#include - -class noaa_carrier_pll_cc; -typedef boost::shared_ptr noaa_carrier_pll_cc_sptr; - -noaa_carrier_pll_cc_sptr -noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset); - -class noaa_carrier_pll_cc : public gr_sync_block -{ - friend noaa_carrier_pll_cc_sptr noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset); - noaa_carrier_pll_cc(float alpha, float beta, float max_offset); - - float d_alpha; // 1st order loop constant - float d_beta; // 2nd order loop constant - float d_max_offset; // Maximum frequency offset, radians/sample - float d_phase; // Instantaneous carrier phase - float d_freq; // Instantaneous carrier frequency, radians/sample - - public: - virtual int work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); - - void set_alpha(float alpha) { d_alpha = alpha; } - void set_beta(float beta) { d_beta = beta; } - void set_max_offset(float max_offset) { d_max_offset = max_offset; } -}; - -#endif /* INCLUDED_NOAA_CARRIER_PLL_CC_H */ diff --git a/gr-noaa/lib/noaa_hrpt_pll_cc.cc b/gr-noaa/lib/noaa_hrpt_pll_cc.cc new file mode 100644 index 00000000..46fe24da --- /dev/null +++ b/gr-noaa/lib/noaa_hrpt_pll_cc.cc @@ -0,0 +1,82 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#define M_TWOPI (2*M_PI) + +noaa_hrpt_pll_cc_sptr +noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset) +{ + return gnuradio::get_initial_sptr(new noaa_hrpt_pll_cc(alpha, beta, max_offset)); +} + +noaa_hrpt_pll_cc::noaa_hrpt_pll_cc(float alpha, float beta, float max_offset) + : gr_sync_block("noaa_hrpt_pll_cc", + gr_make_io_signature(1, 1, sizeof(gr_complex)), + gr_make_io_signature(1, 1, sizeof(gr_complex))), + d_alpha(alpha), d_beta(beta), d_max_offset(max_offset), + d_phase(0.0), d_freq(0.0) +{ +} + +float +phase_wrap(float phase) +{ + while (phase < -M_PI) + phase += M_TWOPI; + while (phase > M_PI) + phase -= M_TWOPI; + + return phase; +} + +int +noaa_hrpt_pll_cc::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + const gr_complex *in = (const gr_complex *) input_items[0]; + gr_complex *out = (gr_complex *) output_items[0]; + + for (int i = 0; i < noutput_items; i++) { + + // Adjust PLL phase/frequency + float error = phase_wrap(gr_fast_atan2f(in[i].imag(), in[i].real()) - d_phase); + d_freq = gr_branchless_clip(d_freq + error*d_beta, d_max_offset); + d_phase = phase_wrap(d_phase + error*d_alpha + d_freq); + + // Generate and mix out carrier + float re, im; + gr_sincosf(d_phase, &im, &re); + out[i] = in[i]*gr_complex(re, -im); + } + + return noutput_items; +} diff --git a/gr-noaa/lib/noaa_hrpt_pll_cc.h b/gr-noaa/lib/noaa_hrpt_pll_cc.h new file mode 100644 index 00000000..81045440 --- /dev/null +++ b/gr-noaa/lib/noaa_hrpt_pll_cc.h @@ -0,0 +1,55 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_NOAA_HRPT_PLL_CC_H +#define INCLUDED_NOAA_HRPT_PLL_CC_H + +#include + +class noaa_hrpt_pll_cc; +typedef boost::shared_ptr noaa_hrpt_pll_cc_sptr; + +noaa_hrpt_pll_cc_sptr +noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset); + +class noaa_hrpt_pll_cc : public gr_sync_block +{ + friend noaa_hrpt_pll_cc_sptr noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset); + noaa_hrpt_pll_cc(float alpha, float beta, float max_offset); + + float d_alpha; // 1st order loop constant + float d_beta; // 2nd order loop constant + float d_max_offset; // Maximum frequency offset, radians/sample + float d_phase; // Instantaneous carrier phase + float d_freq; // Instantaneous carrier frequency, radians/sample + + public: + virtual int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + + void set_alpha(float alpha) { d_alpha = alpha; } + void set_beta(float beta) { d_beta = beta; } + void set_max_offset(float max_offset) { d_max_offset = max_offset; } +}; + +#endif /* INCLUDED_NOAA_HRPT_PLL_CC_H */ diff --git a/gr-noaa/lib/noaa_hrpt_sync_cc.cc b/gr-noaa/lib/noaa_hrpt_sync_cc.cc new file mode 100644 index 00000000..47858d75 --- /dev/null +++ b/gr-noaa/lib/noaa_hrpt_sync_cc.cc @@ -0,0 +1,62 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +noaa_hrpt_sync_cc_sptr +noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset) +{ + return gnuradio::get_initial_sptr(new noaa_hrpt_sync_cc(alpha, beta, sps, max_offset)); +} + +noaa_hrpt_sync_cc::noaa_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset) + : gr_block("noaa_hrpt_sync_cc", + gr_make_io_signature(1, 1, sizeof(gr_complex)), + gr_make_io_signature(1, 1, sizeof(gr_complex))), + d_alpha(alpha), d_beta(beta), d_sps(sps), d_max_offset(max_offset), + d_phase(0.0), d_freq(0.0) +{ +} + +int +noaa_hrpt_sync_cc::general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + int ninputs = ninput_items[0]; + const gr_complex *in = (const gr_complex *) input_items[0]; + gr_complex *out = (gr_complex *) output_items[0]; + + int i = 0, j = 0; + while (i < ninputs && j < noutput_items) { + out[j++] = in[i++]; + } + + consume_each(i); + return j; +} diff --git a/gr-noaa/lib/noaa_hrpt_sync_cc.h b/gr-noaa/lib/noaa_hrpt_sync_cc.h new file mode 100644 index 00000000..f5b23cca --- /dev/null +++ b/gr-noaa/lib/noaa_hrpt_sync_cc.h @@ -0,0 +1,57 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_NOAA_HRPT_SYNC_CC_H +#define INCLUDED_NOAA_HRPT_SYNC_CC_H + +#include + +class noaa_hrpt_sync_cc; +typedef boost::shared_ptr noaa_hrpt_sync_cc_sptr; + +noaa_hrpt_sync_cc_sptr +noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + +class noaa_hrpt_sync_cc : public gr_block +{ + friend noaa_hrpt_sync_cc_sptr noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + noaa_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + + float d_alpha; // 1st order loop constant + float d_beta; // 2nd order loop constant + float d_sps; // samples per symbol + float d_max_offset; // Maximum frequency offset for d_sps, samples/symbol + float d_phase; // Instantaneous symbol phase + float d_freq; // Instantaneous symbol frequency, samples/symbol + + public: + int general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + + void set_alpha(float alpha) { d_alpha = alpha; } + void set_beta(float beta) { d_beta = beta; } + void set_max_offset(float max_offset) { d_max_offset = max_offset; } +}; + +#endif /* INCLUDED_NOAA_HRPT_SYNC_CC_H */ diff --git a/gr-noaa/swig/Makefile.am b/gr-noaa/swig/Makefile.am index 927c6cfb..18cb5920 100644 --- a/gr-noaa/swig/Makefile.am +++ b/gr-noaa/swig/Makefile.am @@ -53,7 +53,8 @@ noaa_swig_python = \ # additional SWIG files to be installed noaa_swig_swiginclude_headers = \ noaa_swig.i \ - noaa_carrier_pll_cc.i + noaa_hrpt_pll_cc.i \ + noaa_hrpt_sync_cc.i include $(top_srcdir)/Makefile.swig diff --git a/gr-noaa/swig/noaa_carrier_pll_cc.i b/gr-noaa/swig/noaa_carrier_pll_cc.i deleted file mode 100644 index 4d61f393..00000000 --- a/gr-noaa/swig/noaa_carrier_pll_cc.i +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -GR_SWIG_BLOCK_MAGIC(noaa,carrier_pll_cc) - -noaa_carrier_pll_cc_sptr -noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset); - -class noaa_carrier_pll_cc : public gr_sync_block -{ -private: - noaa_carrier_pll_cc(); - -public: - void set_alpha(float alpha); - void set_beta(float beta); - void set_max_offset(float min_freq); -}; diff --git a/gr-noaa/swig/noaa_hrpt_pll_cc.i b/gr-noaa/swig/noaa_hrpt_pll_cc.i new file mode 100644 index 00000000..a29eaa38 --- /dev/null +++ b/gr-noaa/swig/noaa_hrpt_pll_cc.i @@ -0,0 +1,37 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +GR_SWIG_BLOCK_MAGIC(noaa,hrpt_pll_cc) + +noaa_hrpt_pll_cc_sptr +noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset); + +class noaa_hrpt_pll_cc : public gr_sync_block +{ +private: + noaa_hrpt_pll_cc(); + +public: + void set_alpha(float alpha); + void set_beta(float beta); + void set_max_offset(float min_freq); +}; diff --git a/gr-noaa/swig/noaa_hrpt_sync_cc.i b/gr-noaa/swig/noaa_hrpt_sync_cc.i new file mode 100644 index 00000000..6dcfa57d --- /dev/null +++ b/gr-noaa/swig/noaa_hrpt_sync_cc.i @@ -0,0 +1,37 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +GR_SWIG_BLOCK_MAGIC(noaa,hrpt_sync_cc) + +noaa_hrpt_sync_cc_sptr +noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + +class noaa_hrpt_sync_cc : public gr_sync_block +{ +private: + noaa_hrpt_sync_cc(); + +public: + void set_alpha(float alpha); + void set_beta(float beta); + void set_max_offset(float min_freq); +}; diff --git a/gr-noaa/swig/noaa_swig.i b/gr-noaa/swig/noaa_swig.i index 384f4e6a..470f5f96 100644 --- a/gr-noaa/swig/noaa_swig.i +++ b/gr-noaa/swig/noaa_swig.i @@ -23,7 +23,9 @@ %include "gnuradio.i" %{ -#include +#include +#include %} -%include "noaa_carrier_pll_cc.i" +%include "noaa_hrpt_pll_cc.i" +%include "noaa_hrpt_sync_cc.i"