Porównaj commity

...

10 Commity

Autor SHA1 Wiadomość Data
Wojciech Kaczmarski b52d1c1fd0
baseband generating script update
added support for UTF-8 encoded text
2023-09-20 09:37:55 +02:00
Wojciech Kaczmarski 886d57771c
[WIP] packet mode
fixed message formatting - last chunk was inserted improperly
2023-09-20 09:00:52 +02:00
Wojciech Kaczmarski 06dd06ea80
`m17-sms.sh` script addition
script for generating M17 text message packet baseband as a WAVE file
2023-09-20 08:59:31 +02:00
Wojciech Kaczmarski 141282f2ae
.grc file set update 2023-09-20 08:55:59 +02:00
Wojciech Kaczmarski 69accb038f
Merge pull request #11 from argilo/fix-makefiles
Add missing dependencies to makefiles
2023-09-19 20:49:49 +02:00
Wojciech Kaczmarski a531fcaf51
Merge pull request #12 from argilo/lich-superframe
Require the LICH to be from a single superframe
2023-09-19 20:43:49 +02:00
Clayton Smith 7b27c1a239 Add missing dependencies to makefiles 2023-09-19 14:10:55 -04:00
Wojciech Kaczmarski 939c89b516
[WIP] packet decoder
multiframe text messages should now be decodable
bugs may exist in the part of the code where chunks of frame data are joined together
2023-09-19 19:13:36 +02:00
Wojciech Kaczmarski 18ff1df36f
update Makefile with `install` 2023-09-19 17:11:49 +02:00
Clayton Smith 475df7fefd Require the LICH to be from a single superframe 2023-09-14 01:24:05 -04:00
9 zmienionych plików z 1695 dodań i 48 usunięć

Wyświetl plik

