Improvements made to GMSK demod

All-

I’ve made some improvements to the built-in GMSK demodulator, based
mostly
on Simon & Wang’s “Differential Detection of Gaussian MSK in a Mobile
Radio
Environment”. Also see “Differential Detection of GMSK Using Decision
Feedback”, Yongacoglu, A. Makrakis, D. Feher, K.

The intermediate steps I took were as follows:

-Place a low-pass filter in front of the clock recovery block. Optimal
bandwidth is a function of both Eb/N0 and xmitter BT product.
-Remove the quadrature demod (which was looking at change in phase over
1
sample). Replace with blocks to look at change in phase over 1 SYMBOL.
(this
is a true 1 bit differential detector)
-Instead of 1 bit differential detector, look at change in phase over 2
symbols (2 bit differential detector). (requires diff encode on xmit
side).
This produces an asymmetric eye diagram, so you have to bias it a little
bit
prior to clock recovery.

Initial Bit Error Rate results (just to get an idea of relative
performance):
(xmit BT=0.25, 8 samp/sym, same input to all demods, at a certain Eb/N0)

Original, unchanged GMSK demod:
BER=0.38

Original + pre CR filter:
BER=0.0090

True 1-bit diff detect + pre CR filter:
BER=0.0056

True 2-bit diff detect + pre CR filter:
BER=0.00076

Is this something that people would like to see checked in? If so, how’s
the
best way to do so…via a developer branch?

Tom T.- thanks for pointing the way to some of this stuff.

-Steven

Steven-

