<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lloyd Rochester's Geek Blog</title><link>https://lloydroc.github.io/psk31/</link><description>Recent content on Lloyd Rochester's Geek Blog</description><generator>Hugo</generator><language>en</language><copyright>Copyright © 2025, Lloyd Rochester.</copyright><lastBuildDate>Sat, 18 Apr 2020 00:00:00 +0000</lastBuildDate><atom:link href="https://lloydroc.github.io/psk31/index.xml" rel="self" type="application/rss+xml"/><item><title>PSK31 Convolutional Decoder Implementation in C</title><link>https://lloydroc.github.io/psk31/cnvdec/</link><pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate><guid>https://lloydroc.github.io/psk31/cnvdec/</guid><description>&lt;h1 id="psk31-convolutional-decoder">PSK31 Convolutional Decoder&lt;/h1>
&lt;p>In my humble opinion decoding a convolutionally encoded PSK31 output stream is the most challenging part of all. Decoding is also where all the magic happens. The Viterbi Decoder corrects the erroneous bits and allows reception of the intended bit stream.&lt;/p>
&lt;p>If this is the first time you&amp;rsquo;ve heard of a &lt;a href="https://en.wikipedia.org/wiki/Viterbi_decoder">Viterbi Decoder&lt;/a> please look at the former link from Wikipedia as well as these great examples that are in links below. What these examples allow you do is better visualize the entire state machine since they have a very small value for &lt;code>K&lt;/code> and only &lt;code>4&lt;/code> states. What we have here in QPSK31 is &lt;code>32&lt;/code> states and it makes it a bit inconvenient to use this as the first example to learn Viterbi Decoding. Also, be very comfortable with &lt;a href="https://lloydroc.github.io/psk31/cnvenc/">PSK31 Convolutional Encoding&lt;/a> and the state machine it uses, the generator functions, shift register and process to encode a bit stream with the PSK31 convolutional encoder.&lt;/p></description></item><item><title>PSK31 Convolutional Encoder implementation in C</title><link>https://lloydroc.github.io/psk31/cnvenc/</link><pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate><guid>https://lloydroc.github.io/psk31/cnvenc/</guid><description>&lt;h1 id="hahahugoshortcode109s0hbhb">PSK31 Convolutional Encoder implementation in C&lt;/h1>
&lt;h1 id="psk31-convolution-encoding">PSK31 Convolution Encoding&lt;/h1>
&lt;p>Convolutional Codes are often charactarized by three aspects:&lt;/p>
&lt;ol>
&lt;li>&lt;code>n&lt;/code> Base Code Rate - Number of bits into the encoder&lt;/li>
&lt;li>&lt;code>k&lt;/code> Output Symbol Rate - Number of bits out for an input&lt;/li>
&lt;li>&lt;code>K&lt;/code> Memory Depth&lt;/li>
&lt;/ol>
&lt;p>For QPSK31 we have &lt;code>[n,k,K] = [1,2,5]&lt;/code>. We give the encoder 1-bit of input, out comes 2-bits, and 5-bits of input are stored in our shift register. For the 2-bits of output 1-bit is In-Phase and the other is Quadrature. Let&amp;rsquo;s look at a diagram that allows us to envision &lt;code>[n,k,K]&lt;/code>.&lt;/p></description></item><item><title>Root Raised Cosine Filter in C</title><link>https://lloydroc.github.io/psk31/rrc/</link><pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate><guid>https://lloydroc.github.io/psk31/rrc/</guid><description>&lt;h1 id="hahahugoshortcode110s0hbhb">Root Raised Cosine Filter in C&lt;/h1>
&lt;h1 id="root-raised-cosine-filtering">Root Raised Cosine Filtering&lt;/h1>
&lt;p>The PSK31 Standard uses &lt;a href="https://en.wikipedia.org/wiki/Root-raised-cosine_filter">Root Raised Cosine Filters&lt;/a> as a matched filter. Our PSK31 signal is convolved by the Root Raised Cosine waveform to mimimize Inter-Symbol Interference. For this project we can easily compute the RRC filter and then convolve it with our output stream. For the computation of the RRC we need a couple of constants specific to the PSK31 standard.&lt;/p></description></item></channel></rss>