@ -0,0 +1,132 @@
options:
parameters:
author: sp5wwp
catch_exceptions: 'True'
category: '[GRC Hier Blocks]'
cmake_opt: ''
comment: ''
copyright: ''
description: ''
gen_cmake: 'On'
gen_linking: dynamic
generate_options: qt_gui
hier_block_src_path: '.:'
id: simple_loopback
max_nouts: '0'
output_language: python
placement: (0,0)
qt_qss_theme: ''
realtime_scheduling: ''
run: 'True'
run_command: '{python} -u {filename}'
run_options: prompt
sizing_mode: fixed
thread_safe_setters: ''
title: Not titled yet
window_size: (1000,1000)
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [8, 8]
rotation: 0
state: enabled
blocks:
- name: samp_rate
id: variable
parameters:
comment: ''
value: '48000'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [184, 12]
rotation: 0
state: enabled
- name: blocks_file_sink_0
id: blocks_file_sink
parameters:
affinity: ''
alias: ''
append: 'False'
comment: ''
file: ../payload.bin
type: byte
unbuffered: 'False'
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [528, 204.0]
rotation: 0
state: true
- name: blocks_vector_source_x_0
id: blocks_vector_source_x
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
repeat: 'True'
tags: '[]'
type: byte
vector: (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [8, 204.0]
rotation: 0
state: enabled
- name: m17_m17_coder_0
id: m17_m17_coder
parameters:
affinity: ''
alias: ''
comment: ''
debug: 'False'
dst_id: ALL
maxoutbuf: '0'
meta: helloworld
minoutbuf: '0'
src_id: AB1CDE
type: '5'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [200, 188.0]
rotation: 0
state: enabled
- name: m17_m17_decoder_0
id: m17_m17_decoder
parameters:
affinity: ''
alias: ''
comment: ''
debug_ctrl: 'False'
debug_data: 'False'
maxoutbuf: '0'
minoutbuf: '0'
threshold: '0.9'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [360, 204.0]
rotation: 0
state: enabled
connections:
- [blocks_vector_source_x_0, '0', m17_m17_coder_0, '0']
- [m17_m17_coder_0, '0', m17_m17_decoder_0, '0']
- [m17_m17_decoder_0, '0', blocks_file_sink_0, '0']
metadata:
file_format: 1
grc_version: 3.10.7.0

Wyświetl plik

@ -0,0 +1,838 @@
options:
parameters:
author: sp5wwp
catch_exceptions: 'True'
category: '[GRC Hier Blocks]'
cmake_opt: ''
comment: ''
copyright: ''
description: ''
gen_cmake: 'On'
gen_linking: dynamic
generate_options: qt_gui
hier_block_src_path: '.:'
id: simple_rx
max_nouts: '0'
output_language: python
placement: (0,0)
qt_qss_theme: ''
realtime_scheduling: ''
run: 'True'
run_command: '{python} -u {filename}'
run_options: prompt
sizing_mode: fixed
thread_safe_setters: ''
title: Simple M17 receiver
window_size: (1000,1000)
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [8, 8]
rotation: 0
state: enabled
blocks:
- name: ppm
id: variable_qtgui_range
parameters:
comment: ''
gui_hint: ''
label: ppm
min_len: '200'
orient: QtCore.Qt.Horizontal
rangeType: float
start: '-10'
step: '0.1'
stop: '10'
value: '0'
widget: counter_slider
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [384, 12.0]
rotation: 0
state: true
- name: rf_gain
id: variable_qtgui_range
parameters:
comment: ''
gui_hint: ''
label: RF gain
min_len: '200'
orient: QtCore.Qt.Horizontal
rangeType: float
start: '0'
step: '1'
stop: '80'
value: '20'
widget: counter_slider
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [512, 12.0]
rotation: 0
state: true
- name: samp_rate
id: variable
parameters:
comment: ''
value: '48000'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [184, 12.0]
rotation: 0
state: enabled
- name: analog_quadrature_demod_cf_0
id: analog_quadrature_demod_cf
parameters:
affinity: ''
alias: ''
comment: ''
gain: samp_rate/(2.0*math.pi*800.0)
maxoutbuf: '0'
minoutbuf: '0'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [400, 236.0]
rotation: 0
state: enabled
- name: audio_sink_0
id: audio_sink
parameters:
affinity: ''
alias: ''
comment: ''
device_name: ''
num_inputs: '1'
ok_to_block: 'True'
samp_rate: samp_rate
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1736, 244.0]
rotation: 0
state: disabled
- name: blocks_file_sink_0
id: blocks_file_sink
parameters:
affinity: ''
alias: ''
append: 'False'
comment: ''
file: ../payload.bin
type: byte
unbuffered: 'False'
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1352, 300.0]
rotation: 0
state: disabled
- name: blocks_file_sink_0_0
id: blocks_file_sink
parameters:
affinity: ''
alias: ''
append: 'False'
comment: ''
file: ../../../symb_fifo
type: float
unbuffered: 'False'
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1352, 388.0]
rotation: 0
state: enabled
- name: blocks_moving_average_xx_0
id: blocks_moving_average_xx
parameters:
affinity: ''
alias: ''
comment: ''
length: int(0.1*samp_rate)
max_iter: '4000'
maxoutbuf: '0'
minoutbuf: '0'
scale: 1/int(0.1*samp_rate)
type: float
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [496, 380.0]
rotation: 0
state: true
- name: blocks_null_sink_0
id: blocks_null_sink
parameters:
affinity: ''
alias: ''
bus_structure_sink: '[[0,],]'
comment: ''
num_inputs: '1'
type: byte
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1416, 208.0]
rotation: 0
state: disabled
- name: blocks_packed_to_unpacked_xx_0
id: blocks_packed_to_unpacked_xx
parameters:
affinity: ''
alias: ''
bits_per_chunk: '1'
comment: ''
endianness: gr.GR_MSB_FIRST
maxoutbuf: '0'
minoutbuf: '0'
num_ports: '1'
type: byte
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1416, 68.0]
rotation: 0
state: disabled
- name: blocks_short_to_float_0
id: blocks_short_to_float
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
scale: '32768.0'
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1624, 140.0]
rotation: 0
state: disabled
- name: blocks_stream_to_vector_0
id: blocks_stream_to_vector
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
num_items: '64'
type: byte
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1600, 80.0]
rotation: 0
state: disabled
- name: blocks_sub_xx_0
id: blocks_sub_xx
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
num_inputs: '2'
type: float
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [616, 240.0]
rotation: 0
state: true
- name: blocks_vector_source_x_0
id: blocks_vector_source_x
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
repeat: 'True'
tags: '[]'
type: byte
vector: (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [744, 388.0]
rotation: 0
state: disabled
- name: digital_symbol_sync_xx_0
id: digital_symbol_sync_xx
parameters:
affinity: ''
alias: ''
comment: ''
constellation: digital.constellation_bpsk().base()
damping: '1.0'
loop_bw: '0.0045'
max_dev: '4.5'
maxoutbuf: '0'
minoutbuf: '0'
nfilters: '128'
osps: '1'
pfb_mf_taps: '[]'
resamp_type: digital.IR_MMSE_8TAP
sps: '10'
ted_gain: '1.0'
ted_type: digital.TED_GARDNER
type: ff
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [928, 196.0]
rotation: 0
state: enabled
- name: iio_pluto_source_0
id: iio_pluto_source
parameters:
affinity: ''
alias: ''
bandwidth: samp_rate*16
bbdc: 'True'
buffer_size: '32768'
comment: ''
filter: ''
filter_source: '''Auto'''
fpass: '0'
frequency: int(433475000*(1+ppm*1e-6))
fstop: '0'
gain1: '''manual'''
len_tag_key: packet_len
manual_gain1: rf_gain
maxoutbuf: '0'
minoutbuf: '0'
quadrature: 'True'
rfdc: 'True'
samplerate: samp_rate*16
type: fc32
uri: ''
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [16, 156.0]
rotation: 0
state: disabled
- name: import_0
id: import
parameters:
alias: ''
comment: ''
imports: import math
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [280, 12.0]
rotation: 0
state: true
- name: m17_m17_coder_0
id: m17_m17_coder
parameters:
affinity: ''
alias: ''
comment: ''
debug: 'False'
dst_id: ALL
maxoutbuf: '0'
meta: helloworld
minoutbuf: '0'
src_id: AB1CDE
type: '5'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [936, 372.0]
rotation: 0
state: disabled
- name: m17_m17_decoder_0
id: m17_m17_decoder
parameters:
affinity: ''
alias: ''
comment: ''
debug_ctrl: 'False'
debug_data: 'True'
maxoutbuf: '0'
minoutbuf: '0'
threshold: '0.98'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1224, 188.0]
rotation: 0
state: disabled
- name: qtgui_eye_sink_x_0
id: qtgui_eye_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'
axislabels: 'True'
color1: blue
color10: blue
color2: blue
color3: blue
color4: blue
color5: blue
color6: blue
color7: blue
color8: blue
color9: blue
comment: ''
ctrlpanel: 'False'
entags: 'False'
grid: 'True'
gui_hint: ''
label1: M17 baseband
label10: Signal 10
label2: Signal 2
label3: Signal 3
label4: Signal 4
label5: Signal 5
label6: Signal 6
label7: Signal 7
label8: Signal 8
label9: Signal 9
legend: 'True'
marker1: '-1'
marker10: '-1'
marker2: '-1'
marker3: '-1'
marker4: '-1'
marker5: '-1'
marker6: '-1'
marker7: '-1'
marker8: '-1'
marker9: '-1'
nconnections: '1'
samp_per_symbol: '10'
size: int(samp_rate/10)
srate: samp_rate
style1: '1'
style10: '1'
style2: '1'
style3: '1'
style4: '1'
style5: '1'
style6: '1'
style7: '1'
style8: '1'
style9: '1'
tr_chan: '0'
tr_delay: '0'
tr_level: '0.0'
tr_mode: qtgui.TRIG_MODE_FREE
tr_slope: qtgui.TRIG_SLOPE_POS
tr_tag: '""'
type: float
update_time: '0.10'
width1: '1'
width10: '1'
width2: '1'
width3: '1'
width4: '1'
width5: '1'
width6: '1'
width7: '1'
width8: '1'
width9: '1'
ylabel: Amplitude
ymax: '5'
ymin: '-5'
yunit: '""'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [936, 92.0]
rotation: 0
state: enabled
- name: qtgui_time_sink_x_0
id: qtgui_time_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'
axislabels: 'True'
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'
entags: 'True'
grid: 'False'
gui_hint: ''
label1: Signal 1
label10: Signal 10
label2: Signal 2
label3: Signal 3
label4: Signal 4
label5: Signal 5
label6: Signal 6
label7: Signal 7
label8: Signal 8
label9: Signal 9
legend: 'True'
marker1: '-1'
marker10: '-1'
marker2: '-1'
marker3: '-1'
marker4: '-1'
marker5: '-1'
marker6: '-1'
marker7: '-1'
marker8: '-1'
marker9: '-1'
name: '""'
nconnections: '1'
size: '2000'
srate: '8000'
stemplot: 'False'
style1: '1'
style10: '1'
style2: '1'
style3: '1'
style4: '1'
style5: '1'
style6: '1'
style7: '1'
style8: '1'
style9: '1'
tr_chan: '0'
tr_delay: '0'
tr_level: '0.0'
tr_mode: qtgui.TRIG_MODE_FREE
tr_slope: qtgui.TRIG_SLOPE_POS
tr_tag: '""'
type: float
update_time: '0.10'
width1: '1'
width10: '1'
width2: '1'
width3: '1'
width4: '1'
width5: '1'
width6: '1'
width7: '1'
width8: '1'
width9: '1'
ylabel: Amplitude
ymax: '1'
ymin: '-1'
yunit: '""'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1760, 124.0]
rotation: 0
state: disabled
- name: qtgui_time_sink_x_0_0
id: qtgui_time_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'
axislabels: 'True'
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'
entags: 'False'
grid: 'False'
gui_hint: ''
label1: Signal 1
label10: Signal 10
label2: Signal 2
label3: Signal 3
label4: Signal 4
label5: Signal 5
label6: Signal 6
label7: Signal 7
label8: Signal 8
label9: Signal 9
legend: 'False'
marker1: '-1'
marker10: '-1'
marker2: '-1'
marker3: '-1'
marker4: '-1'
marker5: '-1'
marker6: '-1'
marker7: '-1'
marker8: '-1'
marker9: '-1'
name: '""'
nconnections: '1'
size: '100'
srate: '4800'
stemplot: 'False'
style1: '1'
style10: '1'
style2: '1'
style3: '1'
style4: '1'
style5: '1'
style6: '1'
style7: '1'
style8: '1'
style9: '1'
tr_chan: '0'
tr_delay: '0'
tr_level: '0.0'
tr_mode: qtgui.TRIG_MODE_FREE
tr_slope: qtgui.TRIG_SLOPE_POS
tr_tag: '""'
type: float
update_time: '0.10'
width1: '1'
width10: '1'
width2: '1'
width3: '1'
width4: '1'
width5: '1'
width6: '1'
width7: '1'
width8: '1'
width9: '1'
ylabel: Amplitude
ymax: '5'
ymin: '-5'
yunit: '""'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1224, 100.0]
rotation: 0
state: disabled
- name: rational_resampler_xxx_0
id: rational_resampler_xxx
parameters:
affinity: ''
alias: ''
comment: ''
decim: '16'
fbw: '0'
interp: '1'
maxoutbuf: '0'
minoutbuf: '0'
taps: '[]'
type: ccc
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [232, 212.0]
rotation: 0
state: disabled
- name: rational_resampler_xxx_0_0
id: rational_resampler_xxx
parameters:
affinity: ''
alias: ''
comment: ''
decim: int(1920000/samp_rate)
fbw: '0'
interp: '1'
maxoutbuf: '0'
minoutbuf: '0'
taps: '[]'
type: ccc
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [240, 420.0]
rotation: 0
state: enabled
- name: rational_resampler_xxx_1
id: rational_resampler_xxx
parameters:
affinity: ''
alias: ''
comment: ''
decim: '1'
fbw: '0'
interp: '6'
maxoutbuf: '0'
minoutbuf: '0'
taps: '[]'
type: fff
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1568, 220.0]
rotation: 0
state: disabled
- name: root_raised_cosine_filter_0
id: root_raised_cosine_filter
parameters:
affinity: ''
alias: ''
alpha: '0.5'
comment: ''
decim: '1'
gain: '1'
interp: '1'
maxoutbuf: '0'
minoutbuf: '0'
ntaps: '81'
samp_rate: '10'
sym_rate: '1.0'
type: fir_filter_fff
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [720, 212.0]
rotation: 0
state: enabled
- name: soapy_rtlsdr_source_0
id: soapy_rtlsdr_source
parameters:
affinity: ''
agc: 'False'
alias: ''
bias: 'False'
center_freq: int(433475000*(1+ppm*1e-6))
comment: ''
dev_args: ''
freq_correction: '0'
gain: rf_gain
maxoutbuf: '0'
minoutbuf: '0'
samp_rate: '1920000'
type: fc32
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [32, 436.0]
rotation: 0
state: true
- name: vocoder_codec2_decode_ps_0
id: vocoder_codec2_decode_ps
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
mode: codec2.MODE_3200
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1432, 140.0]
rotation: 0
state: disabled
connections:
- [analog_quadrature_demod_cf_0, '0', blocks_moving_average_xx_0, '0']
- [analog_quadrature_demod_cf_0, '0', blocks_sub_xx_0, '0']
- [blocks_moving_average_xx_0, '0', blocks_sub_xx_0, '1']
- [blocks_packed_to_unpacked_xx_0, '0', blocks_stream_to_vector_0, '0']
- [blocks_short_to_float_0, '0', qtgui_time_sink_x_0, '0']
- [blocks_short_to_float_0, '0', rational_resampler_xxx_1, '0']
- [blocks_stream_to_vector_0, '0', vocoder_codec2_decode_ps_0, '0']
- [blocks_sub_xx_0, '0', root_raised_cosine_filter_0, '0']
- [blocks_vector_source_x_0, '0', m17_m17_coder_0, '0']
- [digital_symbol_sync_xx_0, '0', blocks_file_sink_0_0, '0']
- [digital_symbol_sync_xx_0, '0', m17_m17_decoder_0, '0']
- [digital_symbol_sync_xx_0, '0', qtgui_time_sink_x_0_0, '0']
- [iio_pluto_source_0, '0', rational_resampler_xxx_0, '0']
- [m17_m17_coder_0, '0', m17_m17_decoder_0, '0']
- [m17_m17_decoder_0, '0', blocks_file_sink_0, '0']
- [m17_m17_decoder_0, '0', blocks_null_sink_0, '0']
- [m17_m17_decoder_0, '0', blocks_packed_to_unpacked_xx_0, '0']
- [rational_resampler_xxx_0, '0', analog_quadrature_demod_cf_0, '0']
- [rational_resampler_xxx_0_0, '0', analog_quadrature_demod_cf_0, '0']
- [rational_resampler_xxx_1, '0', audio_sink_0, '0']
- [root_raised_cosine_filter_0, '0', digital_symbol_sync_xx_0, '0']
- [root_raised_cosine_filter_0, '0', qtgui_eye_sink_x_0, '0']
- [soapy_rtlsdr_source_0, '0', rational_resampler_xxx_0_0, '0']
- [vocoder_codec2_decode_ps_0, '0', blocks_short_to_float_0, '0']
metadata:
file_format: 1
grc_version: 3.10.7.0

