# PSK demodulator and Doppler

**URL:** <https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848>\
**Category:** GNU Radio\
**Created:** [September 2, 2014, 7:11pm UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848 "2014-09-02T19:11:20Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![addis\_a](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c4cdca/32.png) [@addis\_a](https://www.ruby-forum.com/u/addis_a)\
**Post date:** [September 2, 2014, 7:11pm UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/1 "2014-09-02T19:11:20Z")

</div>

I am trying to develop a satellite ground station using the PSK  
demodulator  
block. This works fine when tuned accurately. However, with low  
satellites  
there is quite a bit of Doppler at VHF / UHF and there is also some  
frequency drift with satellite temperature as it enters or comes out of  
eclipse. This is a problem as the signals are relatively narrow in  
bandwidth  
compared to the Doppler and drift. I am wondering how to track this  
Doppler  
in Gnuradio. I have tried a PLL block and while this works it isn’t  
quite  
right unless the signal is very strong. It can also get fooled by one of  
the  
many spurious signals encountered on the bands.

To some extent the Doppler can be predicted and compensated for, but  
only  
when the orbital parameters are known accurately. Even a few seconds  
error  
at TCA can make quite a difference.

Has anyone solved this one?

Mike

---

<div class="post-metadata">

**Author:** ![vh1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/278dde/32.png) [@vh1](https://www.ruby-forum.com/u/vh1)\
**Post date:** [September 3, 2014, 4:12am UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/2 "2014-09-03T04:12:39Z")

</div>

On Tue, Sep 2, 2014 at 10:09 AM, Mike W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Mike
> 
> * * *
> 
> Discuss-gnuradio mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [Discuss-gnuradio Info Page](https://lists.gnu.org/mailman/listinfo/discuss-gnuradio)

Is there a preamble/training sequence you can search for? If so, you can  
use that to get the initial frequency offset estimate to correct and  
then  
use the PLL to track the fine phase correction.

---

<div class="post-metadata">

**Author:** ![vh1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/278dde/32.png) [@vh1](https://www.ruby-forum.com/u/vh1)\
**Post date:** [September 3, 2014, 8:54am UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/3 "2014-09-03T08:54:16Z")

</div>

Hi Colin,

Not really, though there is an AX25 style header. Far from ideal  
01111110 flags.

Mike

From: Colby B. [[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)]  
Sent: 03 September 2014 03:11  
To: Mike W.  
Cc: GNU Radio D.ion  
Subject: Re: [Discuss-gnuradio] PSK demodulator and Doppler

On Tue, Sep 2, 2014 at 10:09 AM, Mike W. \<removed\_email\_address@domain.invalid  
[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) \> wrote:

I am trying to develop a satellite ground station using the PSK  
demodulator block. This works fine when tuned accurately. However, with  
low satellites there is quite a bit of Doppler at VHF / UHF and there is  
also some frequency drift with satellite temperature as it enters or  
comes out of eclipse. This is a problem as the signals are relatively  
narrow in bandwidth compared to the Doppler and drift. I am wondering  
how to track this Doppler in Gnuradio. I have tried a PLL block and  
while this works it isn’t quite right unless the signal is very strong.  
It can also get fooled by one of the many spurious signals encountered  
on the bands.

To some extent the Doppler can be predicted and compensated for, but  
only when the orbital parameters are known accurately. Even a few  
seconds error at TCA can make quite a difference.

Has anyone solved this one?

Mike

* * *

Discuss-gnuradio mailing list  
removed\_email\_address@domain.invalid [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[https://lists.gnu.org/mailman/listinfo/discuss-gnuradio](https://lists.gnu.org/mailman/listinfo/discuss-gnuradio)

Is there a preamble/training sequence you can search for? If so, you can  
use that to get the initial frequency offset estimate to correct and  
then use the PLL to track the fine phase correction.

---

<div class="post-metadata">

**Author:** ![vh1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/278dde/32.png) [@vh1](https://www.ruby-forum.com/u/vh1)\
**Post date:** [September 3, 2014, 11:13am UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/4 "2014-09-03T11:13:41Z")

</div>

My solution involved the frequency translating block and a third party  
application. As part of the initial channel filter, I set the the  
“Center  
Frequency” attribute to -40000+fftshift\*rx\_shift\_factor (assuming my LO  
tuned to +40 KHz from the carrier). The satellite tracking program,  
PREDICT, provides a Doppler shift calculation assuming a 100 MHz  
carrier.  
rx\_shift\_factor is the satellite carrier frequency divided by 100 MHz. I  
then polled PREDICT, which provides a UDP server interface and then in  
Python called set\_fftshift method on the flowgraph object generated by  
gnuradio-companion. In turn, this would update the taps of the FIR  
filter  
to provide a desired frequency shift.

As for temperature drift, I assumed that with a strong enough signal,  
the  
inbuilt Costas loop would be able to bring the signal back to baseband.

The drawback of this solution is that it’s not fully contained within  
gnuradio-companion, and like you said, requires the orbital elements to  
be  
known. One solution that uses the PLL block is here:  
[https://www.cgran.org/wiki/ESTCube-1Receiver](https://www.cgran.org/wiki/ESTCube-1Receiver)

---

<div class="post-metadata">

**Author:** ![vh1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/278dde/32.png) [@vh1](https://www.ruby-forum.com/u/vh1)\
**Post date:** [September 3, 2014, 3:05pm UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/5 "2014-09-03T15:05:16Z")

</div>

On Wed, Sep 3, 2014 at 5:12 AM, Vanush V. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> As for temperature drift, I assumed that with a strong enough signal, the  
> inbuilt Costas loop would be able to bring the signal back to baseband.
> 
> The drawback of this solution is that it’s not fully contained within  
> gnuradio-companion, and like you said, requires the orbital elements to be  
> known. One solution that uses the PLL block is here:  
> [https://www.cgran.org/wiki/ESTCube-1Receiver](https://www.cgran.org/wiki/ESTCube-1Receiver)

It might not be completely contained in GRC, but it’s a clever solution.

Another thing to look into is the fll\_band\_edge block. This will only  
work,  
however, if the signal is pulse-shaped. Specifically with an RRC filter  
by  
design, but we can modify it for other pulse shapes as well. This only  
does  
coarse frequency correction, but it’s lock in bandwidth is much wider  
than  
that of the Costas loop block. You’d still want to follow this up with  
the  
Costas loop for fine frequency and phase tracking.

One thing, too, is that this block is fairly expensive computationally.  
It’s calculating two FIR filters, which should be replaced by fast  
convolution filters. And I think that we could even combine this into a  
single filter operation.

Tom

---

<div class="post-metadata">

**Author:** ![vh1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/278dde/32.png) [@vh1](https://www.ruby-forum.com/u/vh1)\
**Post date:** [September 3, 2014, 4:32pm UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/6 "2014-09-03T16:32:28Z")

</div>

Using predict is a similar solution to what I do in simple\_ra for  
“fringe stopping”, except that it’s all contained within the same chunk  
of

Python, using a “helper” function that’s tied to a every-5-seconds  
polling loop. The helper function calculates the required phase

rotation, given a number of input parameters relating to the  
observation.

On 2014-09-03 09:03, Tom R. wrote:

> Hi Colin,
> 
> * * *
> 
> Discuss-gnuradio mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [Discuss-gnuradio Info Page](https://lists.gnu.org/mailman/listinfo/discuss-gnuradio) [1]
> 
> Is there a preamble/training sequence you can search for? If so, you can use  
> that to get the initial frequency offset estimate to correct and then use the PLL  
> to track the fine phase correction.
> 
> * * *
> 
> Discuss-gnuradio mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [Discuss-gnuradio Info Page](https://lists.gnu.org/mailman/listinfo/discuss-gnuradio) [1]

* * *

Discuss-gnuradio mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[Discuss-gnuradio Info Page](https://lists.gnu.org/mailman/listinfo/discuss-gnuradio) [1]

* * *

Discuss-gnuradio mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[Discuss-gnuradio Info Page](https://lists.gnu.org/mailman/listinfo/discuss-gnuradio) [1]

Links:

---

<div class="post-metadata">

**Author:** ![vh1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/278dde/32.png) [@vh1](https://www.ruby-forum.com/u/vh1)\
**Post date:** [September 4, 2014, 12:23am UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/7 "2014-09-04T00:23:28Z")

</div>

Just curious, any estimate on how much temperature drift in PPM you are  
getting?

Thanks,  
Lou  
KD4HSO

Mike W. wrote

> …and there is also some  
> frequency drift with satellite temperature as it enters or comes out of  
> eclipse.

–  
View this message in context:  
[http://gnuradio.4.n7.nabble.com/PSK-demodulator-and-Doppler-tp50185p50210.html](http://gnuradio.4.n7.nabble.com/PSK-demodulator-and-Doppler-tp50185p50210.html)  
Sent from the GnuRadio mailing list archive at [Nabble.com](http://Nabble.com).

---

<div class="post-metadata">

**Author:** ![vh1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/278dde/32.png) [@vh1](https://www.ruby-forum.com/u/vh1)\
**Post date:** [September 3, 2014, 5:57pm UTC](https://www.ruby-forum.com/t/psk-demodulator-and-doppler/231848/8 "2014-09-03T17:57:54Z")

</div>

I use predict, the xmlrpc server, and it bit of glue code for twiddling  
the FIR filter’s offset for my Funcube and NOAA receivers to account  
for doppler.

Allows me to have tighter BPFs (well LPF’s really), although does mean  
I need to remember to update the TLE’s from time to time!

Biggest problem I have is Funcube-1’s beacon has thermal drift as  
she comes out of eclipse that goes the opposite way…Been trying  
to use a Freq\_Det block to help, but not had the time to experiment  
recently

Iain
