├── 4fsk-analysis.png ├── 4fsk.grc ├── M17_impaired.grc ├── M17_impaired.png ├── M17_impaired_eye.png ├── M17_impaired_ui.png ├── README.md ├── Report2288.bin ├── bert.bin ├── grc.png ├── m17-arn-hackrf.grc ├── m17-arn.grc ├── m17-bert-hackrf.grc ├── m17-bert.grc └── make_arn.sh /4fsk-analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobilinkd/m17-gnuradio/c16c9848b374f5a417acc4ef8ae6e85b4ad5a709/4fsk-analysis.png -------------------------------------------------------------------------------- /4fsk.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: rob 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: M17_4fsk 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: M17_4fsk 26 | states: 27 | bus_sink: false 28 | bus_source: false 29 | bus_structure: null 30 | coordinate: [8, 8] 31 | rotation: 0 32 | state: enabled 33 | 34 | blocks: 35 | - name: deviation 36 | id: variable 37 | parameters: 38 | comment: Unit of deviation in Hz (this * symbol value is symbol deviation in Hz) 39 | value: '800' 40 | states: 41 | bus_sink: false 42 | bus_source: false 43 | bus_structure: null 44 | coordinate: [184, 156.0] 45 | rotation: 0 46 | state: enabled 47 | - name: interpolation_rate 48 | id: variable 49 | parameters: 50 | comment: '' 51 | value: '128' 52 | states: 53 | bus_sink: false 54 | bus_source: false 55 | bus_structure: null 56 | coordinate: [288, 12.0] 57 | rotation: 0 58 | state: enabled 59 | - name: sample_rate 60 | id: variable 61 | parameters: 62 | comment: This must be at least 512k for PlutoSDR 63 | value: symbol_rate * interpolation_rate 64 | states: 65 | bus_sink: false 66 | bus_source: false 67 | bus_structure: null 68 | coordinate: [184, 76.0] 69 | rotation: 0 70 | state: enabled 71 | - name: symbol_rate 72 | id: variable 73 | parameters: 74 | comment: '' 75 | value: '4800' 76 | states: 77 | bus_sink: false 78 | bus_source: false 79 | bus_structure: null 80 | coordinate: [184, 12.0] 81 | rotation: 0 82 | state: enabled 83 | - name: analog_frequency_modulator_fc_0 84 | id: analog_frequency_modulator_fc 85 | parameters: 86 | affinity: '' 87 | alias: '' 88 | comment: '' 89 | maxoutbuf: '0' 90 | minoutbuf: '0' 91 | sensitivity: deviation * 2 * 3.141592 / sample_rate 92 | states: 93 | bus_sink: false 94 | bus_source: false 95 | bus_structure: null 96 | coordinate: [272, 748.0] 97 | rotation: 0 98 | state: true 99 | - name: blocks_file_source_0 100 | id: blocks_file_source 101 | parameters: 102 | affinity: '' 103 | alias: '' 104 | begin_tag: pmt.PMT_NIL 105 | comment: '' 106 | file: /home/rob/m17.bin 107 | length: '0' 108 | maxoutbuf: '0' 109 | minoutbuf: '0' 110 | offset: '0' 111 | repeat: 'True' 112 | type: byte 113 | vlen: '1' 114 | states: 115 | bus_sink: false 116 | bus_source: false 117 | bus_structure: null 118 | coordinate: [24, 252.0] 119 | rotation: 0 120 | state: true 121 | - name: blocks_repack_bits_bb_0 122 | id: blocks_repack_bits_bb 123 | parameters: 124 | affinity: '' 125 | alias: '' 126 | align_output: 'False' 127 | comment: '' 128 | endianness: gr.GR_MSB_FIRST 129 | k: '8' 130 | l: '2' 131 | len_tag_key: '""' 132 | maxoutbuf: '0' 133 | minoutbuf: '0' 134 | states: 135 | bus_sink: false 136 | bus_source: false 137 | bus_structure: null 138 | coordinate: [248, 276.0] 139 | rotation: 0 140 | state: true 141 | - name: digital_chunks_to_symbols_xx_0 142 | id: digital_chunks_to_symbols_xx 143 | parameters: 144 | affinity: '' 145 | alias: '' 146 | comment: '' 147 | dimension: '1' 148 | in_type: byte 149 | maxoutbuf: '0' 150 | minoutbuf: '0' 151 | num_ports: '1' 152 | out_type: float 153 | symbol_table: '[+1.0,+3.0,-1.0,-3.0]' 154 | states: 155 | bus_sink: false 156 | bus_source: false 157 | bus_structure: null 158 | coordinate: [488, 288.0] 159 | rotation: 0 160 | state: true 161 | - name: iio_pluto_sink_0 162 | id: iio_pluto_sink 163 | parameters: 164 | affinity: '' 165 | alias: '' 166 | attenuation1: '20.0' 167 | auto_filter: 'True' 168 | bandwidth: sample_rate // 2 169 | buffer_size: '32768' 170 | comment: '' 171 | cyclic: 'False' 172 | filter: '' 173 | frequency: '144910000' 174 | samplerate: sample_rate 175 | uri: ip:192.168.2.1 176 | states: 177 | bus_sink: false 178 | bus_source: false 179 | bus_structure: null 180 | coordinate: [488, 684.0] 181 | rotation: 0 182 | state: true 183 | - name: qtgui_sink_x_0 184 | id: qtgui_sink_x 185 | parameters: 186 | affinity: '' 187 | alias: '' 188 | bw: sample_rate/2 189 | comment: '' 190 | fc: '0' 191 | fftsize: '1024' 192 | gui_hint: '' 193 | maxoutbuf: '0' 194 | minoutbuf: '0' 195 | name: '""' 196 | plotconst: 'True' 197 | plotfreq: 'True' 198 | plottime: 'True' 199 | plotwaterfall: 'True' 200 | rate: '10' 201 | showports: 'False' 202 | showrf: 'False' 203 | type: float 204 | wintype: firdes.WIN_HAMMING 205 | states: 206 | bus_sink: false 207 | bus_source: false 208 | bus_structure: null 209 | coordinate: [488, 548.0] 210 | rotation: 0 211 | state: enabled 212 | - name: root_raised_cosine_filter_0 213 | id: root_raised_cosine_filter 214 | parameters: 215 | affinity: '' 216 | alias: '' 217 | alpha: '0.5' 218 | comment: '' 219 | decim: '1' 220 | gain: interpolation_rate 221 | interp: interpolation_rate 222 | maxoutbuf: '0' 223 | minoutbuf: '0' 224 | ntaps: interpolation_rate*11+1 225 | samp_rate: interpolation_rate 226 | sym_rate: '1' 227 | type: interp_fir_filter_fff 228 | states: 229 | bus_sink: false 230 | bus_source: false 231 | bus_structure: null 232 | coordinate: [488, 388.0] 233 | rotation: 180 234 | state: true 235 | 236 | connections: 237 | - [analog_frequency_modulator_fc_0, '0', iio_pluto_sink_0, '0'] 238 | - [blocks_file_source_0, '0', blocks_repack_bits_bb_0, '0'] 239 | - [blocks_repack_bits_bb_0, '0', digital_chunks_to_symbols_xx_0, '0'] 240 | - [digital_chunks_to_symbols_xx_0, '0', root_raised_cosine_filter_0, '0'] 241 | - [root_raised_cosine_filter_0, '0', analog_frequency_modulator_fc_0, '0'] 242 | - [root_raised_cosine_filter_0, '0', qtgui_sink_x_0, '0'] 243 | 244 | metadata: 245 | file_format: 1 246 | -------------------------------------------------------------------------------- /M17_impaired.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: rob 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: M17_impaired 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: M17_impaired 26 | states: 27 | bus_sink: false 28 | bus_source: false 29 | bus_structure: null 30 | coordinate: [8, 8] 31 | rotation: 0 32 | state: enabled 33 | 34 | blocks: 35 | - name: deviation 36 | id: variable 37 | parameters: 38 | comment: Unit of deviation in Hz (this * symbol value is symbol deviation in Hz) 39 | value: '800' 40 | states: 41 | bus_sink: false 42 | bus_source: false 43 | bus_structure: null 44 | coordinate: [184, 156.0] 45 | rotation: 0 46 | state: enabled 47 | - name: interpolation_rate 48 | id: variable 49 | parameters: 50 | comment: '' 51 | value: '128' 52 | states: 53 | bus_sink: false 54 | bus_source: false 55 | bus_structure: null 56 | coordinate: [288, 12.0] 57 | rotation: 0 58 | state: enabled 59 | - name: lo_frequency 60 | id: variable 61 | parameters: 62 | comment: '' 63 | value: '144910000' 64 | states: 65 | bus_sink: false 66 | bus_source: false 67 | bus_structure: null 68 | coordinate: [288, 76.0] 69 | rotation: 0 70 | state: true 71 | - name: sample_rate 72 | id: variable 73 | parameters: 74 | comment: This must be at least 512k for PlutoSDR 75 | value: symbol_rate * interpolation_rate 76 | states: 77 | bus_sink: false 78 | bus_source: false 79 | bus_structure: null 80 | coordinate: [184, 76.0] 81 | rotation: 0 82 | state: enabled 83 | - name: symbol_rate 84 | id: variable 85 | parameters: 86 | comment: '' 87 | value: '4800' 88 | states: 89 | bus_sink: false 90 | bus_source: false 91 | bus_structure: null 92 | coordinate: [184, 12.0] 93 | rotation: 0 94 | state: enabled 95 | - name: analog_frequency_modulator_fc_0 96 | id: analog_frequency_modulator_fc 97 | parameters: 98 | affinity: '' 99 | alias: '' 100 | comment: '' 101 | maxoutbuf: '0' 102 | minoutbuf: '0' 103 | sensitivity: deviation * 2 * 3.141592 / sample_rate 104 | states: 105 | bus_sink: false 106 | bus_source: false 107 | bus_structure: null 108 | coordinate: [160, 428.0] 109 | rotation: 180 110 | state: true 111 | - name: blocks_file_source_0 112 | id: blocks_file_source 113 | parameters: 114 | affinity: '' 115 | alias: '' 116 | begin_tag: pmt.PMT_NIL 117 | comment: '' 118 | file: ./Report2288.bin 119 | length: '0' 120 | maxoutbuf: '0' 121 | minoutbuf: '0' 122 | offset: '0' 123 | repeat: 'True' 124 | type: byte 125 | vlen: '1' 126 | states: 127 | bus_sink: false 128 | bus_source: false 129 | bus_structure: null 130 | coordinate: [24, 252.0] 131 | rotation: 0 132 | state: true 133 | - name: blocks_multiply_const_vxx_0 134 | id: blocks_multiply_const_vxx 135 | parameters: 136 | affinity: '' 137 | alias: '' 138 | comment: '' 139 | const: '1' 140 | maxoutbuf: '0' 141 | minoutbuf: '0' 142 | type: int 143 | vlen: '1' 144 | states: 145 | bus_sink: false 146 | bus_source: false 147 | bus_structure: null 148 | coordinate: [720, 284.0] 149 | rotation: 0 150 | state: true 151 | - name: blocks_repack_bits_bb_0 152 | id: blocks_repack_bits_bb 153 | parameters: 154 | affinity: '' 155 | alias: '' 156 | align_output: 'False' 157 | comment: '' 158 | endianness: gr.GR_MSB_FIRST 159 | k: '8' 160 | l: '2' 161 | len_tag_key: '""' 162 | maxoutbuf: '0' 163 | minoutbuf: '0' 164 | states: 165 | bus_sink: false 166 | bus_source: false 167 | bus_structure: null 168 | coordinate: [248, 276.0] 169 | rotation: 0 170 | state: true 171 | - name: channels_channel_model_0 172 | id: channels_channel_model 173 | parameters: 174 | affinity: '' 175 | alias: '' 176 | block_tags: 'False' 177 | comment: '' 178 | epsilon: '1.0002' 179 | freq_offset: '0.001' 180 | maxoutbuf: '0' 181 | minoutbuf: '0' 182 | noise_voltage: '1' 183 | seed: '0' 184 | taps: 1.0 + 1.0j 185 | states: 186 | bus_sink: false 187 | bus_source: false 188 | bus_structure: null 189 | coordinate: [496, 588.0] 190 | rotation: 0 191 | state: enabled 192 | - name: channels_selective_fading_model_0 193 | id: channels_selective_fading_model 194 | parameters: 195 | K: '4.0' 196 | LOS: 'True' 197 | N: '8' 198 | affinity: '' 199 | alias: '' 200 | comment: '' 201 | delays: (0.0,0.1,1.3) 202 | fDTs: 10.0/sample_rate 203 | mags: (1,0.99,0.97) 204 | maxoutbuf: '0' 205 | minoutbuf: '0' 206 | ntaps: '12' 207 | seed: '0' 208 | states: 209 | bus_sink: false 210 | bus_source: false 211 | bus_structure: null 212 | coordinate: [160, 572.0] 213 | rotation: 0 214 | state: true 215 | - name: digital_chunks_to_symbols_xx_0 216 | id: digital_chunks_to_symbols_xx 217 | parameters: 218 | affinity: '' 219 | alias: '' 220 | comment: '' 221 | dimension: '1' 222 | in_type: byte 223 | maxoutbuf: '0' 224 | minoutbuf: '0' 225 | num_ports: '1' 226 | out_type: float 227 | symbol_table: '[+1.0,+3.0,-1.0,-3.0]' 228 | states: 229 | bus_sink: false 230 | bus_source: false 231 | bus_structure: null 232 | coordinate: [488, 288.0] 233 | rotation: 0 234 | state: true 235 | - name: iio_pluto_sink_0 236 | id: iio_pluto_sink 237 | parameters: 238 | affinity: '' 239 | alias: '' 240 | attenuation1: '30.0' 241 | auto_filter: 'True' 242 | bandwidth: '200000' 243 | buffer_size: '32768' 244 | comment: '' 245 | cyclic: 'False' 246 | filter: '' 247 | frequency: lo_frequency 248 | samplerate: sample_rate 249 | uri: ip:192.168.2.1 250 | states: 251 | bus_sink: false 252 | bus_source: false 253 | bus_structure: null 254 | coordinate: [824, 716.0] 255 | rotation: 0 256 | state: enabled 257 | - name: qtgui_freq_sink_x_0 258 | id: qtgui_freq_sink_x 259 | parameters: 260 | affinity: '' 261 | alias: '' 262 | alpha1: '1.0' 263 | alpha10: '1.0' 264 | alpha2: '1.0' 265 | alpha3: '1.0' 266 | alpha4: '1.0' 267 | alpha5: '1.0' 268 | alpha6: '1.0' 269 | alpha7: '1.0' 270 | alpha8: '1.0' 271 | alpha9: '1.0' 272 | autoscale: 'False' 273 | average: '1.0' 274 | axislabels: 'True' 275 | bw: sample_rate 276 | color1: '"blue"' 277 | color10: '"dark blue"' 278 | color2: '"red"' 279 | color3: '"green"' 280 | color4: '"black"' 281 | color5: '"cyan"' 282 | color6: '"magenta"' 283 | color7: '"yellow"' 284 | color8: '"dark red"' 285 | color9: '"dark green"' 286 | comment: '' 287 | ctrlpanel: 'False' 288 | fc: '0' 289 | fftsize: '1024' 290 | freqhalf: 'True' 291 | grid: 'False' 292 | gui_hint: '' 293 | label: Relative Gain 294 | label1: '' 295 | label10: '''''' 296 | label2: '''''' 297 | label3: '''''' 298 | label4: '''''' 299 | label5: '''''' 300 | label6: '''''' 301 | label7: '''''' 302 | label8: '''''' 303 | label9: '''''' 304 | legend: 'True' 305 | maxoutbuf: '0' 306 | minoutbuf: '0' 307 | name: '""' 308 | nconnections: '1' 309 | showports: 'False' 310 | tr_chan: '0' 311 | tr_level: '0.0' 312 | tr_mode: qtgui.TRIG_MODE_FREE 313 | tr_tag: '""' 314 | type: complex 315 | units: dB 316 | update_time: '0.10' 317 | width1: '1' 318 | width10: '1' 319 | width2: '1' 320 | width3: '1' 321 | width4: '1' 322 | width5: '1' 323 | width6: '1' 324 | width7: '1' 325 | width8: '1' 326 | width9: '1' 327 | wintype: firdes.WIN_BLACKMAN_hARRIS 328 | ymax: '10' 329 | ymin: '-140' 330 | states: 331 | bus_sink: false 332 | bus_source: false 333 | bus_structure: null 334 | coordinate: [824, 584.0] 335 | rotation: 0 336 | state: enabled 337 | - name: qtgui_time_sink_x_0 338 | id: qtgui_time_sink_x 339 | parameters: 340 | affinity: '' 341 | alias: '' 342 | alpha1: '1.0' 343 | alpha10: '1.0' 344 | alpha2: '1.0' 345 | alpha3: '1.0' 346 | alpha4: '1.0' 347 | alpha5: '1.0' 348 | alpha6: '1.0' 349 | alpha7: '1.0' 350 | alpha8: '1.0' 351 | alpha9: '1.0' 352 | autoscale: 'False' 353 | axislabels: 'True' 354 | color1: blue 355 | color10: dark blue 356 | color2: red 357 | color3: green 358 | color4: black 359 | color5: cyan 360 | color6: magenta 361 | color7: yellow 362 | color8: dark red 363 | color9: dark green 364 | comment: '' 365 | ctrlpanel: 'False' 366 | entags: 'True' 367 | grid: 'False' 368 | gui_hint: '' 369 | label1: Signal 1 370 | label10: Signal 10 371 | label2: Signal 2 372 | label3: Signal 3 373 | label4: Signal 4 374 | label5: Signal 5 375 | label6: Signal 6 376 | label7: Signal 7 377 | label8: Signal 8 378 | label9: Signal 9 379 | legend: 'True' 380 | marker1: '-1' 381 | marker10: '-1' 382 | marker2: '-1' 383 | marker3: '-1' 384 | marker4: '-1' 385 | marker5: '-1' 386 | marker6: '-1' 387 | marker7: '-1' 388 | marker8: '-1' 389 | marker9: '-1' 390 | name: '""' 391 | nconnections: '1' 392 | size: '1024' 393 | srate: sample_rate 394 | stemplot: 'False' 395 | style1: '1' 396 | style10: '1' 397 | style2: '1' 398 | style3: '1' 399 | style4: '1' 400 | style5: '1' 401 | style6: '1' 402 | style7: '1' 403 | style8: '1' 404 | style9: '1' 405 | tr_chan: '0' 406 | tr_delay: '0' 407 | tr_level: '0.0' 408 | tr_mode: qtgui.TRIG_MODE_FREE 409 | tr_slope: qtgui.TRIG_SLOPE_POS 410 | tr_tag: '""' 411 | type: complex 412 | update_time: '0.10' 413 | width1: '1' 414 | width10: '1' 415 | width2: '1' 416 | width3: '1' 417 | width4: '1' 418 | width5: '1' 419 | width6: '1' 420 | width7: '1' 421 | width8: '1' 422 | width9: '1' 423 | ylabel: Amplitude 424 | ymax: '6' 425 | ymin: '-6' 426 | yunit: '""' 427 | states: 428 | bus_sink: false 429 | bus_source: false 430 | bus_structure: null 431 | coordinate: [824, 460.0] 432 | rotation: 0 433 | state: enabled 434 | - name: root_raised_cosine_filter_0 435 | id: root_raised_cosine_filter 436 | parameters: 437 | affinity: '' 438 | alias: '' 439 | alpha: '0.5' 440 | comment: '' 441 | decim: '1' 442 | gain: interpolation_rate 443 | interp: interpolation_rate 444 | maxoutbuf: '0' 445 | minoutbuf: '0' 446 | ntaps: interpolation_rate*11+1 447 | samp_rate: interpolation_rate 448 | sym_rate: '1' 449 | type: interp_fir_filter_fff 450 | states: 451 | bus_sink: false 452 | bus_source: false 453 | bus_structure: null 454 | coordinate: [488, 388.0] 455 | rotation: 180 456 | state: true 457 | 458 | connections: 459 | - [analog_frequency_modulator_fc_0, '0', channels_selective_fading_model_0, '0'] 460 | - [blocks_file_source_0, '0', blocks_repack_bits_bb_0, '0'] 461 | - [blocks_multiply_const_vxx_0, '0', root_raised_cosine_filter_0, '0'] 462 | - [blocks_repack_bits_bb_0, '0', digital_chunks_to_symbols_xx_0, '0'] 463 | - [channels_channel_model_0, '0', iio_pluto_sink_0, '0'] 464 | - [channels_channel_model_0, '0', qtgui_freq_sink_x_0, '0'] 465 | - [channels_channel_model_0, '0', qtgui_time_sink_x_0, '0'] 466 | - [channels_selective_fading_model_0, '0', channels_channel_model_0, '0'] 467 | - [digital_chunks_to_symbols_xx_0, '0', blocks_multiply_const_vxx_0, '0'] 468 | - [root_raised_cosine_filter_0, '0', analog_frequency_modulator_fc_0, '0'] 469 | 470 | metadata: 471 | file_format: 1 472 | -------------------------------------------------------------------------------- /M17_impaired.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobilinkd/m17-gnuradio/c16c9848b374f5a417acc4ef8ae6e85b4ad5a709/M17_impaired.png -------------------------------------------------------------------------------- /M17_impaired_eye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobilinkd/m17-gnuradio/c16c9848b374f5a417acc4ef8ae6e85b4ad5a709/M17_impaired_eye.png -------------------------------------------------------------------------------- /M17_impaired_ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobilinkd/m17-gnuradio/c16c9848b374f5a417acc4ef8ae6e85b4ad5a709/M17_impaired_ui.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # M17 Gnu Radio Testing 2 | 3 | This is a quick 4-FSK flow graph for M17 RF transmit. 4 | 5 | Source is a file of M17 type 4 data. 6 | 7 | Sink is an ADALM Pluto SDR. 8 | 9 | Modify source and sink to suit one's needs. 10 | 11 | ![Gnu Radio flow graph](grc.png) 12 | ![Signal analysis](4fsk-analysis.png) 13 | 14 | ## Impairment Testing 15 | 16 | `M17_impaired.grc` and `M17_impaired.py` an M17 impairment test. It can 17 | implement Rayleigh or Rician fading models, AWGN, frequency errors, and 18 | timing errors. 19 | 20 | Before running this test one should calibrate the transmitter and receiver 21 | so that the transmit and recieve frequencies are precisely aligned. 22 | 23 | Adjust the `lo_frequency` variable to the desired transmit frequency. 24 | 25 | ![M17_impaired GRC flow graph](M17_impaired.png) 26 | 27 | Replace the sink with whatever is appropriate for your TX hardware. 28 | 29 | This uses a rather long audio program to test the receiver. 30 | 31 | ![M17_impaired UI](M17_impaired_ui.png) 32 | 33 | The impairments can get pretty severe. This is what a *typical* 34 | eye diagram of the received baseband signal looks like. 35 | 36 | ![M17_impaired eye diagram](M17_impaired_eye.png) 37 | 38 | ## HackRF Flow Graphs 39 | 40 | There are two enhanced flow graphs for HackRF. I use the HackRF for 41 | test more these days because it allows me to feed a 10MHz reference 42 | from my GPSDO for accurate frequency transmission. 43 | 44 | The first is `m17-arn-hackrf.grc` which is used to transmit a long 45 | form audio broadcast from Amateur Radio Newsline. There is a script, 46 | `make_arn.sh`, which I use to create the bitstream using `m17-cxx-mod`r 47 | which may need to be modified to suit specific needs (changing the 48 | path to m17-cxx-mod or the name of the latest ARN MP3 file). 49 | 50 | The second is `m17-bert-hackrf.grc` which is used to transmit a BER 51 | test bitstream. 52 | 53 | Both have GUI controls to change the following impairments: 54 | 55 | - AWGN -- this is a noise voltage level, with 2.0 begin 0dB. 56 | - Frequency -- this is a frequency offset in % of 800Hz symbol unit. 57 | - Clock -- this is the symbol clock offset in PPM. 58 | - Fading -- this enables or disables frequency selective fading model. 59 | 60 | ## Pluto Flow Graphs 61 | 62 | There are two enhanced flow graphs for PlutoSDR. My Plutos have 63 | been modified to have accurate TXCOs and so can be used as reasonable 64 | reference units, but are not as accurate as a HackRF clocked by 65 | a 10MHz GPSDO reference. 66 | 67 | These are similar to the enhanced HackRF flow graphs described above. 68 | 69 | ## Making the AR Newsline Bitstream 70 | 71 | We do not ship the AR Newsline bitstream because the content is 72 | owned by *Amateur Radio Newsline* and I do not have permission to 73 | distribute it. 74 | 75 | There are two steps to making an AR Newsline M17 bitstream file. The 76 | first step is to go to the AR Newsline web site and download the 77 | latest MP3 file. https://www.arnewsline.org/ 78 | 79 | The second is to use `ffmpeg` to transform the MP3 to PCM and 80 | use `m17-cxx-mod` to convert it to a bitstream. 81 | 82 | ffmpeg -i Report2328.mp3 -ar 8000 -ac 1 -f s16le -acodec pcm_s16le - | ~/m17-cxx-demod/build/apps/m17-mod -b -S M17 > Report2328.bin 83 | 84 | There is a script, `make_arn.sh` which can be modified to automate 85 | the process for you. 86 | 87 | -------------------------------------------------------------------------------- /Report2288.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobilinkd/m17-gnuradio/c16c9848b374f5a417acc4ef8ae6e85b4ad5a709/Report2288.bin -------------------------------------------------------------------------------- /bert.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobilinkd/m17-gnuradio/c16c9848b374f5a417acc4ef8ae6e85b4ad5a709/bert.bin -------------------------------------------------------------------------------- /grc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobilinkd/m17-gnuradio/c16c9848b374f5a417acc4ef8ae6e85b4ad5a709/grc.png -------------------------------------------------------------------------------- /m17-arn-hackrf.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: rob 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: M17_arn_hackrf 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: M17 Amateur Radio Newsline 26 | window_size: (1000,1000) 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: deviation 37 | id: variable 38 | parameters: 39 | comment: Unit of deviation in Hz (this * symbol value is symbol deviation in Hz) 40 | value: '800' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [184, 156.0] 46 | rotation: 0 47 | state: enabled 48 | - name: interpolation_rate 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: '10' 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [288, 12.0] 58 | rotation: 0 59 | state: enabled 60 | - name: sample_rate 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: symbol_rate * interpolation_rate 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [184, 76.0] 70 | rotation: 0 71 | state: enabled 72 | - name: symbol_rate 73 | id: variable 74 | parameters: 75 | comment: '' 76 | value: '4800' 77 | states: 78 | bus_sink: false 79 | bus_source: false 80 | bus_structure: null 81 | coordinate: [184, 12.0] 82 | rotation: 0 83 | state: enabled 84 | - name: tx_rate 85 | id: variable 86 | parameters: 87 | comment: This must be at least 512k for PlutoSDR and 8M for HackRF 88 | value: '8000000.0' 89 | states: 90 | bus_sink: false 91 | bus_source: false 92 | bus_structure: null 93 | coordinate: [288, 76.0] 94 | rotation: 0 95 | state: true 96 | - name: variable_awgn 97 | id: variable_qtgui_range 98 | parameters: 99 | comment: AWGN noise voltage. 100 | gui_hint: '' 101 | label: AWGN 102 | min_len: '200' 103 | orient: QtCore.Qt.Horizontal 104 | rangeType: float 105 | start: '0' 106 | step: '.1' 107 | stop: '2.0' 108 | value: '0.0' 109 | widget: counter_slider 110 | states: 111 | bus_sink: false 112 | bus_source: false 113 | bus_structure: null 114 | coordinate: [632, 12.0] 115 | rotation: 0 116 | state: true 117 | - name: variable_clock_offset 118 | id: variable_qtgui_range 119 | parameters: 120 | comment: 'Symbol clock frequency 121 | 122 | offset in PPM.' 123 | gui_hint: '' 124 | label: Clock 125 | min_len: '200' 126 | orient: QtCore.Qt.Horizontal 127 | rangeType: float 128 | start: '-250' 129 | step: '2.5' 130 | stop: '250' 131 | value: '0' 132 | widget: counter_slider 133 | states: 134 | bus_sink: false 135 | bus_source: false 136 | bus_structure: null 137 | coordinate: [952, 12.0] 138 | rotation: 0 139 | state: true 140 | - name: variable_frequency_offset 141 | id: variable_qtgui_range 142 | parameters: 143 | comment: 'Frequency offset expressed 144 | 145 | as a percentage of symbol 146 | 147 | deviation (800Hz).' 148 | gui_hint: '' 149 | label: Frequency 150 | min_len: '200' 151 | orient: QtCore.Qt.Horizontal 152 | rangeType: float 153 | start: '-100' 154 | step: '1' 155 | stop: '100' 156 | value: '0.0' 157 | widget: counter_slider 158 | states: 159 | bus_sink: false 160 | bus_source: false 161 | bus_structure: null 162 | coordinate: [776, 12.0] 163 | rotation: 0 164 | state: true 165 | - name: variable_qtgui_toggle_button_msg_0 166 | id: variable_qtgui_toggle_button_msg 167 | parameters: 168 | comment: '' 169 | gui_hint: '' 170 | initPressed: 'False' 171 | label: Fading 172 | outputmsgname: fading_selector 173 | pressBackgroundColor: default 174 | pressFontColor: default 175 | pressed: '1' 176 | relBackgroundColor: default 177 | relFontColor: default 178 | released: '0' 179 | type: int 180 | value: '0' 181 | states: 182 | bus_sink: false 183 | bus_source: false 184 | bus_structure: null 185 | coordinate: [72, 724.0] 186 | rotation: 0 187 | state: true 188 | - name: analog_frequency_modulator_fc_0 189 | id: analog_frequency_modulator_fc 190 | parameters: 191 | affinity: '' 192 | alias: '' 193 | comment: '' 194 | maxoutbuf: '0' 195 | minoutbuf: '0' 196 | sensitivity: deviation * 2 * 3.141592 / sample_rate 197 | states: 198 | bus_sink: false 199 | bus_source: false 200 | bus_structure: null 201 | coordinate: [96, 428.0] 202 | rotation: 180 203 | state: true 204 | - name: blocks_file_source_0 205 | id: blocks_file_source 206 | parameters: 207 | affinity: '' 208 | alias: '' 209 | begin_tag: pmt.PMT_NIL 210 | comment: '' 211 | file: Report2328.bin 212 | length: '0' 213 | maxoutbuf: '0' 214 | minoutbuf: '0' 215 | offset: '0' 216 | repeat: 'True' 217 | type: byte 218 | vlen: '1' 219 | states: 220 | bus_sink: false 221 | bus_source: false 222 | bus_structure: null 223 | coordinate: [24, 252.0] 224 | rotation: 0 225 | state: true 226 | - name: blocks_repack_bits_bb_0 227 | id: blocks_repack_bits_bb 228 | parameters: 229 | affinity: '' 230 | alias: '' 231 | align_output: 'False' 232 | comment: '' 233 | endianness: gr.GR_MSB_FIRST 234 | k: '8' 235 | l: '2' 236 | len_tag_key: '""' 237 | maxoutbuf: '0' 238 | minoutbuf: '0' 239 | states: 240 | bus_sink: false 241 | bus_source: false 242 | bus_structure: null 243 | coordinate: [208, 276.0] 244 | rotation: 0 245 | state: true 246 | - name: blocks_selector_0 247 | id: blocks_selector 248 | parameters: 249 | affinity: '' 250 | alias: '' 251 | comment: '' 252 | enabled: 'True' 253 | input_index: '0' 254 | maxoutbuf: '0' 255 | minoutbuf: '0' 256 | num_inputs: '2' 257 | num_outputs: '1' 258 | output_index: '0' 259 | showports: 'False' 260 | type: complex 261 | vlen: '1' 262 | states: 263 | bus_sink: false 264 | bus_source: false 265 | bus_structure: null 266 | coordinate: [400, 568.0] 267 | rotation: 0 268 | state: true 269 | - name: channels_channel_model_0_0 270 | id: channels_channel_model 271 | parameters: 272 | affinity: '' 273 | alias: '' 274 | block_tags: 'False' 275 | comment: '' 276 | epsilon: 1.0 + (variable_clock_offset / 1000000.0) 277 | freq_offset: (variable_frequency_offset / symbol_rate) * 0.4 278 | maxoutbuf: '0' 279 | minoutbuf: '0' 280 | noise_voltage: variable_awgn 281 | seed: '0' 282 | taps: 1.0 + 1.0j 283 | states: 284 | bus_sink: false 285 | bus_source: false 286 | bus_structure: null 287 | coordinate: [616, 588.0] 288 | rotation: 0 289 | state: enabled 290 | - name: channels_selective_fading_model_0 291 | id: channels_selective_fading_model 292 | parameters: 293 | K: '4.0' 294 | LOS: 'False' 295 | N: '8' 296 | affinity: '' 297 | alias: '' 298 | comment: '' 299 | delays: (0.0,0.1,1.3) 300 | fDTs: 10.0/sample_rate 301 | mags: (1,0.99,0.97) 302 | maxoutbuf: '0' 303 | minoutbuf: '0' 304 | ntaps: '8' 305 | seed: '0' 306 | states: 307 | bus_sink: false 308 | bus_source: false 309 | bus_structure: null 310 | coordinate: [72, 540.0] 311 | rotation: 0 312 | state: enabled 313 | - name: digital_chunks_to_symbols_xx_0 314 | id: digital_chunks_to_symbols_xx 315 | parameters: 316 | affinity: '' 317 | alias: '' 318 | comment: '' 319 | dimension: '1' 320 | in_type: byte 321 | maxoutbuf: '0' 322 | minoutbuf: '0' 323 | num_ports: '1' 324 | out_type: float 325 | symbol_table: '[+1.0,+3.0,-1.0,-3.0]' 326 | states: 327 | bus_sink: false 328 | bus_source: false 329 | bus_structure: null 330 | coordinate: [432, 288.0] 331 | rotation: 0 332 | state: true 333 | - name: osmosdr_sink_1 334 | id: osmosdr_sink 335 | parameters: 336 | affinity: '' 337 | alias: '' 338 | ant0: '' 339 | ant1: '' 340 | ant10: '' 341 | ant11: '' 342 | ant12: '' 343 | ant13: '' 344 | ant14: '' 345 | ant15: '' 346 | ant16: '' 347 | ant17: '' 348 | ant18: '' 349 | ant19: '' 350 | ant2: '' 351 | ant20: '' 352 | ant21: '' 353 | ant22: '' 354 | ant23: '' 355 | ant24: '' 356 | ant25: '' 357 | ant26: '' 358 | ant27: '' 359 | ant28: '' 360 | ant29: '' 361 | ant3: '' 362 | ant30: '' 363 | ant31: '' 364 | ant4: '' 365 | ant5: '' 366 | ant6: '' 367 | ant7: '' 368 | ant8: '' 369 | ant9: '' 370 | args: '"hackrf"' 371 | bb_gain0: '20' 372 | bb_gain1: '20' 373 | bb_gain10: '20' 374 | bb_gain11: '20' 375 | bb_gain12: '20' 376 | bb_gain13: '20' 377 | bb_gain14: '20' 378 | bb_gain15: '20' 379 | bb_gain16: '20' 380 | bb_gain17: '20' 381 | bb_gain18: '20' 382 | bb_gain19: '20' 383 | bb_gain2: '20' 384 | bb_gain20: '20' 385 | bb_gain21: '20' 386 | bb_gain22: '20' 387 | bb_gain23: '20' 388 | bb_gain24: '20' 389 | bb_gain25: '20' 390 | bb_gain26: '20' 391 | bb_gain27: '20' 392 | bb_gain28: '20' 393 | bb_gain29: '20' 394 | bb_gain3: '20' 395 | bb_gain30: '20' 396 | bb_gain31: '20' 397 | bb_gain4: '20' 398 | bb_gain5: '20' 399 | bb_gain6: '20' 400 | bb_gain7: '20' 401 | bb_gain8: '20' 402 | bb_gain9: '20' 403 | bw0: '25000' 404 | bw1: '0' 405 | bw10: '0' 406 | bw11: '0' 407 | bw12: '0' 408 | bw13: '0' 409 | bw14: '0' 410 | bw15: '0' 411 | bw16: '0' 412 | bw17: '0' 413 | bw18: '0' 414 | bw19: '0' 415 | bw2: '0' 416 | bw20: '0' 417 | bw21: '0' 418 | bw22: '0' 419 | bw23: '0' 420 | bw24: '0' 421 | bw25: '0' 422 | bw26: '0' 423 | bw27: '0' 424 | bw28: '0' 425 | bw29: '0' 426 | bw3: '0' 427 | bw30: '0' 428 | bw31: '0' 429 | bw4: '0' 430 | bw5: '0' 431 | bw6: '0' 432 | bw7: '0' 433 | bw8: '0' 434 | bw9: '0' 435 | clock_source0: external 436 | clock_source1: '' 437 | clock_source2: '' 438 | clock_source3: '' 439 | clock_source4: '' 440 | clock_source5: '' 441 | clock_source6: '' 442 | clock_source7: '' 443 | comment: '' 444 | corr0: '0' 445 | corr1: '0' 446 | corr10: '0' 447 | corr11: '0' 448 | corr12: '0' 449 | corr13: '0' 450 | corr14: '0' 451 | corr15: '0' 452 | corr16: '0' 453 | corr17: '0' 454 | corr18: '0' 455 | corr19: '0' 456 | corr2: '0' 457 | corr20: '0' 458 | corr21: '0' 459 | corr22: '0' 460 | corr23: '0' 461 | corr24: '0' 462 | corr25: '0' 463 | corr26: '0' 464 | corr27: '0' 465 | corr28: '0' 466 | corr29: '0' 467 | corr3: '0' 468 | corr30: '0' 469 | corr31: '0' 470 | corr4: '0' 471 | corr5: '0' 472 | corr6: '0' 473 | corr7: '0' 474 | corr8: '0' 475 | corr9: '0' 476 | freq0: '144910000' 477 | freq1: 100e6 478 | freq10: 100e6 479 | freq11: 100e6 480 | freq12: 100e6 481 | freq13: 100e6 482 | freq14: 100e6 483 | freq15: 100e6 484 | freq16: 100e6 485 | freq17: 100e6 486 | freq18: 100e6 487 | freq19: 100e6 488 | freq2: 100e6 489 | freq20: 100e6 490 | freq21: 100e6 491 | freq22: 100e6 492 | freq23: 100e6 493 | freq24: 100e6 494 | freq25: 100e6 495 | freq26: 100e6 496 | freq27: 100e6 497 | freq28: 100e6 498 | freq29: 100e6 499 | freq3: 100e6 500 | freq30: 100e6 501 | freq31: 100e6 502 | freq4: 100e6 503 | freq5: 100e6 504 | freq6: 100e6 505 | freq7: 100e6 506 | freq8: 100e6 507 | freq9: 100e6 508 | gain0: '14' 509 | gain1: '10' 510 | gain10: '10' 511 | gain11: '10' 512 | gain12: '10' 513 | gain13: '10' 514 | gain14: '10' 515 | gain15: '10' 516 | gain16: '10' 517 | gain17: '10' 518 | gain18: '10' 519 | gain19: '10' 520 | gain2: '10' 521 | gain20: '10' 522 | gain21: '10' 523 | gain22: '10' 524 | gain23: '10' 525 | gain24: '10' 526 | gain25: '10' 527 | gain26: '10' 528 | gain27: '10' 529 | gain28: '10' 530 | gain29: '10' 531 | gain3: '10' 532 | gain30: '10' 533 | gain31: '10' 534 | gain4: '10' 535 | gain5: '10' 536 | gain6: '10' 537 | gain7: '10' 538 | gain8: '10' 539 | gain9: '10' 540 | if_gain0: '25' 541 | if_gain1: '20' 542 | if_gain10: '20' 543 | if_gain11: '20' 544 | if_gain12: '20' 545 | if_gain13: '20' 546 | if_gain14: '20' 547 | if_gain15: '20' 548 | if_gain16: '20' 549 | if_gain17: '20' 550 | if_gain18: '20' 551 | if_gain19: '20' 552 | if_gain2: '20' 553 | if_gain20: '20' 554 | if_gain21: '20' 555 | if_gain22: '20' 556 | if_gain23: '20' 557 | if_gain24: '20' 558 | if_gain25: '20' 559 | if_gain26: '20' 560 | if_gain27: '20' 561 | if_gain28: '20' 562 | if_gain29: '20' 563 | if_gain3: '20' 564 | if_gain30: '20' 565 | if_gain31: '20' 566 | if_gain4: '20' 567 | if_gain5: '20' 568 | if_gain6: '20' 569 | if_gain7: '20' 570 | if_gain8: '20' 571 | if_gain9: '20' 572 | maxoutbuf: '0' 573 | minoutbuf: '0' 574 | nchan: '1' 575 | num_mboards: '1' 576 | sample_rate: tx_rate 577 | sync: none 578 | time_source0: external 579 | time_source1: '' 580 | time_source2: '' 581 | time_source3: '' 582 | time_source4: '' 583 | time_source5: '' 584 | time_source6: '' 585 | time_source7: '' 586 | type: fc32 587 | states: 588 | bus_sink: false 589 | bus_source: false 590 | bus_structure: null 591 | coordinate: [904, 212.0] 592 | rotation: 0 593 | state: true 594 | - name: qtgui_freq_sink_x_0 595 | id: qtgui_freq_sink_x 596 | parameters: 597 | affinity: '' 598 | alias: '' 599 | alpha1: '1.0' 600 | alpha10: '1.0' 601 | alpha2: '1.0' 602 | alpha3: '1.0' 603 | alpha4: '1.0' 604 | alpha5: '1.0' 605 | alpha6: '1.0' 606 | alpha7: '1.0' 607 | alpha8: '1.0' 608 | alpha9: '1.0' 609 | autoscale: 'False' 610 | average: '1.0' 611 | axislabels: 'True' 612 | bw: sample_rate 613 | color1: '"blue"' 614 | color10: '"dark blue"' 615 | color2: '"red"' 616 | color3: '"green"' 617 | color4: '"black"' 618 | color5: '"cyan"' 619 | color6: '"magenta"' 620 | color7: '"yellow"' 621 | color8: '"dark red"' 622 | color9: '"dark green"' 623 | comment: '' 624 | ctrlpanel: 'False' 625 | fc: '0' 626 | fftsize: '1024' 627 | freqhalf: 'True' 628 | grid: 'False' 629 | gui_hint: '' 630 | label: Relative Gain 631 | label1: '' 632 | label10: '''''' 633 | label2: '''''' 634 | label3: '''''' 635 | label4: '''''' 636 | label5: '''''' 637 | label6: '''''' 638 | label7: '''''' 639 | label8: '''''' 640 | label9: '''''' 641 | legend: 'True' 642 | maxoutbuf: '0' 643 | minoutbuf: '0' 644 | name: '""' 645 | nconnections: '1' 646 | norm_window: 'False' 647 | showports: 'False' 648 | tr_chan: '0' 649 | tr_level: '0.0' 650 | tr_mode: qtgui.TRIG_MODE_FREE 651 | tr_tag: '""' 652 | type: complex 653 | units: dB 654 | update_time: '0.10' 655 | width1: '1' 656 | width10: '1' 657 | width2: '1' 658 | width3: '1' 659 | width4: '1' 660 | width5: '1' 661 | width6: '1' 662 | width7: '1' 663 | width8: '1' 664 | width9: '1' 665 | wintype: window.WIN_BLACKMAN_hARRIS 666 | ymax: '10' 667 | ymin: '-140' 668 | states: 669 | bus_sink: false 670 | bus_source: false 671 | bus_structure: null 672 | coordinate: [920, 580.0] 673 | rotation: 0 674 | state: enabled 675 | - name: qtgui_time_sink_x_0 676 | id: qtgui_time_sink_x 677 | parameters: 678 | affinity: '' 679 | alias: '' 680 | alpha1: '1.0' 681 | alpha10: '1.0' 682 | alpha2: '1.0' 683 | alpha3: '1.0' 684 | alpha4: '1.0' 685 | alpha5: '1.0' 686 | alpha6: '1.0' 687 | alpha7: '1.0' 688 | alpha8: '1.0' 689 | alpha9: '1.0' 690 | autoscale: 'False' 691 | axislabels: 'True' 692 | color1: blue 693 | color10: dark blue 694 | color2: red 695 | color3: green 696 | color4: black 697 | color5: cyan 698 | color6: magenta 699 | color7: yellow 700 | color8: dark red 701 | color9: dark green 702 | comment: '' 703 | ctrlpanel: 'False' 704 | entags: 'True' 705 | grid: 'False' 706 | gui_hint: '' 707 | label1: Signal 1 708 | label10: Signal 10 709 | label2: Signal 2 710 | label3: Signal 3 711 | label4: Signal 4 712 | label5: Signal 5 713 | label6: Signal 6 714 | label7: Signal 7 715 | label8: Signal 8 716 | label9: Signal 9 717 | legend: 'True' 718 | marker1: '-1' 719 | marker10: '-1' 720 | marker2: '-1' 721 | marker3: '-1' 722 | marker4: '-1' 723 | marker5: '-1' 724 | marker6: '-1' 725 | marker7: '-1' 726 | marker8: '-1' 727 | marker9: '-1' 728 | name: '""' 729 | nconnections: '1' 730 | size: '1024' 731 | srate: sample_rate 732 | stemplot: 'False' 733 | style1: '1' 734 | style10: '1' 735 | style2: '1' 736 | style3: '1' 737 | style4: '1' 738 | style5: '1' 739 | style6: '1' 740 | style7: '1' 741 | style8: '1' 742 | style9: '1' 743 | tr_chan: '0' 744 | tr_delay: '0' 745 | tr_level: '0.0' 746 | tr_mode: qtgui.TRIG_MODE_FREE 747 | tr_slope: qtgui.TRIG_SLOPE_POS 748 | tr_tag: '""' 749 | type: complex 750 | update_time: '0.10' 751 | width1: '1' 752 | width10: '1' 753 | width2: '1' 754 | width3: '1' 755 | width4: '1' 756 | width5: '1' 757 | width6: '1' 758 | width7: '1' 759 | width8: '1' 760 | width9: '1' 761 | ylabel: Amplitude 762 | ymax: '6' 763 | ymin: '-6' 764 | yunit: '""' 765 | states: 766 | bus_sink: false 767 | bus_source: false 768 | bus_structure: null 769 | coordinate: [920, 476.0] 770 | rotation: 0 771 | state: enabled 772 | - name: rational_resampler_xxx_0 773 | id: rational_resampler_xxx 774 | parameters: 775 | affinity: '' 776 | alias: '' 777 | comment: '' 778 | decim: '3' 779 | fbw: '0' 780 | interp: int((tx_rate * 3) / sample_rate) 781 | maxoutbuf: '0' 782 | minoutbuf: '0' 783 | taps: '' 784 | type: ccc 785 | states: 786 | bus_sink: false 787 | bus_source: false 788 | bus_structure: null 789 | coordinate: [680, 292.0] 790 | rotation: 0 791 | state: true 792 | - name: root_raised_cosine_filter_0 793 | id: root_raised_cosine_filter 794 | parameters: 795 | affinity: '' 796 | alias: '' 797 | alpha: '0.5' 798 | comment: '' 799 | decim: '1' 800 | gain: interpolation_rate 801 | interp: interpolation_rate 802 | maxoutbuf: '0' 803 | minoutbuf: '0' 804 | ntaps: interpolation_rate*15+1 805 | samp_rate: interpolation_rate 806 | sym_rate: '1' 807 | type: interp_fir_filter_fff 808 | states: 809 | bus_sink: false 810 | bus_source: false 811 | bus_structure: null 812 | coordinate: [408, 388.0] 813 | rotation: 180 814 | state: true 815 | 816 | connections: 817 | - [analog_frequency_modulator_fc_0, '0', blocks_selector_0, '0'] 818 | - [analog_frequency_modulator_fc_0, '0', channels_selective_fading_model_0, '0'] 819 | - [blocks_file_source_0, '0', blocks_repack_bits_bb_0, '0'] 820 | - [blocks_repack_bits_bb_0, '0', digital_chunks_to_symbols_xx_0, '0'] 821 | - [blocks_selector_0, '0', channels_channel_model_0_0, '0'] 822 | - [channels_channel_model_0_0, '0', qtgui_freq_sink_x_0, '0'] 823 | - [channels_channel_model_0_0, '0', qtgui_time_sink_x_0, '0'] 824 | - [channels_channel_model_0_0, '0', rational_resampler_xxx_0, '0'] 825 | - [channels_selective_fading_model_0, '0', blocks_selector_0, '1'] 826 | - [digital_chunks_to_symbols_xx_0, '0', root_raised_cosine_filter_0, '0'] 827 | - [rational_resampler_xxx_0, '0', osmosdr_sink_1, '0'] 828 | - [root_raised_cosine_filter_0, '0', analog_frequency_modulator_fc_0, '0'] 829 | - [variable_qtgui_toggle_button_msg_0, state, blocks_selector_0, iindex] 830 | 831 | metadata: 832 | file_format: 1 833 | -------------------------------------------------------------------------------- /m17-arn.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: rob 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: M17_arn 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: M17 Amateur Radio Newsline 26 | window_size: (1000,1000) 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: deviation 37 | id: variable 38 | parameters: 39 | comment: 'Unit of deviation in Hz (this * symbol value 40 | 41 | is symbol deviation in Hz)' 42 | value: '800' 43 | states: 44 | bus_sink: false 45 | bus_source: false 46 | bus_structure: null 47 | coordinate: [184, 156.0] 48 | rotation: 0 49 | state: enabled 50 | - name: interpolation_rate 51 | id: variable 52 | parameters: 53 | comment: '' 54 | value: '10' 55 | states: 56 | bus_sink: false 57 | bus_source: false 58 | bus_structure: null 59 | coordinate: [288, 12.0] 60 | rotation: 0 61 | state: enabled 62 | - name: sample_rate 63 | id: variable 64 | parameters: 65 | comment: This must be at least 512k for PlutoSDR 66 | value: symbol_rate * interpolation_rate 67 | states: 68 | bus_sink: false 69 | bus_source: false 70 | bus_structure: null 71 | coordinate: [184, 76.0] 72 | rotation: 0 73 | state: enabled 74 | - name: symbol_rate 75 | id: variable 76 | parameters: 77 | comment: '' 78 | value: '4800.0' 79 | states: 80 | bus_sink: false 81 | bus_source: false 82 | bus_structure: null 83 | coordinate: [184, 12.0] 84 | rotation: 0 85 | state: enabled 86 | - name: tx_rate 87 | id: variable 88 | parameters: 89 | comment: '' 90 | value: '2000000' 91 | states: 92 | bus_sink: false 93 | bus_source: false 94 | bus_structure: null 95 | coordinate: [288, 76.0] 96 | rotation: 0 97 | state: true 98 | - name: variable_awgn 99 | id: variable_qtgui_range 100 | parameters: 101 | comment: AWGN noise voltage. 102 | gui_hint: '' 103 | label: AWGN 104 | min_len: '200' 105 | orient: QtCore.Qt.Horizontal 106 | rangeType: float 107 | start: '0' 108 | step: '.1' 109 | stop: '2.0' 110 | value: '0.0' 111 | widget: counter_slider 112 | states: 113 | bus_sink: false 114 | bus_source: false 115 | bus_structure: null 116 | coordinate: [624, 36.0] 117 | rotation: 0 118 | state: true 119 | - name: variable_clock_offset 120 | id: variable_qtgui_range 121 | parameters: 122 | comment: 'Symbol clock frequency 123 | 124 | offset in PPM.' 125 | gui_hint: '' 126 | label: Clock 127 | min_len: '200' 128 | orient: QtCore.Qt.Horizontal 129 | rangeType: float 130 | start: '-250' 131 | step: '2.5' 132 | stop: '250' 133 | value: '0' 134 | widget: counter_slider 135 | states: 136 | bus_sink: false 137 | bus_source: false 138 | bus_structure: null 139 | coordinate: [944, 36.0] 140 | rotation: 0 141 | state: true 142 | - name: variable_frequency_offset 143 | id: variable_qtgui_range 144 | parameters: 145 | comment: 'Frequency offset expressed 146 | 147 | as a percentage of symbol 148 | 149 | deviation (800Hz).' 150 | gui_hint: '' 151 | label: Frequency 152 | min_len: '200' 153 | orient: QtCore.Qt.Horizontal 154 | rangeType: float 155 | start: '-100' 156 | step: '1' 157 | stop: '100' 158 | value: '0.0' 159 | widget: counter_slider 160 | states: 161 | bus_sink: false 162 | bus_source: false 163 | bus_structure: null 164 | coordinate: [768, 36.0] 165 | rotation: 0 166 | state: true 167 | - name: variable_qtgui_toggle_button_msg_0 168 | id: variable_qtgui_toggle_button_msg 169 | parameters: 170 | comment: '' 171 | gui_hint: '' 172 | initPressed: 'False' 173 | label: Fading 174 | outputmsgname: fading_selector 175 | pressBackgroundColor: default 176 | pressFontColor: default 177 | pressed: '1' 178 | relBackgroundColor: default 179 | relFontColor: default 180 | released: '0' 181 | type: int 182 | value: '0' 183 | states: 184 | bus_sink: false 185 | bus_source: false 186 | bus_structure: null 187 | coordinate: [96, 700.0] 188 | rotation: 0 189 | state: true 190 | - name: analog_frequency_modulator_fc_0 191 | id: analog_frequency_modulator_fc 192 | parameters: 193 | affinity: '' 194 | alias: '' 195 | comment: '' 196 | maxoutbuf: '0' 197 | minoutbuf: '0' 198 | sensitivity: deviation * 2 * 3.141592 / sample_rate 199 | states: 200 | bus_sink: false 201 | bus_source: false 202 | bus_structure: null 203 | coordinate: [96, 428.0] 204 | rotation: 180 205 | state: true 206 | - name: blocks_file_source_0 207 | id: blocks_file_source 208 | parameters: 209 | affinity: '' 210 | alias: '' 211 | begin_tag: pmt.PMT_NIL 212 | comment: '' 213 | file: Report2328.bin 214 | length: '0' 215 | maxoutbuf: '0' 216 | minoutbuf: '0' 217 | offset: '0' 218 | repeat: 'True' 219 | type: byte 220 | vlen: '1' 221 | states: 222 | bus_sink: false 223 | bus_source: false 224 | bus_structure: null 225 | coordinate: [24, 252.0] 226 | rotation: 0 227 | state: true 228 | - name: blocks_repack_bits_bb_0 229 | id: blocks_repack_bits_bb 230 | parameters: 231 | affinity: '' 232 | alias: '' 233 | align_output: 'False' 234 | comment: '' 235 | endianness: gr.GR_MSB_FIRST 236 | k: '8' 237 | l: '2' 238 | len_tag_key: '""' 239 | maxoutbuf: '0' 240 | minoutbuf: '0' 241 | states: 242 | bus_sink: false 243 | bus_source: false 244 | bus_structure: null 245 | coordinate: [208, 276.0] 246 | rotation: 0 247 | state: true 248 | - name: blocks_selector_0 249 | id: blocks_selector 250 | parameters: 251 | affinity: '' 252 | alias: '' 253 | comment: '' 254 | enabled: 'True' 255 | input_index: '0' 256 | maxoutbuf: '0' 257 | minoutbuf: '0' 258 | num_inputs: '2' 259 | num_outputs: '1' 260 | output_index: '0' 261 | showports: 'False' 262 | type: complex 263 | vlen: '1' 264 | states: 265 | bus_sink: false 266 | bus_source: false 267 | bus_structure: null 268 | coordinate: [416, 560.0] 269 | rotation: 0 270 | state: true 271 | - name: channels_channel_model_0_0 272 | id: channels_channel_model 273 | parameters: 274 | affinity: '' 275 | alias: '' 276 | block_tags: 'False' 277 | comment: '' 278 | epsilon: 1.0 + (variable_clock_offset / 1000000.0) 279 | freq_offset: (variable_frequency_offset / symbol_rate) * 0.4 280 | maxoutbuf: '0' 281 | minoutbuf: '0' 282 | noise_voltage: variable_awgn 283 | seed: '0' 284 | taps: 1.0 + 1.0j 285 | states: 286 | bus_sink: false 287 | bus_source: false 288 | bus_structure: null 289 | coordinate: [592, 580.0] 290 | rotation: 0 291 | state: enabled 292 | - name: channels_selective_fading_model_0 293 | id: channels_selective_fading_model 294 | parameters: 295 | K: '4.0' 296 | LOS: 'False' 297 | N: '8' 298 | affinity: '' 299 | alias: '' 300 | comment: '' 301 | delays: (0.0,0.1,1.3) 302 | fDTs: 10.0/sample_rate 303 | mags: (1,0.99,0.97) 304 | maxoutbuf: '0' 305 | minoutbuf: '0' 306 | ntaps: '8' 307 | seed: '0' 308 | states: 309 | bus_sink: false 310 | bus_source: false 311 | bus_structure: null 312 | coordinate: [88, 540.0] 313 | rotation: 0 314 | state: enabled 315 | - name: digital_chunks_to_symbols_xx_0 316 | id: digital_chunks_to_symbols_xx 317 | parameters: 318 | affinity: '' 319 | alias: '' 320 | comment: '' 321 | dimension: '1' 322 | in_type: byte 323 | maxoutbuf: '0' 324 | minoutbuf: '0' 325 | num_ports: '1' 326 | out_type: float 327 | symbol_table: '[+1.0,+3.0,-1.0,-3.0]' 328 | states: 329 | bus_sink: false 330 | bus_source: false 331 | bus_structure: null 332 | coordinate: [432, 288.0] 333 | rotation: 0 334 | state: true 335 | - name: iio_pluto_sink_0 336 | id: iio_pluto_sink 337 | parameters: 338 | affinity: '' 339 | alias: '' 340 | attenuation1: '10.0' 341 | bandwidth: '200000' 342 | buffer_size: '32768' 343 | comment: '' 344 | cyclic: 'False' 345 | filter: '' 346 | filter_source: '''Auto''' 347 | fpass: '0' 348 | frequency: '144910000' 349 | fstop: '0' 350 | len_tag_key: '' 351 | samplerate: tx_rate 352 | type: fc32 353 | uri: ip:192.168.2.1 354 | states: 355 | bus_sink: false 356 | bus_source: false 357 | bus_structure: null 358 | coordinate: [1032, 292.0] 359 | rotation: 0 360 | state: enabled 361 | - name: qtgui_freq_sink_x_0 362 | id: qtgui_freq_sink_x 363 | parameters: 364 | affinity: '' 365 | alias: '' 366 | alpha1: '1.0' 367 | alpha10: '1.0' 368 | alpha2: '1.0' 369 | alpha3: '1.0' 370 | alpha4: '1.0' 371 | alpha5: '1.0' 372 | alpha6: '1.0' 373 | alpha7: '1.0' 374 | alpha8: '1.0' 375 | alpha9: '1.0' 376 | autoscale: 'False' 377 | average: '1.0' 378 | axislabels: 'True' 379 | bw: sample_rate 380 | color1: '"blue"' 381 | color10: '"dark blue"' 382 | color2: '"red"' 383 | color3: '"green"' 384 | color4: '"black"' 385 | color5: '"cyan"' 386 | color6: '"magenta"' 387 | color7: '"yellow"' 388 | color8: '"dark red"' 389 | color9: '"dark green"' 390 | comment: '' 391 | ctrlpanel: 'False' 392 | fc: '0' 393 | fftsize: '1024' 394 | freqhalf: 'True' 395 | grid: 'False' 396 | gui_hint: '' 397 | label: Relative Gain 398 | label1: '' 399 | label10: '''''' 400 | label2: '''''' 401 | label3: '''''' 402 | label4: '''''' 403 | label5: '''''' 404 | label6: '''''' 405 | label7: '''''' 406 | label8: '''''' 407 | label9: '''''' 408 | legend: 'True' 409 | maxoutbuf: '0' 410 | minoutbuf: '0' 411 | name: '""' 412 | nconnections: '1' 413 | norm_window: 'False' 414 | showports: 'False' 415 | tr_chan: '0' 416 | tr_level: '0.0' 417 | tr_mode: qtgui.TRIG_MODE_FREE 418 | tr_tag: '""' 419 | type: complex 420 | units: dB 421 | update_time: '0.10' 422 | width1: '1' 423 | width10: '1' 424 | width2: '1' 425 | width3: '1' 426 | width4: '1' 427 | width5: '1' 428 | width6: '1' 429 | width7: '1' 430 | width8: '1' 431 | width9: '1' 432 | wintype: window.WIN_BLACKMAN_hARRIS 433 | ymax: '10' 434 | ymin: '-140' 435 | states: 436 | bus_sink: false 437 | bus_source: false 438 | bus_structure: null 439 | coordinate: [808, 604.0] 440 | rotation: 0 441 | state: enabled 442 | - name: qtgui_time_sink_x_0 443 | id: qtgui_time_sink_x 444 | parameters: 445 | affinity: '' 446 | alias: '' 447 | alpha1: '1.0' 448 | alpha10: '1.0' 449 | alpha2: '1.0' 450 | alpha3: '1.0' 451 | alpha4: '1.0' 452 | alpha5: '1.0' 453 | alpha6: '1.0' 454 | alpha7: '1.0' 455 | alpha8: '1.0' 456 | alpha9: '1.0' 457 | autoscale: 'False' 458 | axislabels: 'True' 459 | color1: blue 460 | color10: dark blue 461 | color2: red 462 | color3: green 463 | color4: black 464 | color5: cyan 465 | color6: magenta 466 | color7: yellow 467 | color8: dark red 468 | color9: dark green 469 | comment: '' 470 | ctrlpanel: 'False' 471 | entags: 'True' 472 | grid: 'False' 473 | gui_hint: '' 474 | label1: Signal 1 475 | label10: Signal 10 476 | label2: Signal 2 477 | label3: Signal 3 478 | label4: Signal 4 479 | label5: Signal 5 480 | label6: Signal 6 481 | label7: Signal 7 482 | label8: Signal 8 483 | label9: Signal 9 484 | legend: 'True' 485 | marker1: '-1' 486 | marker10: '-1' 487 | marker2: '-1' 488 | marker3: '-1' 489 | marker4: '-1' 490 | marker5: '-1' 491 | marker6: '-1' 492 | marker7: '-1' 493 | marker8: '-1' 494 | marker9: '-1' 495 | name: '""' 496 | nconnections: '1' 497 | size: '1024' 498 | srate: sample_rate 499 | stemplot: 'False' 500 | style1: '1' 501 | style10: '1' 502 | style2: '1' 503 | style3: '1' 504 | style4: '1' 505 | style5: '1' 506 | style6: '1' 507 | style7: '1' 508 | style8: '1' 509 | style9: '1' 510 | tr_chan: '0' 511 | tr_delay: '0' 512 | tr_level: '0.0' 513 | tr_mode: qtgui.TRIG_MODE_FREE 514 | tr_slope: qtgui.TRIG_SLOPE_POS 515 | tr_tag: '""' 516 | type: complex 517 | update_time: '0.10' 518 | width1: '1' 519 | width10: '1' 520 | width2: '1' 521 | width3: '1' 522 | width4: '1' 523 | width5: '1' 524 | width6: '1' 525 | width7: '1' 526 | width8: '1' 527 | width9: '1' 528 | ylabel: Amplitude 529 | ymax: '6' 530 | ymin: '-6' 531 | yunit: '""' 532 | states: 533 | bus_sink: false 534 | bus_source: false 535 | bus_structure: null 536 | coordinate: [808, 468.0] 537 | rotation: 0 538 | state: enabled 539 | - name: rational_resampler_xxx_0 540 | id: rational_resampler_xxx 541 | parameters: 542 | affinity: '' 543 | alias: '' 544 | comment: '' 545 | decim: '3' 546 | fbw: '0.4' 547 | interp: 'int((tx_rate * 3)/sample_rate) ' 548 | maxoutbuf: '0' 549 | minoutbuf: '0' 550 | taps: '[]' 551 | type: ccc 552 | states: 553 | bus_sink: false 554 | bus_source: false 555 | bus_structure: null 556 | coordinate: [808, 324.0] 557 | rotation: 0 558 | state: true 559 | - name: root_raised_cosine_filter_0 560 | id: root_raised_cosine_filter 561 | parameters: 562 | affinity: '' 563 | alias: '' 564 | alpha: '0.5' 565 | comment: '' 566 | decim: '1' 567 | gain: interpolation_rate 568 | interp: interpolation_rate 569 | maxoutbuf: '0' 570 | minoutbuf: '0' 571 | ntaps: interpolation_rate*15+1 572 | samp_rate: interpolation_rate 573 | sym_rate: '1' 574 | type: interp_fir_filter_fff 575 | states: 576 | bus_sink: false 577 | bus_source: false 578 | bus_structure: null 579 | coordinate: [408, 388.0] 580 | rotation: 180 581 | state: true 582 | 583 | connections: 584 | - [analog_frequency_modulator_fc_0, '0', blocks_selector_0, '0'] 585 | - [analog_frequency_modulator_fc_0, '0', channels_selective_fading_model_0, '0'] 586 | - [blocks_file_source_0, '0', blocks_repack_bits_bb_0, '0'] 587 | - [blocks_repack_bits_bb_0, '0', digital_chunks_to_symbols_xx_0, '0'] 588 | - [blocks_selector_0, '0', channels_channel_model_0_0, '0'] 589 | - [channels_channel_model_0_0, '0', qtgui_freq_sink_x_0, '0'] 590 | - [channels_channel_model_0_0, '0', qtgui_time_sink_x_0, '0'] 591 | - [channels_channel_model_0_0, '0', rational_resampler_xxx_0, '0'] 592 | - [channels_selective_fading_model_0, '0', blocks_selector_0, '1'] 593 | - [digital_chunks_to_symbols_xx_0, '0', root_raised_cosine_filter_0, '0'] 594 | - [rational_resampler_xxx_0, '0', iio_pluto_sink_0, '0'] 595 | - [root_raised_cosine_filter_0, '0', analog_frequency_modulator_fc_0, '0'] 596 | - [variable_qtgui_toggle_button_msg_0, state, blocks_selector_0, iindex] 597 | 598 | metadata: 599 | file_format: 1 600 | -------------------------------------------------------------------------------- /m17-bert-hackrf.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: rob 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: M17_bert 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: M17_bert 26 | window_size: (1000,1000) 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: deviation 37 | id: variable 38 | parameters: 39 | comment: Unit of deviation in Hz (this * symbol value is symbol deviation in Hz) 40 | value: '800' 41 | states: 42 | bus_sink: false 43 | bus_source: false 44 | bus_structure: null 45 | coordinate: [184, 156.0] 46 | rotation: 0 47 | state: enabled 48 | - name: interpolation_rate 49 | id: variable 50 | parameters: 51 | comment: '' 52 | value: '10' 53 | states: 54 | bus_sink: false 55 | bus_source: false 56 | bus_structure: null 57 | coordinate: [288, 12.0] 58 | rotation: 0 59 | state: enabled 60 | - name: sample_rate 61 | id: variable 62 | parameters: 63 | comment: '' 64 | value: symbol_rate * interpolation_rate 65 | states: 66 | bus_sink: false 67 | bus_source: false 68 | bus_structure: null 69 | coordinate: [184, 76.0] 70 | rotation: 0 71 | state: enabled 72 | - name: symbol_rate 73 | id: variable 74 | parameters: 75 | comment: '' 76 | value: '4800' 77 | states: 78 | bus_sink: false 79 | bus_source: false 80 | bus_structure: null 81 | coordinate: [184, 12.0] 82 | rotation: 0 83 | state: enabled 84 | - name: tx_freq 85 | id: variable 86 | parameters: 87 | comment: '' 88 | value: '144910000' 89 | states: 90 | bus_sink: false 91 | bus_source: false 92 | bus_structure: null 93 | coordinate: [368, 76.0] 94 | rotation: 0 95 | state: true 96 | - name: tx_rate 97 | id: variable 98 | parameters: 99 | comment: This must be at least 512k for PlutoSDR 100 | value: '2000000' 101 | states: 102 | bus_sink: false 103 | bus_source: false 104 | bus_structure: null 105 | coordinate: [288, 76.0] 106 | rotation: 0 107 | state: true 108 | - name: variable_awgn 109 | id: variable_qtgui_range 110 | parameters: 111 | comment: AWGN noise voltage. 112 | gui_hint: '' 113 | label: AWGN 114 | min_len: '200' 115 | orient: QtCore.Qt.Horizontal 116 | rangeType: float 117 | start: '0' 118 | step: '.1' 119 | stop: '2.0' 120 | value: '0.0' 121 | widget: counter_slider 122 | states: 123 | bus_sink: false 124 | bus_source: false 125 | bus_structure: null 126 | coordinate: [584, 20.0] 127 | rotation: 0 128 | state: true 129 | - name: variable_clock_offset 130 | id: variable_qtgui_range 131 | parameters: 132 | comment: 'Symbol clock frequency 133 | 134 | offset in PPM.' 135 | gui_hint: '' 136 | label: Clock 137 | min_len: '200' 138 | orient: QtCore.Qt.Horizontal 139 | rangeType: float 140 | start: '-250' 141 | step: '2.5' 142 | stop: '250' 143 | value: '0' 144 | widget: counter_slider 145 | states: 146 | bus_sink: false 147 | bus_source: false 148 | bus_structure: null 149 | coordinate: [904, 20.0] 150 | rotation: 0 151 | state: true 152 | - name: variable_frequency_offset 153 | id: variable_qtgui_range 154 | parameters: 155 | comment: 'Frequency offset expressed 156 | 157 | as a percentage of symbol 158 | 159 | deviation (800Hz).' 160 | gui_hint: '' 161 | label: Frequency 162 | min_len: '200' 163 | orient: QtCore.Qt.Horizontal 164 | rangeType: float 165 | start: '-100' 166 | step: '1' 167 | stop: '100' 168 | value: '0.0' 169 | widget: counter_slider 170 | states: 171 | bus_sink: false 172 | bus_source: false 173 | bus_structure: null 174 | coordinate: [728, 20.0] 175 | rotation: 0 176 | state: true 177 | - name: variable_qtgui_toggle_button_msg_0 178 | id: variable_qtgui_toggle_button_msg 179 | parameters: 180 | comment: '' 181 | gui_hint: '' 182 | initPressed: 'False' 183 | label: Fading 184 | outputmsgname: fading_selector 185 | pressBackgroundColor: default 186 | pressFontColor: default 187 | pressed: '1' 188 | relBackgroundColor: default 189 | relFontColor: default 190 | released: '0' 191 | type: int 192 | value: '0' 193 | states: 194 | bus_sink: false 195 | bus_source: false 196 | bus_structure: null 197 | coordinate: [80, 740.0] 198 | rotation: 0 199 | state: true 200 | - name: analog_frequency_modulator_fc_0 201 | id: analog_frequency_modulator_fc 202 | parameters: 203 | affinity: '' 204 | alias: '' 205 | comment: '' 206 | maxoutbuf: '0' 207 | minoutbuf: '0' 208 | sensitivity: deviation * 2 * 3.141592 / sample_rate 209 | states: 210 | bus_sink: false 211 | bus_source: false 212 | bus_structure: null 213 | coordinate: [96, 428.0] 214 | rotation: 180 215 | state: true 216 | - name: blocks_file_source_0 217 | id: blocks_file_source 218 | parameters: 219 | affinity: '' 220 | alias: '' 221 | begin_tag: pmt.PMT_NIL 222 | comment: '' 223 | file: bert.bin 224 | length: '0' 225 | maxoutbuf: '0' 226 | minoutbuf: '0' 227 | offset: '0' 228 | repeat: 'True' 229 | type: byte 230 | vlen: '1' 231 | states: 232 | bus_sink: false 233 | bus_source: false 234 | bus_structure: null 235 | coordinate: [24, 252.0] 236 | rotation: 0 237 | state: true 238 | - name: blocks_repack_bits_bb_0 239 | id: blocks_repack_bits_bb 240 | parameters: 241 | affinity: '' 242 | alias: '' 243 | align_output: 'False' 244 | comment: '' 245 | endianness: gr.GR_MSB_FIRST 246 | k: '8' 247 | l: '2' 248 | len_tag_key: '""' 249 | maxoutbuf: '0' 250 | minoutbuf: '0' 251 | states: 252 | bus_sink: false 253 | bus_source: false 254 | bus_structure: null 255 | coordinate: [208, 276.0] 256 | rotation: 0 257 | state: true 258 | - name: blocks_selector_0 259 | id: blocks_selector 260 | parameters: 261 | affinity: '' 262 | alias: '' 263 | comment: '' 264 | enabled: 'True' 265 | input_index: '0' 266 | maxoutbuf: '0' 267 | minoutbuf: '0' 268 | num_inputs: '2' 269 | num_outputs: '1' 270 | output_index: '0' 271 | showports: 'False' 272 | type: complex 273 | vlen: '1' 274 | states: 275 | bus_sink: false 276 | bus_source: false 277 | bus_structure: null 278 | coordinate: [416, 560.0] 279 | rotation: 0 280 | state: true 281 | - name: channels_channel_model_0 282 | id: channels_channel_model 283 | parameters: 284 | affinity: '' 285 | alias: '' 286 | block_tags: 'False' 287 | comment: '' 288 | epsilon: 1.0 + (variable_clock_offset / 1000000.0) 289 | freq_offset: (variable_frequency_offset / symbol_rate) * 0.4 290 | maxoutbuf: '0' 291 | minoutbuf: '0' 292 | noise_voltage: variable_awgn 293 | seed: '0' 294 | taps: 1.0 + 1.0j 295 | states: 296 | bus_sink: false 297 | bus_source: false 298 | bus_structure: null 299 | coordinate: [600, 580.0] 300 | rotation: 0 301 | state: enabled 302 | - name: channels_selective_fading_model_0 303 | id: channels_selective_fading_model 304 | parameters: 305 | K: '4.0' 306 | LOS: 'False' 307 | N: '8' 308 | affinity: '' 309 | alias: '' 310 | comment: '' 311 | delays: (0.0,0.1,1.3) 312 | fDTs: 10.0/sample_rate 313 | mags: (1,0.99,0.97) 314 | maxoutbuf: '0' 315 | minoutbuf: '0' 316 | ntaps: '12' 317 | seed: '0' 318 | states: 319 | bus_sink: false 320 | bus_source: false 321 | bus_structure: null 322 | coordinate: [80, 532.0] 323 | rotation: 0 324 | state: enabled 325 | - name: digital_chunks_to_symbols_xx_0 326 | id: digital_chunks_to_symbols_xx 327 | parameters: 328 | affinity: '' 329 | alias: '' 330 | comment: '' 331 | dimension: '1' 332 | in_type: byte 333 | maxoutbuf: '0' 334 | minoutbuf: '0' 335 | num_ports: '1' 336 | out_type: float 337 | symbol_table: '[+1.0,+3.0,-1.0,-3.0]' 338 | states: 339 | bus_sink: false 340 | bus_source: false 341 | bus_structure: null 342 | coordinate: [432, 288.0] 343 | rotation: 0 344 | state: true 345 | - name: osmosdr_sink_1 346 | id: osmosdr_sink 347 | parameters: 348 | affinity: '' 349 | alias: '' 350 | ant0: '' 351 | ant1: '' 352 | ant10: '' 353 | ant11: '' 354 | ant12: '' 355 | ant13: '' 356 | ant14: '' 357 | ant15: '' 358 | ant16: '' 359 | ant17: '' 360 | ant18: '' 361 | ant19: '' 362 | ant2: '' 363 | ant20: '' 364 | ant21: '' 365 | ant22: '' 366 | ant23: '' 367 | ant24: '' 368 | ant25: '' 369 | ant26: '' 370 | ant27: '' 371 | ant28: '' 372 | ant29: '' 373 | ant3: '' 374 | ant30: '' 375 | ant31: '' 376 | ant4: '' 377 | ant5: '' 378 | ant6: '' 379 | ant7: '' 380 | ant8: '' 381 | ant9: '' 382 | args: '"hackrf"' 383 | bb_gain0: '20' 384 | bb_gain1: '20' 385 | bb_gain10: '20' 386 | bb_gain11: '20' 387 | bb_gain12: '20' 388 | bb_gain13: '20' 389 | bb_gain14: '20' 390 | bb_gain15: '20' 391 | bb_gain16: '20' 392 | bb_gain17: '20' 393 | bb_gain18: '20' 394 | bb_gain19: '20' 395 | bb_gain2: '20' 396 | bb_gain20: '20' 397 | bb_gain21: '20' 398 | bb_gain22: '20' 399 | bb_gain23: '20' 400 | bb_gain24: '20' 401 | bb_gain25: '20' 402 | bb_gain26: '20' 403 | bb_gain27: '20' 404 | bb_gain28: '20' 405 | bb_gain29: '20' 406 | bb_gain3: '20' 407 | bb_gain30: '20' 408 | bb_gain31: '20' 409 | bb_gain4: '20' 410 | bb_gain5: '20' 411 | bb_gain6: '20' 412 | bb_gain7: '20' 413 | bb_gain8: '20' 414 | bb_gain9: '20' 415 | bw0: '25000' 416 | bw1: '0' 417 | bw10: '0' 418 | bw11: '0' 419 | bw12: '0' 420 | bw13: '0' 421 | bw14: '0' 422 | bw15: '0' 423 | bw16: '0' 424 | bw17: '0' 425 | bw18: '0' 426 | bw19: '0' 427 | bw2: '0' 428 | bw20: '0' 429 | bw21: '0' 430 | bw22: '0' 431 | bw23: '0' 432 | bw24: '0' 433 | bw25: '0' 434 | bw26: '0' 435 | bw27: '0' 436 | bw28: '0' 437 | bw29: '0' 438 | bw3: '0' 439 | bw30: '0' 440 | bw31: '0' 441 | bw4: '0' 442 | bw5: '0' 443 | bw6: '0' 444 | bw7: '0' 445 | bw8: '0' 446 | bw9: '0' 447 | clock_source0: external 448 | clock_source1: '' 449 | clock_source2: '' 450 | clock_source3: '' 451 | clock_source4: '' 452 | clock_source5: '' 453 | clock_source6: '' 454 | clock_source7: '' 455 | comment: '' 456 | corr0: '0' 457 | corr1: '0' 458 | corr10: '0' 459 | corr11: '0' 460 | corr12: '0' 461 | corr13: '0' 462 | corr14: '0' 463 | corr15: '0' 464 | corr16: '0' 465 | corr17: '0' 466 | corr18: '0' 467 | corr19: '0' 468 | corr2: '0' 469 | corr20: '0' 470 | corr21: '0' 471 | corr22: '0' 472 | corr23: '0' 473 | corr24: '0' 474 | corr25: '0' 475 | corr26: '0' 476 | corr27: '0' 477 | corr28: '0' 478 | corr29: '0' 479 | corr3: '0' 480 | corr30: '0' 481 | corr31: '0' 482 | corr4: '0' 483 | corr5: '0' 484 | corr6: '0' 485 | corr7: '0' 486 | corr8: '0' 487 | corr9: '0' 488 | freq0: tx_freq 489 | freq1: 100e6 490 | freq10: 100e6 491 | freq11: 100e6 492 | freq12: 100e6 493 | freq13: 100e6 494 | freq14: 100e6 495 | freq15: 100e6 496 | freq16: 100e6 497 | freq17: 100e6 498 | freq18: 100e6 499 | freq19: 100e6 500 | freq2: 100e6 501 | freq20: 100e6 502 | freq21: 100e6 503 | freq22: 100e6 504 | freq23: 100e6 505 | freq24: 100e6 506 | freq25: 100e6 507 | freq26: 100e6 508 | freq27: 100e6 509 | freq28: 100e6 510 | freq29: 100e6 511 | freq3: 100e6 512 | freq30: 100e6 513 | freq31: 100e6 514 | freq4: 100e6 515 | freq5: 100e6 516 | freq6: 100e6 517 | freq7: 100e6 518 | freq8: 100e6 519 | freq9: 100e6 520 | gain0: '14' 521 | gain1: '10' 522 | gain10: '10' 523 | gain11: '10' 524 | gain12: '10' 525 | gain13: '10' 526 | gain14: '10' 527 | gain15: '10' 528 | gain16: '10' 529 | gain17: '10' 530 | gain18: '10' 531 | gain19: '10' 532 | gain2: '10' 533 | gain20: '10' 534 | gain21: '10' 535 | gain22: '10' 536 | gain23: '10' 537 | gain24: '10' 538 | gain25: '10' 539 | gain26: '10' 540 | gain27: '10' 541 | gain28: '10' 542 | gain29: '10' 543 | gain3: '10' 544 | gain30: '10' 545 | gain31: '10' 546 | gain4: '10' 547 | gain5: '10' 548 | gain6: '10' 549 | gain7: '10' 550 | gain8: '10' 551 | gain9: '10' 552 | if_gain0: '25' 553 | if_gain1: '20' 554 | if_gain10: '20' 555 | if_gain11: '20' 556 | if_gain12: '20' 557 | if_gain13: '20' 558 | if_gain14: '20' 559 | if_gain15: '20' 560 | if_gain16: '20' 561 | if_gain17: '20' 562 | if_gain18: '20' 563 | if_gain19: '20' 564 | if_gain2: '20' 565 | if_gain20: '20' 566 | if_gain21: '20' 567 | if_gain22: '20' 568 | if_gain23: '20' 569 | if_gain24: '20' 570 | if_gain25: '20' 571 | if_gain26: '20' 572 | if_gain27: '20' 573 | if_gain28: '20' 574 | if_gain29: '20' 575 | if_gain3: '20' 576 | if_gain30: '20' 577 | if_gain31: '20' 578 | if_gain4: '20' 579 | if_gain5: '20' 580 | if_gain6: '20' 581 | if_gain7: '20' 582 | if_gain8: '20' 583 | if_gain9: '20' 584 | maxoutbuf: '0' 585 | minoutbuf: '0' 586 | nchan: '1' 587 | num_mboards: '1' 588 | sample_rate: tx_rate 589 | sync: none 590 | time_source0: external 591 | time_source1: '' 592 | time_source2: '' 593 | time_source3: '' 594 | time_source4: '' 595 | time_source5: '' 596 | time_source6: '' 597 | time_source7: '' 598 | type: fc32 599 | states: 600 | bus_sink: false 601 | bus_source: false 602 | bus_structure: null 603 | coordinate: [904, 212.0] 604 | rotation: 0 605 | state: enabled 606 | - name: qtgui_freq_sink_x_0 607 | id: qtgui_freq_sink_x 608 | parameters: 609 | affinity: '' 610 | alias: '' 611 | alpha1: '1.0' 612 | alpha10: '1.0' 613 | alpha2: '1.0' 614 | alpha3: '1.0' 615 | alpha4: '1.0' 616 | alpha5: '1.0' 617 | alpha6: '1.0' 618 | alpha7: '1.0' 619 | alpha8: '1.0' 620 | alpha9: '1.0' 621 | autoscale: 'False' 622 | average: '1.0' 623 | axislabels: 'True' 624 | bw: sample_rate 625 | color1: '"blue"' 626 | color10: '"dark blue"' 627 | color2: '"red"' 628 | color3: '"green"' 629 | color4: '"black"' 630 | color5: '"cyan"' 631 | color6: '"magenta"' 632 | color7: '"yellow"' 633 | color8: '"dark red"' 634 | color9: '"dark green"' 635 | comment: '' 636 | ctrlpanel: 'False' 637 | fc: '0' 638 | fftsize: '1024' 639 | freqhalf: 'True' 640 | grid: 'False' 641 | gui_hint: '' 642 | label: Relative Gain 643 | label1: '' 644 | label10: '''''' 645 | label2: '''''' 646 | label3: '''''' 647 | label4: '''''' 648 | label5: '''''' 649 | label6: '''''' 650 | label7: '''''' 651 | label8: '''''' 652 | label9: '''''' 653 | legend: 'True' 654 | maxoutbuf: '0' 655 | minoutbuf: '0' 656 | name: '""' 657 | nconnections: '1' 658 | norm_window: 'False' 659 | showports: 'False' 660 | tr_chan: '0' 661 | tr_level: '0.0' 662 | tr_mode: qtgui.TRIG_MODE_FREE 663 | tr_tag: '""' 664 | type: complex 665 | units: dB 666 | update_time: '0.10' 667 | width1: '1' 668 | width10: '1' 669 | width2: '1' 670 | width3: '1' 671 | width4: '1' 672 | width5: '1' 673 | width6: '1' 674 | width7: '1' 675 | width8: '1' 676 | width9: '1' 677 | wintype: window.WIN_BLACKMAN_hARRIS 678 | ymax: '10' 679 | ymin: '-140' 680 | states: 681 | bus_sink: false 682 | bus_source: false 683 | bus_structure: null 684 | coordinate: [904, 540.0] 685 | rotation: 0 686 | state: enabled 687 | - name: qtgui_time_sink_x_0 688 | id: qtgui_time_sink_x 689 | parameters: 690 | affinity: '' 691 | alias: '' 692 | alpha1: '1.0' 693 | alpha10: '1.0' 694 | alpha2: '1.0' 695 | alpha3: '1.0' 696 | alpha4: '1.0' 697 | alpha5: '1.0' 698 | alpha6: '1.0' 699 | alpha7: '1.0' 700 | alpha8: '1.0' 701 | alpha9: '1.0' 702 | autoscale: 'False' 703 | axislabels: 'True' 704 | color1: blue 705 | color10: dark blue 706 | color2: red 707 | color3: green 708 | color4: black 709 | color5: cyan 710 | color6: magenta 711 | color7: yellow 712 | color8: dark red 713 | color9: dark green 714 | comment: '' 715 | ctrlpanel: 'False' 716 | entags: 'True' 717 | grid: 'False' 718 | gui_hint: '' 719 | label1: Signal 1 720 | label10: Signal 10 721 | label2: Signal 2 722 | label3: Signal 3 723 | label4: Signal 4 724 | label5: Signal 5 725 | label6: Signal 6 726 | label7: Signal 7 727 | label8: Signal 8 728 | label9: Signal 9 729 | legend: 'True' 730 | marker1: '-1' 731 | marker10: '-1' 732 | marker2: '-1' 733 | marker3: '-1' 734 | marker4: '-1' 735 | marker5: '-1' 736 | marker6: '-1' 737 | marker7: '-1' 738 | marker8: '-1' 739 | marker9: '-1' 740 | name: '""' 741 | nconnections: '1' 742 | size: '1024' 743 | srate: sample_rate 744 | stemplot: 'False' 745 | style1: '1' 746 | style10: '1' 747 | style2: '1' 748 | style3: '1' 749 | style4: '1' 750 | style5: '1' 751 | style6: '1' 752 | style7: '1' 753 | style8: '1' 754 | style9: '1' 755 | tr_chan: '0' 756 | tr_delay: '0' 757 | tr_level: '0.0' 758 | tr_mode: qtgui.TRIG_MODE_FREE 759 | tr_slope: qtgui.TRIG_SLOPE_POS 760 | tr_tag: '""' 761 | type: complex 762 | update_time: '0.10' 763 | width1: '1' 764 | width10: '1' 765 | width2: '1' 766 | width3: '1' 767 | width4: '1' 768 | width5: '1' 769 | width6: '1' 770 | width7: '1' 771 | width8: '1' 772 | width9: '1' 773 | ylabel: Amplitude 774 | ymax: '6' 775 | ymin: '-6' 776 | yunit: '""' 777 | states: 778 | bus_sink: false 779 | bus_source: false 780 | bus_structure: null 781 | coordinate: [904, 444.0] 782 | rotation: 0 783 | state: enabled 784 | - name: rational_resampler_xxx_0 785 | id: rational_resampler_xxx 786 | parameters: 787 | affinity: '' 788 | alias: '' 789 | comment: '' 790 | decim: '3' 791 | fbw: '0.4' 792 | interp: 'int((tx_rate * 3)/sample_rate) ' 793 | maxoutbuf: '0' 794 | minoutbuf: '0' 795 | taps: '[]' 796 | type: ccc 797 | states: 798 | bus_sink: false 799 | bus_source: false 800 | bus_structure: null 801 | coordinate: [680, 292.0] 802 | rotation: 0 803 | state: true 804 | - name: root_raised_cosine_filter_0 805 | id: root_raised_cosine_filter 806 | parameters: 807 | affinity: '' 808 | alias: '' 809 | alpha: '0.5' 810 | comment: '' 811 | decim: '1' 812 | gain: interpolation_rate 813 | interp: interpolation_rate 814 | maxoutbuf: '0' 815 | minoutbuf: '0' 816 | ntaps: interpolation_rate*11+1 817 | samp_rate: interpolation_rate 818 | sym_rate: '1' 819 | type: interp_fir_filter_fff 820 | states: 821 | bus_sink: false 822 | bus_source: false 823 | bus_structure: null 824 | coordinate: [408, 388.0] 825 | rotation: 180 826 | state: true 827 | 828 | connections: 829 | - [analog_frequency_modulator_fc_0, '0', blocks_selector_0, '0'] 830 | - [analog_frequency_modulator_fc_0, '0', channels_selective_fading_model_0, '0'] 831 | - [blocks_file_source_0, '0', blocks_repack_bits_bb_0, '0'] 832 | - [blocks_repack_bits_bb_0, '0', digital_chunks_to_symbols_xx_0, '0'] 833 | - [blocks_selector_0, '0', channels_channel_model_0, '0'] 834 | - [channels_channel_model_0, '0', qtgui_freq_sink_x_0, '0'] 835 | - [channels_channel_model_0, '0', qtgui_time_sink_x_0, '0'] 836 | - [channels_channel_model_0, '0', rational_resampler_xxx_0, '0'] 837 | - [channels_selective_fading_model_0, '0', blocks_selector_0, '1'] 838 | - [digital_chunks_to_symbols_xx_0, '0', root_raised_cosine_filter_0, '0'] 839 | - [rational_resampler_xxx_0, '0', osmosdr_sink_1, '0'] 840 | - [root_raised_cosine_filter_0, '0', analog_frequency_modulator_fc_0, '0'] 841 | - [variable_qtgui_toggle_button_msg_0, state, blocks_selector_0, iindex] 842 | 843 | metadata: 844 | file_format: 1 845 | -------------------------------------------------------------------------------- /m17-bert.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: rob 4 | catch_exceptions: 'True' 5 | category: '[GRC Hier Blocks]' 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: M17_bert 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: M17_bert 26 | window_size: (1000,1000) 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 8] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: deviation 37 | id: variable 38 | parameters: 39 | comment: 'Unit of deviation in Hz (this * symbol value 40 | 41 | is symbol deviation in Hz)' 42 | value: '800' 43 | states: 44 | bus_sink: false 45 | bus_source: false 46 | bus_structure: null 47 | coordinate: [184, 156.0] 48 | rotation: 0 49 | state: enabled 50 | - name: interpolation_rate 51 | id: variable 52 | parameters: 53 | comment: '' 54 | value: '10' 55 | states: 56 | bus_sink: false 57 | bus_source: false 58 | bus_structure: null 59 | coordinate: [288, 12.0] 60 | rotation: 0 61 | state: enabled 62 | - name: sample_rate 63 | id: variable 64 | parameters: 65 | comment: '' 66 | value: symbol_rate * interpolation_rate 67 | states: 68 | bus_sink: false 69 | bus_source: false 70 | bus_structure: null 71 | coordinate: [184, 76.0] 72 | rotation: 0 73 | state: enabled 74 | - name: symbol_rate 75 | id: variable 76 | parameters: 77 | comment: '' 78 | value: '4800' 79 | states: 80 | bus_sink: false 81 | bus_source: false 82 | bus_structure: null 83 | coordinate: [184, 12.0] 84 | rotation: 0 85 | state: enabled 86 | - name: tx_rate 87 | id: variable 88 | parameters: 89 | comment: This must be at least 512k for PlutoSDR 90 | value: '2000000' 91 | states: 92 | bus_sink: false 93 | bus_source: false 94 | bus_structure: null 95 | coordinate: [288, 76.0] 96 | rotation: 0 97 | state: true 98 | - name: variable_awgn 99 | id: variable_qtgui_range 100 | parameters: 101 | comment: AWGN noise voltage. 102 | gui_hint: '' 103 | label: AWGN 104 | min_len: '200' 105 | orient: QtCore.Qt.Horizontal 106 | rangeType: float 107 | start: '0' 108 | step: '.1' 109 | stop: '2.0' 110 | value: '0.0' 111 | widget: counter_slider 112 | states: 113 | bus_sink: false 114 | bus_source: false 115 | bus_structure: null 116 | coordinate: [624, 28.0] 117 | rotation: 0 118 | state: true 119 | - name: variable_clock_offset 120 | id: variable_qtgui_range 121 | parameters: 122 | comment: 'Symbol clock frequency 123 | 124 | offset in PPM.' 125 | gui_hint: '' 126 | label: Clock 127 | min_len: '200' 128 | orient: QtCore.Qt.Horizontal 129 | rangeType: float 130 | start: '-250' 131 | step: '2.5' 132 | stop: '250' 133 | value: '0' 134 | widget: counter_slider 135 | states: 136 | bus_sink: false 137 | bus_source: false 138 | bus_structure: null 139 | coordinate: [944, 28.0] 140 | rotation: 0 141 | state: true 142 | - name: variable_frequency_offset 143 | id: variable_qtgui_range 144 | parameters: 145 | comment: 'Frequency offset expressed 146 | 147 | as a percentage of symbol 148 | 149 | deviation (800Hz).' 150 | gui_hint: '' 151 | label: Frequency 152 | min_len: '200' 153 | orient: QtCore.Qt.Horizontal 154 | rangeType: float 155 | start: '-100' 156 | step: '1' 157 | stop: '100' 158 | value: '0.0' 159 | widget: counter_slider 160 | states: 161 | bus_sink: false 162 | bus_source: false 163 | bus_structure: null 164 | coordinate: [768, 28.0] 165 | rotation: 0 166 | state: true 167 | - name: variable_qtgui_toggle_button_msg_0 168 | id: variable_qtgui_toggle_button_msg 169 | parameters: 170 | comment: '' 171 | gui_hint: '' 172 | initPressed: 'False' 173 | label: Fading 174 | outputmsgname: fading_selector 175 | pressBackgroundColor: default 176 | pressFontColor: default 177 | pressed: '1' 178 | relBackgroundColor: default 179 | relFontColor: default 180 | released: '0' 181 | type: int 182 | value: '0' 183 | states: 184 | bus_sink: false 185 | bus_source: false 186 | bus_structure: null 187 | coordinate: [96, 708.0] 188 | rotation: 0 189 | state: true 190 | - name: analog_frequency_modulator_fc_0 191 | id: analog_frequency_modulator_fc 192 | parameters: 193 | affinity: '' 194 | alias: '' 195 | comment: '' 196 | maxoutbuf: '0' 197 | minoutbuf: '0' 198 | sensitivity: deviation * 2 * 3.141592 / sample_rate 199 | states: 200 | bus_sink: false 201 | bus_source: false 202 | bus_structure: null 203 | coordinate: [96, 428.0] 204 | rotation: 180 205 | state: true 206 | - name: blocks_file_source_0 207 | id: blocks_file_source 208 | parameters: 209 | affinity: '' 210 | alias: '' 211 | begin_tag: pmt.PMT_NIL 212 | comment: '' 213 | file: bert.bin 214 | length: '0' 215 | maxoutbuf: '0' 216 | minoutbuf: '0' 217 | offset: '0' 218 | repeat: 'True' 219 | type: byte 220 | vlen: '1' 221 | states: 222 | bus_sink: false 223 | bus_source: false 224 | bus_structure: null 225 | coordinate: [24, 252.0] 226 | rotation: 0 227 | state: true 228 | - name: blocks_repack_bits_bb_0 229 | id: blocks_repack_bits_bb 230 | parameters: 231 | affinity: '' 232 | alias: '' 233 | align_output: 'False' 234 | comment: '' 235 | endianness: gr.GR_MSB_FIRST 236 | k: '8' 237 | l: '2' 238 | len_tag_key: '""' 239 | maxoutbuf: '0' 240 | minoutbuf: '0' 241 | states: 242 | bus_sink: false 243 | bus_source: false 244 | bus_structure: null 245 | coordinate: [208, 276.0] 246 | rotation: 0 247 | state: true 248 | - name: blocks_selector_0 249 | id: blocks_selector 250 | parameters: 251 | affinity: '' 252 | alias: '' 253 | comment: '' 254 | enabled: 'True' 255 | input_index: '0' 256 | maxoutbuf: '0' 257 | minoutbuf: '0' 258 | num_inputs: '2' 259 | num_outputs: '1' 260 | output_index: '0' 261 | showports: 'False' 262 | type: complex 263 | vlen: '1' 264 | states: 265 | bus_sink: false 266 | bus_source: false 267 | bus_structure: null 268 | coordinate: [408, 560.0] 269 | rotation: 0 270 | state: true 271 | - name: channels_channel_model_0_0 272 | id: channels_channel_model 273 | parameters: 274 | affinity: '' 275 | alias: '' 276 | block_tags: 'False' 277 | comment: '' 278 | epsilon: 1.0 + (variable_clock_offset / 1000000.0) 279 | freq_offset: (variable_frequency_offset / symbol_rate) * 0.4 280 | maxoutbuf: '0' 281 | minoutbuf: '0' 282 | noise_voltage: variable_awgn 283 | seed: '0' 284 | taps: 1.0 + 1.0j 285 | states: 286 | bus_sink: false 287 | bus_source: false 288 | bus_structure: null 289 | coordinate: [600, 580.0] 290 | rotation: 0 291 | state: enabled 292 | - name: channels_selective_fading_model_0 293 | id: channels_selective_fading_model 294 | parameters: 295 | K: '4.0' 296 | LOS: 'False' 297 | N: '8' 298 | affinity: '' 299 | alias: '' 300 | comment: '' 301 | delays: (0.0,0.1,1.3) 302 | fDTs: 10.0/sample_rate 303 | mags: (1,0.99,0.97) 304 | maxoutbuf: '0' 305 | minoutbuf: '0' 306 | ntaps: '12' 307 | seed: '0' 308 | states: 309 | bus_sink: false 310 | bus_source: false 311 | bus_structure: null 312 | coordinate: [88, 540.0] 313 | rotation: 0 314 | state: enabled 315 | - name: digital_chunks_to_symbols_xx_0 316 | id: digital_chunks_to_symbols_xx 317 | parameters: 318 | affinity: '' 319 | alias: '' 320 | comment: '' 321 | dimension: '1' 322 | in_type: byte 323 | maxoutbuf: '0' 324 | minoutbuf: '0' 325 | num_ports: '1' 326 | out_type: float 327 | symbol_table: '[+1.0,+3.0,-1.0,-3.0]' 328 | states: 329 | bus_sink: false 330 | bus_source: false 331 | bus_structure: null 332 | coordinate: [432, 288.0] 333 | rotation: 0 334 | state: true 335 | - name: iio_pluto_sink_0 336 | id: iio_pluto_sink 337 | parameters: 338 | affinity: '' 339 | alias: '' 340 | attenuation1: '20.0' 341 | bandwidth: '200000' 342 | buffer_size: '32768' 343 | comment: '' 344 | cyclic: 'False' 345 | filter: '' 346 | filter_source: '''Auto''' 347 | fpass: '0' 348 | frequency: '144910000' 349 | fstop: '0' 350 | len_tag_key: '' 351 | samplerate: tx_rate 352 | type: fc32 353 | uri: ip:192.168.2.1 354 | states: 355 | bus_sink: false 356 | bus_source: false 357 | bus_structure: null 358 | coordinate: [1048, 268.0] 359 | rotation: 0 360 | state: enabled 361 | - name: qtgui_freq_sink_x_0 362 | id: qtgui_freq_sink_x 363 | parameters: 364 | affinity: '' 365 | alias: '' 366 | alpha1: '1.0' 367 | alpha10: '1.0' 368 | alpha2: '1.0' 369 | alpha3: '1.0' 370 | alpha4: '1.0' 371 | alpha5: '1.0' 372 | alpha6: '1.0' 373 | alpha7: '1.0' 374 | alpha8: '1.0' 375 | alpha9: '1.0' 376 | autoscale: 'False' 377 | average: '1.0' 378 | axislabels: 'True' 379 | bw: sample_rate 380 | color1: '"blue"' 381 | color10: '"dark blue"' 382 | color2: '"red"' 383 | color3: '"green"' 384 | color4: '"black"' 385 | color5: '"cyan"' 386 | color6: '"magenta"' 387 | color7: '"yellow"' 388 | color8: '"dark red"' 389 | color9: '"dark green"' 390 | comment: '' 391 | ctrlpanel: 'False' 392 | fc: '0' 393 | fftsize: '1024' 394 | freqhalf: 'True' 395 | grid: 'False' 396 | gui_hint: '' 397 | label: Relative Gain 398 | label1: '' 399 | label10: '''''' 400 | label2: '''''' 401 | label3: '''''' 402 | label4: '''''' 403 | label5: '''''' 404 | label6: '''''' 405 | label7: '''''' 406 | label8: '''''' 407 | label9: '''''' 408 | legend: 'True' 409 | maxoutbuf: '0' 410 | minoutbuf: '0' 411 | name: '""' 412 | nconnections: '1' 413 | norm_window: 'False' 414 | showports: 'False' 415 | tr_chan: '0' 416 | tr_level: '0.0' 417 | tr_mode: qtgui.TRIG_MODE_FREE 418 | tr_tag: '""' 419 | type: complex 420 | units: dB 421 | update_time: '0.10' 422 | width1: '1' 423 | width10: '1' 424 | width2: '1' 425 | width3: '1' 426 | width4: '1' 427 | width5: '1' 428 | width6: '1' 429 | width7: '1' 430 | width8: '1' 431 | width9: '1' 432 | wintype: window.WIN_BLACKMAN_hARRIS 433 | ymax: '10' 434 | ymin: '-140' 435 | states: 436 | bus_sink: false 437 | bus_source: false 438 | bus_structure: null 439 | coordinate: [824, 604.0] 440 | rotation: 0 441 | state: enabled 442 | - name: qtgui_time_sink_x_0 443 | id: qtgui_time_sink_x 444 | parameters: 445 | affinity: '' 446 | alias: '' 447 | alpha1: '1.0' 448 | alpha10: '1.0' 449 | alpha2: '1.0' 450 | alpha3: '1.0' 451 | alpha4: '1.0' 452 | alpha5: '1.0' 453 | alpha6: '1.0' 454 | alpha7: '1.0' 455 | alpha8: '1.0' 456 | alpha9: '1.0' 457 | autoscale: 'False' 458 | axislabels: 'True' 459 | color1: blue 460 | color10: dark blue 461 | color2: red 462 | color3: green 463 | color4: black 464 | color5: cyan 465 | color6: magenta 466 | color7: yellow 467 | color8: dark red 468 | color9: dark green 469 | comment: '' 470 | ctrlpanel: 'False' 471 | entags: 'True' 472 | grid: 'False' 473 | gui_hint: '' 474 | label1: Signal 1 475 | label10: Signal 10 476 | label2: Signal 2 477 | label3: Signal 3 478 | label4: Signal 4 479 | label5: Signal 5 480 | label6: Signal 6 481 | label7: Signal 7 482 | label8: Signal 8 483 | label9: Signal 9 484 | legend: 'True' 485 | marker1: '-1' 486 | marker10: '-1' 487 | marker2: '-1' 488 | marker3: '-1' 489 | marker4: '-1' 490 | marker5: '-1' 491 | marker6: '-1' 492 | marker7: '-1' 493 | marker8: '-1' 494 | marker9: '-1' 495 | name: '""' 496 | nconnections: '1' 497 | size: '1024' 498 | srate: sample_rate 499 | stemplot: 'False' 500 | style1: '1' 501 | style10: '1' 502 | style2: '1' 503 | style3: '1' 504 | style4: '1' 505 | style5: '1' 506 | style6: '1' 507 | style7: '1' 508 | style8: '1' 509 | style9: '1' 510 | tr_chan: '0' 511 | tr_delay: '0' 512 | tr_level: '0.0' 513 | tr_mode: qtgui.TRIG_MODE_FREE 514 | tr_slope: qtgui.TRIG_SLOPE_POS 515 | tr_tag: '""' 516 | type: complex 517 | update_time: '0.10' 518 | width1: '1' 519 | width10: '1' 520 | width2: '1' 521 | width3: '1' 522 | width4: '1' 523 | width5: '1' 524 | width6: '1' 525 | width7: '1' 526 | width8: '1' 527 | width9: '1' 528 | ylabel: Amplitude 529 | ymax: '6' 530 | ymin: '-6' 531 | yunit: '""' 532 | states: 533 | bus_sink: false 534 | bus_source: false 535 | bus_structure: null 536 | coordinate: [824, 444.0] 537 | rotation: 0 538 | state: enabled 539 | - name: rational_resampler_xxx_0 540 | id: rational_resampler_xxx 541 | parameters: 542 | affinity: '' 543 | alias: '' 544 | comment: '' 545 | decim: '3' 546 | fbw: '0.4' 547 | interp: 'int((tx_rate * 3)/sample_rate) ' 548 | maxoutbuf: '0' 549 | minoutbuf: '0' 550 | taps: '[]' 551 | type: ccc 552 | states: 553 | bus_sink: false 554 | bus_source: false 555 | bus_structure: null 556 | coordinate: [824, 300.0] 557 | rotation: 0 558 | state: true 559 | - name: root_raised_cosine_filter_0 560 | id: root_raised_cosine_filter 561 | parameters: 562 | affinity: '' 563 | alias: '' 564 | alpha: '0.5' 565 | comment: '' 566 | decim: '1' 567 | gain: interpolation_rate 568 | interp: interpolation_rate 569 | maxoutbuf: '0' 570 | minoutbuf: '0' 571 | ntaps: interpolation_rate*11+1 572 | samp_rate: interpolation_rate 573 | sym_rate: '1' 574 | type: interp_fir_filter_fff 575 | states: 576 | bus_sink: false 577 | bus_source: false 578 | bus_structure: null 579 | coordinate: [408, 388.0] 580 | rotation: 180 581 | state: true 582 | 583 | connections: 584 | - [analog_frequency_modulator_fc_0, '0', blocks_selector_0, '0'] 585 | - [analog_frequency_modulator_fc_0, '0', channels_selective_fading_model_0, '0'] 586 | - [blocks_file_source_0, '0', blocks_repack_bits_bb_0, '0'] 587 | - [blocks_repack_bits_bb_0, '0', digital_chunks_to_symbols_xx_0, '0'] 588 | - [blocks_selector_0, '0', channels_channel_model_0_0, '0'] 589 | - [channels_channel_model_0_0, '0', qtgui_freq_sink_x_0, '0'] 590 | - [channels_channel_model_0_0, '0', qtgui_time_sink_x_0, '0'] 591 | - [channels_channel_model_0_0, '0', rational_resampler_xxx_0, '0'] 592 | - [channels_selective_fading_model_0, '0', blocks_selector_0, '1'] 593 | - [digital_chunks_to_symbols_xx_0, '0', root_raised_cosine_filter_0, '0'] 594 | - [rational_resampler_xxx_0, '0', iio_pluto_sink_0, '0'] 595 | - [root_raised_cosine_filter_0, '0', analog_frequency_modulator_fc_0, '0'] 596 | - [variable_qtgui_toggle_button_msg_0, state, blocks_selector_0, iindex] 597 | 598 | metadata: 599 | file_format: 1 600 | -------------------------------------------------------------------------------- /make_arn.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | wget https://www.arnewsline.org/s/Report2328.mp3 4 | ffmpeg -i Report2328.mp3 -ar 8000 -ac 1 -f s16le -acodec pcm_s16le - | ~/m17-cxx-demod/build/apps/m17-mod -b -S M17 > Report2328.bin 5 | --------------------------------------------------------------------------------