aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <ikj1234i@yahoo.com>2017-02-09 09:05:34 -0500
committerMax <ikj1234i@yahoo.com>2017-02-09 09:05:34 -0500
commit560f0c54613419869f368c9c380ac73d31289e31 (patch)
treed2171c23593c0a7a1a14290e4d098681e8f2e314
parentb81ad173b1e508a313cedba88a7d1dd74d3e1dee (diff)
dmr updates
-rw-r--r--op25/gr-op25_repeater/apps/tx/dmr-cfg.dat73
-rwxr-xr-xop25/gr-op25_repeater/apps/tx/op25_c4fm_mod.py17
-rw-r--r--op25/gr-op25_repeater/lib/dmr_bs_tx_bb_impl.cc13
3 files changed, 97 insertions, 6 deletions
diff --git a/op25/gr-op25_repeater/apps/tx/dmr-cfg.dat b/op25/gr-op25_repeater/apps/tx/dmr-cfg.dat
new file mode 100644
index 0000000..05200e5
--- /dev/null
+++ b/op25/gr-op25_repeater/apps/tx/dmr-cfg.dat
@@ -0,0 +1,73 @@
+#################################################################################
+#
+# config file for DMR BS TX
+#
+#################################################################################
+#
+# DMR Encoder (C) Copyright 2017 Max H. Parke KA1RBI
+#
+# This file is part of OP25
+#
+# This is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this software; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#################################################################################
+#
+# NOTE
+#
+# Everything in this file is doubled up due to the two slot TDMA.
+#
+# For example "en1" is for slot 1 and "en2" is for slot 2
+#
+# Syntax is unforgiving - no whitespace allowed (outside of comments)
+#
+#
+#################################################################################
+#
+# slot enable [1 bit: 0=disable; 1=enable]
+# - transmits voice sync when enabled, idle slot sync when disabled
+# - the GR block consumes input samples on both channels (whether or not enabled)
+#
+en1=1
+en2=1
+#################################################################################
+#
+# color code [4 bits]
+#
+cc1=1
+cc2=1
+#################################################################################
+#
+# Activity Update
+# - source: spec volume 2 para 7.1.3.2
+# - specify the hashed address [8 bits]
+# - compressed destination address 1 and destination address 2
+# - typically set to zero [?]
+#
+ts1=0
+ts2=0
+#################################################################################
+#
+# Group Voice Channel User LC PDU
+# - source: spec volume 2 paragraph 7.1.1.1
+# - the so/ga/sa (Service Options/[talk]Group Address/Source Address)
+# - values are specified in decimal [so: 8 bits; sa and ga: 24 bits]
+# - service options are typically set to zero [?]
+#
+so1=0
+so2=0
+ga1=1
+ga2=311
+sa1=1
+sa2=1
diff --git a/op25/gr-op25_repeater/apps/tx/op25_c4fm_mod.py b/op25/gr-op25_repeater/apps/tx/op25_c4fm_mod.py
index 4ee4c78..9e0e872 100755
--- a/op25/gr-op25_repeater/apps/tx/op25_c4fm_mod.py
+++ b/op25/gr-op25_repeater/apps/tx/op25_c4fm_mod.py
@@ -76,6 +76,18 @@ def transfer_function_tx():
xfer.append(pf * hf)
return xfer
+def transfer_function_dmr():
+ xfer = [] # frequency domain transfer function
+ for f in xrange(0, 2881): # specs cover 0 - 2,880 Hz
+ if f < 1920:
+ hf = 1.0
+ else:
+ hf = 0.5 + 0.5 * cos (2 * pi * float(f) / 1920.0)
+ xfer.append(hf)
+ xfer = np.array(xfer, dtype=np.float64)
+ xfer = np.sqrt(xfer) # root cosine
+ return xfer
+
class c4fm_taps(object):
"""Generate filter coefficients as per P25 C4FM spec"""
def __init__(self, filter_gain = 1.0, sample_rate=_def_output_sample_rate, symbol_rate=_def_symbol_rate, span=_def_span, generator=transfer_function_tx):
@@ -106,6 +118,7 @@ class p25_mod_bf(gr.hier_block2):
output_sample_rate=_def_output_sample_rate,
reverse=_def_reverse,
verbose=_def_verbose,
+ generator=transfer_function_tx,
log=_def_log):
"""
Hierarchical block for RRC-filtered P25 FM modulation.
@@ -143,7 +156,9 @@ class p25_mod_bf(gr.hier_block2):
else:
self.polarity = blocks.multiply_const_ff( 1)
- self.filter = filter.interp_fir_filter_fff(self._interp_factor, c4fm_taps(sample_rate=output_sample_rate).generate())
+ self.generator = generator
+
+ self.filter = filter.interp_fir_filter_fff(self._interp_factor, c4fm_taps(sample_rate=output_sample_rate, generator=self.generator).generate())
if verbose:
self._print_verbage()
diff --git a/op25/gr-op25_repeater/lib/dmr_bs_tx_bb_impl.cc b/op25/gr-op25_repeater/lib/dmr_bs_tx_bb_impl.cc
index 3a4986a..3609c58 100644
--- a/op25/gr-op25_repeater/lib/dmr_bs_tx_bb_impl.cc
+++ b/op25/gr-op25_repeater/lib/dmr_bs_tx_bb_impl.cc
@@ -119,17 +119,20 @@ static void encode_embedded(const uint8_t lc[72], uint8_t result[32*4]) {
for (int i=0; i<9; i++) {
csum += load_i(&lc[i*8], 8);
}
+ csum = csum % 31;
+ for (int i=0; i<7; i++) {
+ memcpy(&encode[16*i], &lc[s_index], lengths[i]);
+ s_index += lengths[i];
+ }
for (int i=0; i<5; i++) {
encode[(i+2)*16+10] = (csum >> (4-i)) & 1;
}
for (int i=0; i<7; i++) {
- memcpy(&encode[16*i], &lc[s_index], lengths[i]);
- int acc = load_i(&lc[s_index], 11);
+ int acc = load_i(&encode[16*i], 11);
acc = hamming_16_11[acc];
for (int j=0; j<5; j++){
encode[i*16+j+11] = (acc >> (4-j)) & 1;
}
- s_index += lengths[i];
}
for (int i=0; i<16; i++) {
encode[7*16+i] = (encode[0*16+i] + encode[1*16+i] + encode[2*16+i] + \
@@ -277,12 +280,12 @@ dmr_bs_tx_bb_impl::config()
}
for (;;) {
cp = fgets(line, sizeof(line) - 2, fp1);
+ if (!cp) break;
if (line[0] == '#') continue;
// cach: hashed addr ts1(8) and hashed addr ts2(8)
// emb: (one per ch) cc(4)
// group voice channel user PDU: service options (8), group address(24), source address(24)
// (one per ch)
- if (!cp) break;
if (memcmp(line, "ts1=", 4) == 0)
sscanf(&line[4], "%d", &d_ts[0]);
else if (memcmp(line, "ts2=", 4) == 0)
@@ -416,7 +419,7 @@ dmr_bs_tx_bb_impl::general_work (int noutput_items,
// -1: RC
// 0|1|2|3: segment no. of embedded signalling
{-2, 0, 1, -1, 2, 3},
- {-2, 0, 1, 2, 3, -1}
+ {-1, 2, 3, -2, 0, 1}
};
int nconsumed[2] = {0,0};