On 10/16/07, Hans Glitsch <address@hidden> 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, 2*self._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 -----
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 Tsou- 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
address@hidden
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio
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
_______________________________________________
Discuss-gnuradio mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio