diff options
-rw-r--r-- | gr-dtv/examples/uhd_atsc_capture.grc | 258 | ||||
-rw-r--r-- | gr-dtv/examples/uhd_atsc_tx.grc | 109 | ||||
-rw-r--r-- | gr-dtv/examples/uhd_rx_atsc.grc | 385 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_fpll_impl.cc | 33 |
4 files changed, 456 insertions, 329 deletions
diff --git a/gr-dtv/examples/uhd_atsc_capture.grc b/gr-dtv/examples/uhd_atsc_capture.grc index 1d9f05920a..13bb4e253f 100644 --- a/gr-dtv/examples/uhd_atsc_capture.grc +++ b/gr-dtv/examples/uhd_atsc_capture.grc @@ -1,6 +1,7 @@ options: parameters: author: '' + catch_exceptions: 'True' category: Custom cmake_opt: '' comment: '' @@ -8,88 +9,87 @@ options: description: '' gen_cmake: 'On' gen_linking: dynamic - generate_options: no_gui + generate_options: qt_gui hier_block_src_path: '.:' id: uhd_atsc_capture max_nouts: '0' output_language: python placement: (0,0) qt_qss_theme: '' - realtime_scheduling: '' + realtime_scheduling: '1' run: 'True' run_command: '{python} -u {filename}' - run_options: run + run_options: prompt sizing_mode: fixed thread_safe_setters: '' - title: Receive ATSC from UHD - window_size: 4000, 4000 + title: Capture ATSC Channel states: - coordinate: [11, 9] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [10, 10] rotation: 0 state: enabled blocks: -- name: antenna - id: variable - parameters: - comment: '' - value: '"TX/RX"' - states: - coordinate: [32, 188.0] - rotation: 0 - state: enabled - name: atsc_sym_rate id: variable parameters: comment: '' value: 4.5e6/286*684 states: - coordinate: [128, 124.0] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [192, 12.0] rotation: 0 state: enabled -- name: duration - id: variable +- name: center_freq + id: variable_qtgui_entry parameters: - comment: '' - value: '30' + comment: Digital Ch 28 - 557MHz + gui_hint: 0,0,1,2 + label: Center Frequency + type: real + value: 557e6 states: - coordinate: [424, 188.0] - rotation: 0 - state: enabled -- name: freq - id: variable - parameters: - comment: '' - value: 605e6 - states: - coordinate: [128, 188.0] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [792, 4.0] rotation: 0 state: enabled - name: gain - id: variable + id: variable_qtgui_range parameters: comment: '' - value: '18' + gui_hint: 1,0,1,2 + label: Gain + min_len: '200' + orient: Qt.Horizontal + rangeType: float + start: '0' + step: '2' + stop: '60' + value: '46' + widget: counter_slider states: - coordinate: [232, 188.0] - rotation: 0 - state: enabled -- name: oversampled_rate - id: variable - parameters: - comment: '' - value: atsc_sym_rate*sps - states: - coordinate: [248, 124.0] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [656, 4.0] rotation: 0 state: enabled - name: sample_rate id: variable parameters: comment: '' - value: 6.25e6 + value: atsc_sym_rate*sps states: - coordinate: [320, 188.0] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [312, 12.0] rotation: 0 state: enabled - name: sps @@ -98,7 +98,10 @@ blocks: comment: '' value: '1.1' states: - coordinate: [32, 124.0] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [432, 12.0] rotation: 0 state: enabled - name: blocks_file_sink_0 @@ -108,35 +111,23 @@ blocks: alias: '' append: 'False' comment: '' - file: atsc_iq.sc16 - type: short + file: /tmp/atsc_11.8385MSPS.iq + type: complex unbuffered: 'False' - vlen: '2' + vlen: '1' states: - coordinate: [600, 324.0] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [336, 276.0] rotation: 0 - state: enabled -- name: blocks_head_0 - id: blocks_head - parameters: - affinity: '' - alias: '' - comment: '' - maxoutbuf: '0' - minoutbuf: '0' - num_items: int(sample_rate*duration) - type: short - vlen: '2' - states: - coordinate: [352, 340.0] - rotation: 0 - state: enabled + state: true - name: u id: uhd_usrp_source parameters: affinity: '' alias: '' - ant0: antenna + ant0: RX2 ant1: '' ant10: '' ant11: '' @@ -200,7 +191,7 @@ blocks: bw7: '0' bw8: '0' bw9: '0' - center_freq0: freq + center_freq0: center_freq center_freq1: '0' center_freq10: '0' center_freq11: '0' @@ -241,7 +232,11 @@ blocks: clock_source5: '' clock_source6: '' clock_source7: '' - comment: '' + comment: 'Sample rate matches symbol rate to + + avoid interpolation error and no longer + + requires an arbitrary resampler for decoding.' dc_offs_enb0: '""' dc_offs_enb1: '""' dc_offs_enb10: '""' @@ -274,7 +269,7 @@ blocks: dc_offs_enb7: '""' dc_offs_enb8: '""' dc_offs_enb9: '""' - dev_addr: '""' + dev_addr: '"num_recv_frames=128"' dev_args: '""' gain0: gain gain1: '0' @@ -441,6 +436,38 @@ blocks: norm_gain9: 'False' num_mboards: '1' otw: '' + rx_agc0: Disabled + rx_agc1: Default + rx_agc10: Default + rx_agc11: Default + rx_agc12: Default + rx_agc13: Default + rx_agc14: Default + rx_agc15: Default + rx_agc16: Default + rx_agc17: Default + rx_agc18: Default + rx_agc19: Default + rx_agc2: Default + rx_agc20: Default + rx_agc21: Default + rx_agc22: Default + rx_agc23: Default + rx_agc24: Default + rx_agc25: Default + rx_agc26: Default + rx_agc27: Default + rx_agc28: Default + rx_agc29: Default + rx_agc3: Default + rx_agc30: Default + rx_agc31: Default + rx_agc4: Default + rx_agc5: Default + rx_agc6: Default + rx_agc7: Default + rx_agc8: Default + rx_agc9: Default samp_rate: sample_rate sd_spec0: '' sd_spec1: '' @@ -453,7 +480,7 @@ blocks: show_lo_controls: 'False' stream_args: '' stream_chans: '[]' - sync: sync + sync: none time_source0: '' time_source1: '' time_source2: '' @@ -462,15 +489,98 @@ blocks: time_source5: '' time_source6: '' time_source7: '' - type: sc16 + type: fc32 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [32, 116.0] + rotation: 0 + state: enabled +- name: usrp_freq_sink + id: qtgui_freq_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + average: '0.2' + axislabels: 'True' + bw: sample_rate + color1: '"blue"' + color10: '"dark blue"' + color2: '"red"' + color3: '"green"' + color4: '"black"' + color5: '"cyan"' + color6: '"magenta"' + color7: '"yellow"' + color8: '"dark red"' + color9: '"dark green"' + comment: '' + ctrlpanel: 'False' + fc: center_freq + fftsize: '2048' + freqhalf: 'True' + grid: 'True' + gui_hint: 3,0,1,4 + label: Relative Gain + label1: RX Signal + label10: '' + label2: '' + label3: '' + label4: '' + label5: '' + label6: '' + label7: '' + label8: '' + label9: '' + legend: 'True' + maxoutbuf: '0' + minoutbuf: '0' + name: '"RX Spectrum"' + nconnections: '1' + showports: 'True' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_tag: '""' + type: complex + units: dB + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + wintype: firdes.WIN_BLACKMAN_hARRIS + ymax: '-20' + ymin: '-100' states: - coordinate: [48, 308.0] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [304, 112.0] rotation: 0 state: enabled connections: -- [blocks_head_0, '0', blocks_file_sink_0, '0'] -- [u, '0', blocks_head_0, '0'] +- [u, '0', blocks_file_sink_0, '0'] +- [u, '0', usrp_freq_sink, '0'] metadata: file_format: 1 diff --git a/gr-dtv/examples/uhd_atsc_tx.grc b/gr-dtv/examples/uhd_atsc_tx.grc index 359d705199..dd7201a4b6 100644 --- a/gr-dtv/examples/uhd_atsc_tx.grc +++ b/gr-dtv/examples/uhd_atsc_tx.grc @@ -1,6 +1,7 @@ options: parameters: author: '' + catch_exceptions: 'True' category: Custom cmake_opt: '' comment: '' @@ -22,9 +23,11 @@ options: sizing_mode: fixed thread_safe_setters: '' title: '' - window_size: 1280, 1024 states: - coordinate: [368, 19] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [448, 20.0] rotation: 0 state: enabled @@ -35,7 +38,10 @@ blocks: comment: '' value: 429e6 states: - coordinate: [808, 20] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [888, 20.0] rotation: 0 state: enabled - name: pilot_freq @@ -44,7 +50,10 @@ blocks: comment: '' value: (6000000.0 - (symbol_rate / 2)) / 2 states: - coordinate: [680, 20] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [760, 20.0] rotation: 0 state: enabled - name: symbol_rate @@ -53,7 +62,10 @@ blocks: comment: '' value: 4500000.0 / 286 * 684 states: - coordinate: [552, 19] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [632, 20.0] rotation: 0 state: enabled - name: tx_gain @@ -71,7 +83,10 @@ blocks: value: '50' widget: counter_slider states: - coordinate: [808, 88] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [888, 84.0] rotation: 0 state: enabled - name: vga1_gain @@ -89,7 +104,10 @@ blocks: value: '-8' widget: counter_slider states: - coordinate: [552, 88] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [632, 84.0] rotation: 0 state: enabled - name: vga2_gain @@ -107,7 +125,10 @@ blocks: value: '10' widget: counter_slider states: - coordinate: [680, 88] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [760, 84.0] rotation: 0 state: enabled - name: blocks_file_source_0 @@ -126,6 +147,9 @@ blocks: type: byte vlen: '1' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [64, 19] rotation: 0 state: enabled @@ -142,6 +166,9 @@ blocks: offset: '4' type: byte states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 468.0] rotation: 0 state: enabled @@ -155,6 +182,9 @@ blocks: minoutbuf: '0' phase_inc: ((-3000000.0 + pilot_freq) / symbol_rate) * (math.pi * 2) states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [336, 332] rotation: 0 state: enabled @@ -170,6 +200,9 @@ blocks: type: byte vlen: '1' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 424.0] rotation: 180 state: enabled @@ -182,6 +215,9 @@ blocks: maxoutbuf: '0' minoutbuf: '0' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 376.0] rotation: 0 state: enabled @@ -194,6 +230,9 @@ blocks: maxoutbuf: '0' minoutbuf: '0' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 280.0] rotation: 0 state: enabled @@ -206,6 +245,9 @@ blocks: maxoutbuf: '0' minoutbuf: '0' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 136.0] rotation: 180 state: enabled @@ -218,6 +260,9 @@ blocks: maxoutbuf: '0' minoutbuf: '0' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 184.0] rotation: 0 state: enabled @@ -230,6 +275,9 @@ blocks: maxoutbuf: '0' minoutbuf: '0' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 232.0] rotation: 180 state: enabled @@ -242,6 +290,9 @@ blocks: maxoutbuf: '0' minoutbuf: '0' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [88, 328.0] rotation: 180 state: enabled @@ -260,6 +311,9 @@ blocks: rate2: C1_5_MEDIUM rate3: C1_4 states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [328, 476.0] rotation: 0 state: enabled @@ -277,6 +331,9 @@ blocks: taps: firdes.root_raised_cosine(0.11, symbol_rate, symbol_rate/2, 0.1152, 200) type: ccc states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [576, 316] rotation: 0 state: enabled @@ -287,9 +344,27 @@ blocks: comment: '' imports: import math states: - coordinate: [368, 91] + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [448, 92.0] rotation: 0 state: enabled +- name: note_0 + id: note + parameters: + alias: '' + comment: 'This file is available at + + http://www.w6rz.net/advatsc.ts' + note: '' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [264, 20.0] + rotation: 0 + state: true - name: qtgui_freq_sink_x_0 id: qtgui_freq_sink_x parameters: @@ -364,6 +439,9 @@ blocks: ymax: '10' ymin: '-140' states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [944, 452.0] rotation: 0 state: enabled @@ -637,30 +715,35 @@ blocks: time_source7: '' type: fc32 states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [944, 276.0] rotation: 0 state: enabled - name: virtual_sink_1 id: virtual_sink parameters: - affinity: '' alias: '' comment: '' stream_id: mod-rot states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [592, 484.0] rotation: 0 state: true - name: virtual_source_1 id: virtual_source parameters: - affinity: '' alias: '' comment: '' - maxoutbuf: '' - minoutbuf: '' stream_id: mod-rot states: + bus_sink: false + bus_source: false + bus_structure: null coordinate: [336, 276.0] rotation: 180 state: true diff --git a/gr-dtv/examples/uhd_rx_atsc.grc b/gr-dtv/examples/uhd_rx_atsc.grc index c7025bba7b..cb0aa31cc5 100644 --- a/gr-dtv/examples/uhd_rx_atsc.grc +++ b/gr-dtv/examples/uhd_rx_atsc.grc @@ -16,14 +16,13 @@ options: output_language: python placement: (0,0) qt_qss_theme: '' - realtime_scheduling: '' + realtime_scheduling: '1' run: 'True' run_command: '{python} -u {filename}' run_options: prompt sizing_mode: fixed thread_safe_setters: '' - title: Receive ATSC from UHD - window_size: 4000, 4000 + title: Receive ATSC from USRP states: bus_sink: false bus_source: false @@ -33,36 +32,6 @@ options: state: enabled blocks: -- name: antenna - id: variable_qtgui_chooser - parameters: - comment: '' - gui_hint: 1,0,1,1 - label: Antenna - label0: TX/RX - label1: RX2 - label2: '' - label3: '' - label4: '' - labels: '[]' - num_opts: '2' - option0: TX/RX - option1: RX2 - option2: '2' - option3: '3' - option4: '4' - options: '[0, 1, 2]' - orient: Qt.QVBoxLayout - type: string - value: TX/RX - widget: radio_buttons - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [344, 20.0] - rotation: 0 - state: enabled - name: atsc_sym_rate id: variable parameters: @@ -72,43 +41,43 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [96, 108.0] + coordinate: [192, 12.0] rotation: 0 state: enabled -- name: freq +- name: center_freq id: variable_qtgui_entry parameters: - comment: '' - gui_hint: 1,1,1,1 - label: Frequency + comment: Digital Ch 28 - 557 MHz + gui_hint: 0,0,1,2 + label: Center Frequency type: real - value: 605e6 + value: 557e6 states: bus_sink: false bus_source: false bus_structure: null - coordinate: [520, 20.0] + coordinate: [792, 4.0] rotation: 0 state: enabled - name: gain id: variable_qtgui_range parameters: comment: '' - gui_hint: 1,3,1,1 + gui_hint: 1,0,1,2 label: Gain min_len: '200' orient: Qt.Horizontal rangeType: float start: '0' - step: '1' - stop: '31' - value: '18' + step: '2' + stop: '60' + value: '46' widget: counter_slider states: bus_sink: false bus_source: false bus_structure: null - coordinate: [664, 20.0] + coordinate: [656, 4.0] rotation: 0 state: enabled - name: oversampled_rate @@ -120,22 +89,19 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [216, 108.0] + coordinate: [432, 12.0] rotation: 0 state: enabled - name: sample_rate - id: variable_qtgui_entry + id: variable parameters: comment: '' - gui_hint: 1,2,1,1 - label: Sample Rate - type: real - value: 6.25e6 + value: atsc_sym_rate*sps states: bus_sink: false bus_source: false bus_structure: null - coordinate: [520, 92.0] + coordinate: [312, 12.0] rotation: 0 state: enabled - name: sps @@ -147,7 +113,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [16, 108.0] + coordinate: [568, 12.0] rotation: 0 state: enabled - name: agc @@ -167,7 +133,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1144, 204.0] + coordinate: [1032, 244.0] rotation: 0 state: enabled - name: blocks_file_sink_0 @@ -177,7 +143,7 @@ blocks: alias: '' append: 'False' comment: '' - file: mpeg.ts + file: /tmp/mpeg.live.ts type: byte unbuffered: 'False' vlen: '1' @@ -185,13 +151,13 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1120, 476.0] + coordinate: [832, 668.0] rotation: 0 state: enabled - name: dc_blocker_xx_0 id: dc_blocker_xx parameters: - affinity: '' + affinity: '1' alias: '' comment: '' length: '4096' @@ -203,41 +169,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [912, 220.0] - rotation: 0 - state: enabled -- name: displays - id: qtgui_tab_widget - parameters: - alias: '' - comment: '' - gui_hint: 0,0,1,4 - label0: RX Spectrum - label1: Baseband - label10: Tab 10 - label11: Tab 11 - label12: Tab 12 - label13: Tab 13 - label14: Tab 14 - label15: Tab 15 - label16: Tab 16 - label17: Tab 17 - label18: Tab 18 - label19: Tab 19 - label2: '' - label3: Tab 3 - label4: Tab 4 - label5: Tab 5 - label6: Tab 6 - label7: Tab 7 - label8: Tab 8 - label9: Tab 9 - num_tabs: '1' - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [192, 28.0] + coordinate: [832, 260.0] rotation: 0 state: enabled - name: dtv_atsc_deinterleaver_0 @@ -252,7 +184,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [136, 496.0] + coordinate: [120, 608.0] rotation: 0 state: enabled - name: dtv_atsc_depad_0 @@ -267,7 +199,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [928, 496.0] + coordinate: [752, 608.0] rotation: 0 state: enabled - name: dtv_atsc_derandomizer_0 @@ -282,7 +214,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [680, 496.0] + coordinate: [568, 608.0] rotation: 0 state: enabled - name: dtv_atsc_equalizer_0 @@ -297,7 +229,23 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [848, 360.0] + coordinate: [664, 504.0] + rotation: 0 + state: enabled +- name: dtv_atsc_fpll_0 + id: dtv_atsc_fpll + parameters: + affinity: '0' + alias: '' + comment: Set core affinity for performance + maxoutbuf: '0' + minoutbuf: '0' + rate: oversampled_rate + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [608, 268.0] rotation: 0 state: enabled - name: dtv_atsc_fs_checker_0 @@ -312,7 +260,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [568, 360.0] + coordinate: [440, 504.0] rotation: 0 state: enabled - name: dtv_atsc_rs_decoder_0 @@ -327,7 +275,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [376, 496.0] + coordinate: [320, 608.0] rotation: 0 state: enabled - name: dtv_atsc_sync_0 @@ -343,94 +291,123 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [320, 356.0] + coordinate: [200, 500.0] rotation: 0 state: enabled - name: dtv_atsc_viterbi_decoder_0 id: dtv_atsc_viterbi_decoder parameters: - affinity: '' + affinity: '2' alias: '' - comment: '' + comment: Set core affinity for performance maxoutbuf: '0' minoutbuf: '0' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1112, 360.0] + coordinate: [816, 504.0] rotation: 0 state: enabled -- name: fpll - id: dtv_atsc_fpll +- name: filter_fft_rrc_filter_0 + id: filter_fft_rrc_filter parameters: affinity: '' alias: '' - comment: '' + alpha: '0.1152' + comment: 'FFT-based filter is less CPU intensive + + for all but the smallest filter tap lengths.' + decim: '1' + gain: '1' maxoutbuf: '0' minoutbuf: '0' - rate: oversampled_rate + ntaps: int((2*8 + 1)*sps) + nthreads: '1' + samp_rate: sample_rate + sym_rate: atsc_sym_rate/2.0 + type: ccc states: bus_sink: false bus_source: false bus_structure: null - coordinate: [616, 228.0] + coordinate: [272, 228.0] rotation: 0 - state: enabled -- name: rx_filter - id: dtv_atsc_rx_filter + state: true +- name: note_0 + id: note parameters: - affinity: '' alias: '' - comment: '' - maxoutbuf: '0' - minoutbuf: '0' - rate: sample_rate - sps: sps + comment: "Past examples with the RX filter use a pfb arb resampler\nthat crushes\ + \ most CPUs. This approach is optimally tuned\nand only needs an FFT-based\ + \ RRC and no resampler \nfor better performance." + note: '' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [336, 220.0] + coordinate: [856, 380.0] rotation: 0 - state: enabled -- name: uhd_usrp_source_0 + state: true +- name: note_1 + id: note + parameters: + alias: '' + comment: "This flowgraph can be adapted to watch the stream live by\ninstalling\ + \ gr-grnet and using a tcp sink in \"server\" mode.\nYou can then use smplayer\ + \ to play the stream (vlc doesn't\nwork as well as it doesn't seem to tolerate\ + \ stream errors\nwell. In smplayer, under options these non-default settings\n\ + seemed to help with stream viewing:\n- set performance preferences to allow\ + \ \n frame drops and hard frame drops.\n- Set hardware decoding to auto.\n\ + - On the cache performance tab Increase stream buffer to 8096.\n\nNOTE: Be patient\ + \ with the players if there's errors in the signal.\nOn a real TV it may pixelate,\ + \ but with streaming players they may\nget out of sync and look like they freeze\ + \ with no video while \nthey're trying to resync with good data." + note: '' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1024, 516.0] + rotation: 0 + state: true +- name: u id: uhd_usrp_source parameters: affinity: '' alias: '' - ant0: TX/RX - ant1: RX2 - ant10: RX2 - ant11: RX2 - ant12: RX2 - ant13: RX2 - ant14: RX2 - ant15: RX2 - ant16: RX2 - ant17: RX2 - ant18: RX2 - ant19: RX2 - ant2: RX2 - ant20: RX2 - ant21: RX2 - ant22: RX2 - ant23: RX2 - ant24: RX2 - ant25: RX2 - ant26: RX2 - ant27: RX2 - ant28: RX2 - ant29: RX2 - ant3: RX2 - ant30: RX2 - ant31: RX2 - ant4: RX2 - ant5: RX2 - ant6: RX2 - ant7: RX2 - ant8: RX2 - ant9: RX2 + ant0: RX2 + ant1: '' + ant10: '' + ant11: '' + ant12: '' + ant13: '' + ant14: '' + ant15: '' + ant16: '' + ant17: '' + ant18: '' + ant19: '' + ant2: '' + ant20: '' + ant21: '' + ant22: '' + ant23: '' + ant24: '' + ant25: '' + ant26: '' + ant27: '' + ant28: '' + ant29: '' + ant3: '' + ant30: '' + ant31: '' + ant4: '' + ant5: '' + ant6: '' + ant7: '' + ant8: '' + ant9: '' bw0: '0' bw1: '0' bw10: '0' @@ -463,7 +440,7 @@ blocks: bw7: '0' bw8: '0' bw9: '0' - center_freq0: freq + center_freq0: center_freq center_freq1: '0' center_freq10: '0' center_freq11: '0' @@ -495,7 +472,7 @@ blocks: center_freq7: '0' center_freq8: '0' center_freq9: '0' - clock_rate: 0e0 + clock_rate: '0.0' clock_source0: '' clock_source1: '' clock_source2: '' @@ -504,7 +481,11 @@ blocks: clock_source5: '' clock_source6: '' clock_source7: '' - comment: '' + comment: 'Sample rate matches symbol rate to + + avoid interpolation error and no longer + + requires an arbitrary resampler.' dc_offs_enb0: '""' dc_offs_enb1: '""' dc_offs_enb10: '""' @@ -537,7 +518,7 @@ blocks: dc_offs_enb7: '""' dc_offs_enb8: '""' dc_offs_enb9: '""' - dev_addr: '"num_recv_frames=128,master_clock_rate=" + str(sample_rate*4)' + dev_addr: '"num_recv_frames=128"' dev_args: '""' gain0: gain gain1: '0' @@ -667,8 +648,8 @@ blocks: lo_source7: internal lo_source8: internal lo_source9: internal - maxoutbuf: '' - minoutbuf: '' + maxoutbuf: '0' + minoutbuf: '0' nchan: '1' norm_gain0: 'False' norm_gain1: 'False' @@ -704,7 +685,7 @@ blocks: norm_gain9: 'False' num_mboards: '1' otw: '' - rx_agc0: Default + rx_agc0: Disabled rx_agc1: Default rx_agc10: Default rx_agc11: Default @@ -762,9 +743,9 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [40, 180.0] + coordinate: [32, 116.0] rotation: 0 - state: true + state: enabled - name: usrp_freq_sink id: qtgui_freq_sink_x parameters: @@ -780,7 +761,7 @@ blocks: alpha7: '1.0' alpha8: '1.0' alpha9: '1.0' - autoscale: 'True' + autoscale: 'False' average: '0.2' axislabels: 'True' bw: sample_rate @@ -796,13 +777,13 @@ blocks: color9: '"dark green"' comment: '' ctrlpanel: 'False' - fc: freq - fftsize: '4096' + fc: center_freq + fftsize: '2048' freqhalf: 'True' grid: 'True' - gui_hint: displays@0 + gui_hint: 3,0,1,4 label: Relative Gain - label1: '' + label1: RX Signal label10: '' label2: '' label3: '' @@ -836,85 +817,31 @@ blocks: width8: '1' width9: '1' wintype: firdes.WIN_BLACKMAN_hARRIS - ymax: '10' - ymin: '-140' + ymax: '-20' + ymin: '-100' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [40, 332.0] - rotation: 180 + coordinate: [304, 112.0] + rotation: 0 state: enabled -- name: virtual_sink_0 - id: virtual_sink - parameters: - alias: '' - comment: '' - stream_id: agc-sync - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [1136, 300.0] - rotation: 180 - state: true -- name: virtual_sink_1 - id: virtual_sink - parameters: - alias: '' - comment: '' - stream_id: viterbi-deint - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [1120, 404.0] - rotation: 180 - state: true -- name: virtual_source_0 - id: virtual_source - parameters: - alias: '' - comment: '' - stream_id: viterbi-deint - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [136, 444.0] - rotation: 180 - state: true -- name: virtual_source_2 - id: virtual_source - parameters: - alias: '' - comment: '' - stream_id: agc-sync - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [320, 300.0] - rotation: 180 - state: true connections: -- [agc, '0', virtual_sink_0, '0'] +- [agc, '0', dtv_atsc_sync_0, '0'] - [dc_blocker_xx_0, '0', agc, '0'] - [dtv_atsc_deinterleaver_0, '0', dtv_atsc_rs_decoder_0, '0'] - [dtv_atsc_depad_0, '0', blocks_file_sink_0, '0'] - [dtv_atsc_derandomizer_0, '0', dtv_atsc_depad_0, '0'] - [dtv_atsc_equalizer_0, '0', dtv_atsc_viterbi_decoder_0, '0'] +- [dtv_atsc_fpll_0, '0', dc_blocker_xx_0, '0'] - [dtv_atsc_fs_checker_0, '0', dtv_atsc_equalizer_0, '0'] - [dtv_atsc_rs_decoder_0, '0', dtv_atsc_derandomizer_0, '0'] - [dtv_atsc_sync_0, '0', dtv_atsc_fs_checker_0, '0'] -- [dtv_atsc_viterbi_decoder_0, '0', virtual_sink_1, '0'] -- [fpll, '0', dc_blocker_xx_0, '0'] -- [rx_filter, '0', fpll, '0'] -- [uhd_usrp_source_0, '0', rx_filter, '0'] -- [uhd_usrp_source_0, '0', usrp_freq_sink, '0'] -- [virtual_source_0, '0', dtv_atsc_deinterleaver_0, '0'] -- [virtual_source_2, '0', dtv_atsc_sync_0, '0'] +- [dtv_atsc_viterbi_decoder_0, '0', dtv_atsc_deinterleaver_0, '0'] +- [filter_fft_rrc_filter_0, '0', dtv_atsc_fpll_0, '0'] +- [u, '0', filter_fft_rrc_filter_0, '0'] +- [u, '0', usrp_freq_sink, '0'] metadata: file_format: 1 diff --git a/gr-dtv/lib/atsc/atsc_fpll_impl.cc b/gr-dtv/lib/atsc/atsc_fpll_impl.cc index 71f24713ac..b85a38207d 100644 --- a/gr-dtv/lib/atsc/atsc_fpll_impl.cc +++ b/gr-dtv/lib/atsc/atsc_fpll_impl.cc @@ -41,32 +41,39 @@ int atsc_fpll_impl::work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) { + constexpr float alpha = 0.01; + constexpr float beta = alpha * alpha / 4.0; + const gr_complex* in = (const gr_complex*)input_items[0]; float* out = (float*)output_items[0]; + float a_cos, a_sin; + float x; + gr_complex result, filtered; for (int k = 0; k < noutput_items; k++) { - float a_cos, a_sin; - d_nco.step(); // increment phase d_nco.sincos(&a_sin, &a_cos); // compute cos and sin // Mix out carrier and output I-only signal - gr_complex result = in[k] * gr_complex(a_sin, a_cos); + + // PR Merge Note: Once the Costas Optimization PR #3076 merges, this + // line below helps with performance when cx_limited_range is not available + // such as on Macs and Windows. Once the merge happens I'll push an update. + // gr::fast_cc_multiply(result, in[k], gr_complex(a_sin, a_cos)); + result = in[k] * gr_complex(a_sin, a_cos); + out[k] = result.real(); // Update phase/freq error - gr_complex filtered = d_afc.filter(result); - float x = gr::fast_atan2f(filtered.imag(), filtered.real()); + filtered = d_afc.filter(result); + x = gr::fast_atan2f(filtered.imag(), filtered.real()); // avoid slamming filter with big transitions - static const float limit = GR_M_PI / 2.0; - if (x > limit) - x = limit; - else if (x < -limit) - x = -limit; - - static const float alpha = 0.01; - static const float beta = alpha * alpha / 4.0; + if (x > M_PI_2) + x = M_PI_2; + else if (x < -M_PI_2) + x = -M_PI_2; + d_nco.adjust_phase(alpha * x); d_nco.adjust_freq(beta * x); } |