Wyświetl plik

@ -0,0 +1,615 @@
options:
parameters:
author: sp5wwp
catch_exceptions: 'True'
category: '[GRC Hier Blocks]'
cmake_opt: ''
comment: ''
copyright: ''
description: ''
gen_cmake: 'On'
gen_linking: dynamic
generate_options: qt_gui
hier_block_src_path: '.:'
id: simple_tx
max_nouts: '0'
output_language: python
placement: (0,0)
qt_qss_theme: ''
realtime_scheduling: ''
run: 'True'
run_command: '{python} -u {filename}'
run_options: prompt
sizing_mode: fixed
thread_safe_setters: ''
title: Not titled yet
window_size: (1000,1000)
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [8, 8]
rotation: 0
state: enabled
blocks:
- name: samp_rate
id: variable
parameters:
comment: ''
value: '48000'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [184, 12]
rotation: 0
state: enabled
- name: analog_frequency_modulator_fc_0
id: analog_frequency_modulator_fc
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
sensitivity: (2.0*math.pi*800.0)/samp_rate
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [720, 196.0]
rotation: 0
state: true
- name: blocks_file_source_0
id: blocks_file_source
parameters:
affinity: ''
alias: ''
begin_tag: pmt.PMT_NIL
comment: ''
file: samples/1.aud
length: '0'
maxoutbuf: '0'
minoutbuf: '0'
offset: '0'
repeat: 'True'
type: short
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [8, 380.0]
rotation: 0
state: disabled
- name: blocks_file_source_1
id: blocks_file_source
parameters:
affinity: ''
alias: ''
begin_tag: pmt.PMT_NIL
comment: ''
file: samples/1.bin
length: '0'
maxoutbuf: '0'
minoutbuf: '0'
offset: '0'
repeat: 'True'
type: byte
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [392, 340.0]
rotation: 0
state: disabled
- name: blocks_pack_k_bits_bb_0
id: blocks_pack_k_bits_bb
parameters:
affinity: ''
alias: ''
comment: ''
k: '8'
maxoutbuf: '0'
minoutbuf: '0'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [80, 316.0]
rotation: 180
state: disabled
- name: blocks_repack_bits_bb_0
id: blocks_repack_bits_bb
parameters:
affinity: ''
alias: ''
align_output: 'False'
comment: ''
endianness: gr.GR_MSB_FIRST
k: '8'
l: '2'
len_tag_key: '""'
maxoutbuf: '0'
minoutbuf: '0'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [544, 364.0]
rotation: 0
state: disabled
- name: blocks_vector_source_x_0
id: blocks_vector_source_x
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
repeat: 'True'
tags: '[]'
type: byte
vector: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [16, 180.0]
rotation: 0
state: enabled
- name: blocks_vector_to_stream_0
id: blocks_vector_to_stream
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
num_items: '64'
type: byte
vlen: '1'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [200, 320.0]
rotation: 180
state: disabled
- name: digital_chunks_to_symbols_xx_0
id: digital_chunks_to_symbols_xx
parameters:
affinity: ''
alias: ''
comment: ''
dimension: '1'
in_type: byte
maxoutbuf: '0'
minoutbuf: '0'
num_ports: '1'
out_type: float
symbol_table: (1.0, 3.0, -1.0, -3.0)
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [728, 376.0]
rotation: 0
state: disabled
- name: iio_pluto_sink_0
id: iio_pluto_sink
parameters:
affinity: ''
alias: ''
attenuation1: '30'
bandwidth: samp_rate*16
buffer_size: '32768'
comment: ''
cyclic: 'False'
filter: ''
filter_source: '''Auto'''
fpass: '0'
frequency: int(433475000*(1+2.75e-6))
fstop: '0'
len_tag_key: ''
samplerate: samp_rate*16
type: fc32
uri: ''
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1056, 140.0]
rotation: 0
state: disabled
- name: import_0
id: import
parameters:
alias: ''
comment: ''
imports: import math
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [280, 12.0]
rotation: 0
state: true
- name: m17_m17_coder_0
id: m17_m17_coder
parameters:
affinity: ''
alias: ''
comment: ''
debug: 'False'
dst_id: ALL
maxoutbuf: '0'
meta: helloworld
minoutbuf: '0'
src_id: AB1CDE
type: '5'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [200, 164.0]
rotation: 0
state: enabled
- name: rational_resampler_xxx_0
id: rational_resampler_xxx
parameters:
affinity: ''
alias: ''
comment: ''
decim: '1'
fbw: '0'
interp: '16'
maxoutbuf: '0'
minoutbuf: '0'
taps: '[]'
type: ccf
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [888, 172.0]
rotation: 0
state: true
- name: root_raised_cosine_filter_0
id: root_raised_cosine_filter
parameters:
affinity: ''
alias: ''
alpha: '0.5'
comment: ''
decim: '1'
gain: '10'
interp: '10'
maxoutbuf: '0'
minoutbuf: '0'
ntaps: '81'
samp_rate: '10'
sym_rate: '1.0'
type: interp_fir_filter_fff
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [512, 156.0]
rotation: 0
state: true
- name: uhd_usrp_sink_0
id: uhd_usrp_sink
parameters:
affinity: ''
alias: ''
ant0: '"TX/RX"'
ant1: '"TX/RX"'
ant10: '"TX/RX"'
ant11: '"TX/RX"'
ant12: '"TX/RX"'
ant13: '"TX/RX"'
ant14: '"TX/RX"'
ant15: '"TX/RX"'
ant16: '"TX/RX"'
ant17: '"TX/RX"'
ant18: '"TX/RX"'
ant19: '"TX/RX"'
ant2: '"TX/RX"'
ant20: '"TX/RX"'
ant21: '"TX/RX"'
ant22: '"TX/RX"'
ant23: '"TX/RX"'
ant24: '"TX/RX"'
ant25: '"TX/RX"'
ant26: '"TX/RX"'
ant27: '"TX/RX"'
ant28: '"TX/RX"'
ant29: '"TX/RX"'
ant3: '"TX/RX"'
ant30: '"TX/RX"'
ant31: '"TX/RX"'
ant4: '"TX/RX"'
ant5: '"TX/RX"'
ant6: '"TX/RX"'
ant7: '"TX/RX"'
ant8: '"TX/RX"'
ant9: '"TX/RX"'
bw0: samp_rate*16
bw1: '0'
bw10: '0'
bw11: '0'
bw12: '0'
bw13: '0'
bw14: '0'
bw15: '0'
bw16: '0'
bw17: '0'
bw18: '0'
bw19: '0'
bw2: '0'
bw20: '0'
bw21: '0'
bw22: '0'
bw23: '0'
bw24: '0'
bw25: '0'
bw26: '0'
bw27: '0'
bw28: '0'
bw29: '0'
bw3: '0'
bw30: '0'
bw31: '0'
bw4: '0'
bw5: '0'
bw6: '0'
bw7: '0'
bw8: '0'
bw9: '0'
center_freq0: int(433475000*(1+2.75e-6))
center_freq1: '0'
center_freq10: '0'
center_freq11: '0'
center_freq12: '0'
center_freq13: '0'
center_freq14: '0'
center_freq15: '0'
center_freq16: '0'
center_freq17: '0'
center_freq18: '0'
center_freq19: '0'
center_freq2: '0'
center_freq20: '0'
center_freq21: '0'
center_freq22: '0'
center_freq23: '0'
center_freq24: '0'
center_freq25: '0'
center_freq26: '0'
center_freq27: '0'
center_freq28: '0'
center_freq29: '0'
center_freq3: '0'
center_freq30: '0'
center_freq31: '0'
center_freq4: '0'
center_freq5: '0'
center_freq6: '0'
center_freq7: '0'
center_freq8: '0'
center_freq9: '0'
clock_rate: 0e0
clock_source0: ''
clock_source1: ''
clock_source2: ''
clock_source3: ''
clock_source4: ''
clock_source5: ''
clock_source6: ''
clock_source7: ''
comment: ''
dev_addr: ''
dev_args: ''
gain0: '60'
gain1: '0'
gain10: '0'
gain11: '0'
gain12: '0'
gain13: '0'
gain14: '0'
gain15: '0'
gain16: '0'
gain17: '0'
gain18: '0'
gain19: '0'
gain2: '0'
gain20: '0'
gain21: '0'
gain22: '0'
gain23: '0'
gain24: '0'
gain25: '0'
gain26: '0'
gain27: '0'
gain28: '0'
gain29: '0'
gain3: '0'
gain30: '0'
gain31: '0'
gain4: '0'
gain5: '0'
gain6: '0'
gain7: '0'
gain8: '0'
gain9: '0'
gain_type0: default
gain_type1: default
gain_type10: default
gain_type11: default
gain_type12: default
gain_type13: default
gain_type14: default
gain_type15: default
gain_type16: default
gain_type17: default
gain_type18: default
gain_type19: default
gain_type2: default
gain_type20: default
gain_type21: default
gain_type22: default
gain_type23: default
gain_type24: default
gain_type25: default
gain_type26: default
gain_type27: default
gain_type28: default
gain_type29: default
gain_type3: default
gain_type30: default
gain_type31: default
gain_type4: default
gain_type5: default
gain_type6: default
gain_type7: default
gain_type8: default
gain_type9: default
len_tag_name: '""'
lo_export0: 'False'
lo_export1: 'False'
lo_export10: 'False'
lo_export11: 'False'
lo_export12: 'False'
lo_export13: 'False'
lo_export14: 'False'
lo_export15: 'False'
lo_export16: 'False'
lo_export17: 'False'
lo_export18: 'False'
lo_export19: 'False'
lo_export2: 'False'
lo_export20: 'False'
lo_export21: 'False'
lo_export22: 'False'
lo_export23: 'False'
lo_export24: 'False'
lo_export25: 'False'
lo_export26: 'False'
lo_export27: 'False'
lo_export28: 'False'
lo_export29: 'False'
lo_export3: 'False'
lo_export30: 'False'
lo_export31: 'False'
lo_export4: 'False'
lo_export5: 'False'
lo_export6: 'False'
lo_export7: 'False'
lo_export8: 'False'
lo_export9: 'False'
lo_source0: internal
lo_source1: internal
lo_source10: internal
lo_source11: internal
lo_source12: internal
lo_source13: internal
lo_source14: internal
lo_source15: internal
lo_source16: internal
lo_source17: internal
lo_source18: internal
lo_source19: internal
lo_source2: internal
lo_source20: internal
lo_source21: internal
lo_source22: internal
lo_source23: internal
lo_source24: internal
lo_source25: internal
lo_source26: internal
lo_source27: internal
lo_source28: internal
lo_source29: internal
lo_source3: internal
lo_source30: internal
lo_source31: internal
lo_source4: internal
lo_source5: internal
lo_source6: internal
lo_source7: internal
lo_source8: internal
lo_source9: internal
maxoutbuf: '0'
minoutbuf: '0'
nchan: '1'
num_mboards: '1'
otw: ''
samp_rate: samp_rate*16
sd_spec0: ''
sd_spec1: ''
sd_spec2: ''
sd_spec3: ''
sd_spec4: ''
sd_spec5: ''
sd_spec6: ''
sd_spec7: ''
show_lo_controls: 'False'
start_time: '-1.0'
stream_args: ''
stream_chans: '[]'
sync: sync
time_source0: ''
time_source1: ''
time_source2: ''
time_source3: ''
time_source4: ''
time_source5: ''
time_source6: ''
time_source7: ''
type: fc32
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [1064, 316.0]
rotation: 0
state: enabled
- name: vocoder_codec2_encode_sp_0
id: vocoder_codec2_encode_sp
parameters:
affinity: ''
alias: ''
comment: ''
maxoutbuf: '0'
minoutbuf: '0'
mode: codec2.MODE_3200
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [160, 412.0]
rotation: 0
state: disabled
connections:
- [analog_frequency_modulator_fc_0, '0', rational_resampler_xxx_0, '0']
- [blocks_file_source_0, '0', vocoder_codec2_encode_sp_0, '0']
- [blocks_file_source_1, '0', blocks_repack_bits_bb_0, '0']
- [blocks_pack_k_bits_bb_0, '0', m17_m17_coder_0, '0']
- [blocks_repack_bits_bb_0, '0', digital_chunks_to_symbols_xx_0, '0']
- [blocks_vector_source_x_0, '0', m17_m17_coder_0, '0']
- [blocks_vector_to_stream_0, '0', blocks_pack_k_bits_bb_0, '0']
- [digital_chunks_to_symbols_xx_0, '0', root_raised_cosine_filter_0, '0']
- [m17_m17_coder_0, '0', root_raised_cosine_filter_0, '0']
- [rational_resampler_xxx_0, '0', iio_pluto_sink_0, '0']
- [rational_resampler_xxx_0, '0', uhd_usrp_sink_0, '0']
- [root_raised_cosine_filter_0, '0', analog_frequency_modulator_fc_0, '0']
- [vocoder_codec2_encode_sp_0, '0', blocks_vector_to_stream_0, '0']
metadata:
file_format: 1
grc_version: 3.10.7.0

Wyświetl plik

@ -1,4 +1,4 @@
m17-coder-sym: m17-coder-sym.c golay.c crc.c
m17-coder-sym: m17-coder-sym.c golay.c golay.h crc.c crc.h ../inc/m17.h
gcc -O2 -w m17-coder-sym.c golay.c crc.c -o m17-coder-sym -lm
clean:

Wyświetl plik

@ -1,4 +1,4 @@
m17-decoder-sym: m17-decoder-sym.c golay.c viterbi.c crc.c
m17-decoder-sym: m17-decoder-sym.c golay.c golay.h viterbi.c viterbi.h crc.c crc.h ../inc/m17.h
gcc -Wall -O2 m17-decoder-sym.c golay.c viterbi.c crc.c -o m17-decoder-sym -lm
clean:

Wyświetl plik

@ -24,6 +24,7 @@ uint16_t lich_chunk[96]; //raw, soft LSF chunk extracted from the LIC
uint8_t lich_b[6]; //48-bit decoded LICH
uint8_t lich_cnt; //LICH_CNT
uint8_t lich_chunks_rcvd=0; //flags set for each LSF chunk received
uint16_t expected_next_fn=0; //frame number of the next frame expected to arrive
uint16_t enc_data[272]; //raw frame data soft bits
uint8_t frame_data[19]; //decoded frame data, 144 bits (16+128), plus 4 flushing bits
@ -201,6 +202,32 @@ int main(void)
//if it is a frame
if(!fl)
{
//extract data
for(uint16_t i=0; i<272; i++)
{
enc_data[i]=d_soft_bit[96+i];
}
//decode
uint32_t e=decodePunctured(frame_data, enc_data, P_2, 272, 12);
uint16_t fn = (frame_data[1] << 8) | frame_data[2];
//dump data - first byte is empty
printf("FN: %04X PLD: ", fn);
for(uint8_t i=3; i<19; i++)
{
printf("%02X", frame_data[i]);
}
#ifdef SHOW_VITERBI_ERRS
printf(" e=%1.1f\n", (float)e/0xFFFF);
#else
printf("\n");
#endif
//send codec2 stream to stdout
//write(STDOUT_FILENO, &frame_data[3], 16);
//extract LICH
for(uint16_t i=0; i<96; i++)
{
@ -210,6 +237,11 @@ int main(void)
//Golay decoder
decode_LICH(lich_b, lich_chunk);
lich_cnt=lich_b[5]>>5;
//If we're at the start of a superframe, or we missed a frame, reset the LICH state
if((lich_cnt==0) || ((fn % 0x8000)!=expected_next_fn))
lich_chunks_rcvd=0;
lich_chunks_rcvd|=(1<<lich_cnt);
memcpy(&lsf[lich_cnt*5], lich_b, 5);
@ -262,33 +294,9 @@ int main(void)
else
printf(" LSF_CRC_OK ");
printf("\n");
lich_chunks_rcvd=0; //reset all flags
}
//extract data
for(uint16_t i=0; i<272; i++)
{
enc_data[i]=d_soft_bit[96+i];
}
//decode
uint32_t e=decodePunctured(frame_data, enc_data, P_2, 272, 12);
//dump data - first byte is empty
printf("FN: %02X%02X PLD: ", frame_data[1], frame_data[2]);
for(uint8_t i=3; i<19; i++)
{
printf("%02X", frame_data[i]);
}
#ifdef SHOW_VITERBI_ERRS
printf(" e=%1.1f\n", (float)e/0xFFFF);
#else
printf("\n");
#endif
//send codec2 stream to stdout
//write(STDOUT_FILENO, &frame_data[3], 16);
expected_next_fn = (fn + 1) % 0x8000;
}
else //lsf
{

Wyświetl plik

@ -1,8 +1,14 @@
m17-packet-encode: m17-packet-encode.c crc.c
m17-packet-encode: m17-packet-encode.c crc.c crc.h ../inc/m17.h
gcc -O2 -Wall m17-packet-encode.c crc.c -o m17-packet-encode -lm
m17-packet-decode: m17-packet-decode.c viterbi.c crc.c
m17-packet-decode: m17-packet-decode.c viterbi.c viterbi.h crc.c crc.h ../inc/m17.h
gcc -O2 -Wall m17-packet-decode.c viterbi.c crc.c -o m17-packet-decode -lm
all: m17-packet-encode m17-packet-decode
install: all
sudo install m17-packet-encode /usr/local/bin
sudo install m17-packet-decode /usr/local/bin
clean:
rm m17-packet-encode m17-packet-decode

Wyświetl plik

@ -21,9 +21,11 @@ uint16_t d_soft_bit[2*SYM_PER_PLD]; //deinterleaved soft bits
uint8_t lsf[30+1]; //complete LSF (one byte extra needed for the Viterbi decoder)
uint8_t frame_data[26+1]; //decoded frame data, 206 bits, plus 4 flushing bits
uint8_t packet_data[33*25]; //whole packet data
uint8_t syncd=0; //syncword found?
uint8_t fl=0; //Frame=0 of LSF=1
int8_t last_fn; //last received frame number (-1 when idle)
uint8_t pushed; //counter for pushed symbols
//decodes a 6-byte long array to a callsign
@ -94,24 +96,28 @@ int main(void)
dist = eucl_norm(last, pkt_sync, 8);
//fprintf(stderr, "pkt_sync dist: %3.5f\n", dist);
if(dist<DIST_THRESH) //Frame syncword detected
if(dist<DIST_THRESH) //frame syncword detected
{
//fprintf(stderr, "pkt_sync\n");
syncd=1;
pushed=0;
fl=0;
}
//calculate euclidean norm
dist = eucl_norm(last, lsf_sync, 8);
//fprintf(stderr, "lsf_sync dist: %3.5f\n", dist);
if(dist<DIST_THRESH) //LSF syncword
else
{
//fprintf(stderr, "lsf_sync\n");
syncd=1;
pushed=0;
fl=1;
//calculate euclidean norm again, this time against LSF syncword
dist = eucl_norm(last, lsf_sync, 8);
//fprintf(stderr, "lsf_sync dist: %3.5f\n", dist);
if(dist<DIST_THRESH) //LSF syncword
{
//fprintf(stderr, "lsf_sync\n");
syncd=1;
pushed=0;
last_fn=-1;
memset(packet_data, 0, 33*25);
fl=1;
}
}
}
else
@ -176,25 +182,48 @@ int main(void)
if(!fl)
{
//decode
#ifdef SHOW_VITERBI_ERRS
uint32_t e=decodePunctured(frame_data, d_soft_bit, P_3, SYM_PER_PLD*2, 8);
#else
decodePunctured(frame_data, d_soft_bit, P_3, SYM_PER_PLD*2, 8);
#endif
//dump data - first byte is empty
if(frame_data[1]==0x05) //if text message (TODO: check its length)
//dump FN
uint8_t rx_fn=(frame_data[26]>>2)&0x1F;
uint8_t rx_last=frame_data[26]>>7;
//fprintf(stderr, "FN%d, (%d)\n", rx_fn, rx_last);
//copy data - might require some fixing
if(rx_fn<=31 && rx_fn==last_fn+1 && !rx_last)
{
fprintf(stderr, "%s", &frame_data[2]);
memcpy(&packet_data[rx_fn*25], &frame_data[1], 25);
last_fn++;
}
else
else if(rx_last)
{
fprintf(stderr, "PKT: ");
for(uint8_t i=1; i<27; i++)
memcpy(&packet_data[(last_fn+1)*25], &frame_data[1], rx_fn);
//dump data
if(packet_data[0]==0x05) //if a text message
{
fprintf(stderr, "%02X", frame_data[i]);
fprintf(stderr, "%s", &packet_data[1]);
}
else
{
fprintf(stderr, "PKT: ");
for(uint16_t i=0; i<last_fn*25+rx_fn; i++)
{
fprintf(stderr, "%02X", packet_data[i]);
}
}
fprintf(stderr, "\n");
}
#ifdef SHOW_VITERBI_ERRS
fprintf(stderr, " e=%1.1f\n", (float)e/0xFFFF);
#else
fprintf(stderr, "\n");
//fprintf(stderr, "\n");
#endif
//send codec2 stream to stdout
@ -205,7 +234,11 @@ int main(void)
//fprintf(stderr, "LSF\n");
//decode
#ifdef SHOW_VITERBI_ERRS
uint32_t e=decodePunctured(lsf, d_soft_bit, P_1, 2*SYM_PER_PLD, 61);
#else
decodePunctured(lsf, d_soft_bit, P_1, 2*SYM_PER_PLD, 61);
#endif
//shift the buffer 1 position left - get rid of the encoded flushing bits
for(uint8_t i=0; i<30; i++)

Wyświetl plik

@ -0,0 +1,15 @@
#!/bin/bash
if [ "$#" -lt 5 ]
then
echo "Not enough parameters."
echo "Usage: sh m17-sms.sh dst src can message output_file"
echo "Exiting."
exit
fi
str=$4
printf -v _ %s%n "$str" len #get UTF-8 encoded length
len=$(($len+2)) #add the 2 additional bytes (0x05 and 0x00)
echo -en "\x05"$str"\x00" | m17-packet-encode -S $2 -D $1 -C $3 -n $len -o $5
sox -t raw -r 48000 -b 16 -c 1 -L -e signed-integer $5 $5".wav"