Replace with blocks to look at change in phase over 1 SYMBOL. (this is a true 1 bit
BER=0.38
Is this something that people would like to see checked in? If so, how’s the best
way to do so…via a developer branch?

The BER improvement looks outstanding. I would think this should be an
excellent
contribution.

-Jeff

On Mon, Oct 15, 2007 at 04:28:01PM -0400, Steven C. wrote:

bandwidth is a function of both Eb/N0 and xmitter BT product.
(xmit BT=0.25, 8 samp/sym, same input to all demods, at a certain Eb/N0)
How does it do with say, 2 samples/sym ?

BER=0.00076

Is this something that people would like to see checked in? If so, how’s the
best way to do so…via a developer branch?

Tom T.- thanks for pointing the way to some of this stuff.

-Steven

Definitely interested in having this in the code base.
At least until the dust settles, we’d want it as an addition, not a
replacement of the existing code.

I’ll send you the copyright assignment stuff in the next message.

Thanks!
Eric

On 10/15/07, Eric B. [email protected] wrote:

How does it do with say, 2 samples/sym ?

A quick run @ 2 samp/sym gave:
Old recv…
xcorr offset: 8
num bits compared: 499987
num bit errors: 1275
BER: 0.00255006630172

Old recv plus…
xcorr offset: 16
num bits compared: 499979
num bit errors: 1270
BER: 0.00254010668448

One bit dd recv…
xcorr offset: 17
num bits compared: 499979
num bit errors: 547
BER: 0.00109404594993

Two bit dd recv…
xcorr offset: 17
num bits compared: 499979
num bit errors: 50
BER: 0.000100004200176

So we see that for lower samp/sym, the effect of adding the pre-clock
recovery filter is not as great (not surprising, since the signal takes
up a
larger percentage of the BW). You still get good gains from the changes
made
to the differential detector, however. The lower the xmit BT, the more
improvement you get from switching to a 2 bit diff detect, as it opens
the
eye diagram by a comparatively larger amount.
I have yet to tweak filter design or threshold bias amount, so
performance
can potentially get a little better.

I will tidy up the code and try to submit to a branch ASAP.

Is it a no-no to submit any code that depends on 3rd party modules
(scipy,
pylab)? I would make the core demod not require these, of course, but
some
of my post-analysis / debug code uses these 2 modules.

-Steven

Hi,

What exactly does it mean to “look at change in phase over 1 SYMBOL”?
Is it just measuring the phase difference of two samples (separated by
the number of samples in one symbol) and then subtracting the phase
rotation of the center frequency across one symbol? Or does your
algorithm look at all the samples in-between too?

Can you please give a brief explanation?

Thanks,
Hans

----- Original Message -----
From: Steven C.
To: gnuradio mailing list
Sent: Monday, October 15, 2007 1:28 PM
Subject: [Discuss-gnuradio] Improvements made to GMSK demod

All-

I’ve made some improvements to the built-in GMSK demodulator, based
mostly on Simon & Wang’s “Differential Detection of Gaussian MSK in a
Mobile Radio Environment”. Also see “Differential Detection of GMSK
Using Decision Feedback”, Yongacoglu, A. Makrakis, D. Feher, K.

The intermediate steps I took were as follows:

-Place a low-pass filter in front of the clock recovery block. Optimal
bandwidth is a function of both Eb/N0 and xmitter BT product.
-Remove the quadrature demod (which was looking at change in phase
over 1 sample). Replace with blocks to look at change in phase over 1
SYMBOL. (this is a true 1 bit differential detector)
-Instead of 1 bit differential detector, look at change in phase over
2 symbols (2 bit differential detector). (requires diff encode on xmit
side). This produces an asymmetric eye diagram, so you have to bias it a
little bit prior to clock recovery.

Initial Bit Error Rate results (just to get an idea of relative
performance):
(xmit BT=0.25, 8 samp/sym, same input to all demods, at a certain
Eb/N0)

Original, unchanged GMSK demod:
BER=0.38

Original + pre CR filter:
BER=0.0090

True 1-bit diff detect + pre CR filter:
BER=0.0056

True 2-bit diff detect + pre CR filter:
BER=0.00076

Is this something that people would like to see checked in? If so,
how’s the best way to do so…via a developer branch?

Tom T.- thanks for pointing the way to some of this stuff.

-Steven


This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.



Discuss-gnuradio mailing list
[email protected]
Discuss-gnuradio Info Page


No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.488 / Virus Database: 269.14.11/1071 - Release Date:
10/15/2007 6:48 AM

On 10/16/07, Hans G. [email protected] wrote:

Hi,

What exactly does it mean to “look at change in phase over 1 SYMBOL”? Is
it just measuring the phase difference of two samples (separated by the
number of samples in one symbol) and then subtracting the phase rotation of
the center frequency across one symbol?

Yep, you got it. No fancy algorithms. One way to do it in block form is
something like this (for 2 bit diff detect):

    self.kc = gr.kludge_copy(gr.sizeof_gr_complex)
    self.delay = gr.delay(gr.sizeof_gr_complex,

2self._samples_per_symbol) #2T delay
self.conj = gr.conjugate_cc()
self.mult = gr.multiply_cc()
self.c2f = gr.complex_to_float()
self.sub = gr.add_const_ff(-self._decision_threshold)
sym_per_sec = float(samp_per_sec) / float(samples_per_symbol)
pre_cr_filt_bw = sym_per_sec
pre_cr_filt_bt
pre_cr_filt_taps = gr.firdes.low_pass(1.0, samp_per_sec,
pre_cr_filt_bw, pre_cr_filt_tr*samp_per_sec, gr.firdes.WIN_HAMMING)

    self.pre_cr_filt = gr.fir_filter_fff(1, pre_cr_filt_taps)

    # the clock recovery block tracks the symbol clock and resamples 

as
needed.
# the output of the block is a stream of soft symbols (float)
self.clock_recovery = gr.clock_recovery_mm_ff(self._omega,
self._gain_omega,
self._mu,
self._gain_mu,

self._omega_relative_limit)

    # slice the floats at 0, outputting 1 bit (the LSB of the output

byte) per sample
self.slicer = gr.binary_slicer_fb()

    # Connect & Initialize base class
    self.connect(self, self.kc, self.delay, self.conj, (self.mult, 

0))
self.connect(self.kc, (self.mult, 1))
self.connect(self.mult, self.c2f)
self.connect((self.c2f, 0), self.pre_cr_filt, self.sub,
self.clock_recovery, self.slicer, self)

----- Original Message -----