<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Telecommunication on Lloyd Rochester's Geek Blog</title><link>https://lloydroc.github.io/categories/telecommunication/</link><description>Recent content in Telecommunication 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/categories/telecommunication/index.xml" rel="self" type="application/rss+xml"/><item><title>Implementing FIR Filters in C</title><link>https://lloydroc.github.io/post/c/fir-filter/</link><pubDate>Mon, 19 Aug 2019 16:00:21 +0000</pubDate><guid>https://lloydroc.github.io/post/c/fir-filter/</guid><description>&lt;h1 id="hahahugoshortcode23s0hbhb">Implementing FIR Filters in C&lt;/h1>
&lt;p>Implementing FIR filters in C is much easier if we make use of the static variables declared in our functions. In this blog post we will create some simple example FIR filters, and get their impulse response. To understand this post you will have to have the basic theory of FIR filtering down.&lt;/p>
&lt;h3 id="fir-filter-implementation">FIR Filter Implementation&lt;/h3>
&lt;p>There are a lot of ways to implement a FIR filter in C. The method provided makes the implementation simple because we can simply put the last time sample into the filter and the filtered result will come out. The filter function itself will handle the delay line of the time samples. It&amp;rsquo;s a bit abstract so let&amp;rsquo;s take an example of just creating a delay line of samples. Then later we&amp;rsquo;ll add in the FIR filter coefficients.&lt;/p></description></item><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><item><title>Viterbi Error Correction</title><link>https://lloydroc.github.io/post/telecom/viterbi-error-correction/</link><pubDate>Sat, 06 Oct 2018 08:30:48 +0000</pubDate><guid>https://lloydroc.github.io/post/telecom/viterbi-error-correction/</guid><description>&lt;h1 id="hahahugoshortcode83s0hbhb">Viterbi Error Correction&lt;/h1>
&lt;p>I&amp;rsquo;ve built a little PSK31 convolutional &lt;a href="https://lloydroc.github.io/psk31/cnvenc/">encoder&lt;/a> and &lt;a href="https://lloydroc.github.io/psk31/cnvdec/">decoder&lt;/a> and originally wanted to make a graph showing the error correction capabilities as a function of encoder output length and number of bit errors into the decoder. Making a long story short; I couldn&amp;rsquo;t devise a good method of creating this graph and stuck to hand making error cases to see the performance of the decoder. Note, the quantization for both the encoder and decoder are hard metrics using the Hamming Distance which doesn&amp;rsquo;t perform as good as soft metrics. First, let&amp;rsquo;s define the convolution encoder input and output.&lt;/p></description></item><item><title>PSK31</title><link>https://lloydroc.github.io/post/telecom/psk31/</link><pubDate>Sun, 16 Sep 2018 14:40:48 +0000</pubDate><guid>https://lloydroc.github.io/post/telecom/psk31/</guid><description>&lt;h1 id="hahahugoshortcode82s0hbhb">PSK31&lt;/h1>
&lt;p>A little side project - that actually turned in to a larger project is an implementation of the &lt;a href="http://www.arrl.org/psk31-spec">PSK31 Specification&lt;/a>. I&amp;rsquo;m hoping to create an Open Source Project likely called &lt;code>OpenPSK31&lt;/code> or something similar. This specification could use some improvements with all the advancements we have in computational power and software over years since the specification was created in 1998. I&amp;rsquo;ve created a place on this site for &lt;a href="https://lloydroc.github.io/psk31">PSK31&lt;/a> to document the project I&amp;rsquo;ve done. Not all the content is there yet, but I&amp;rsquo;ll be blogging about the updates as they come in. A fully working PSK31 system has a lot of moving parts and I hope to power through and get something that can both send and receive PSK31. The focus will be on the QPSK31 part of the specification so the convolutional encoding and decoding is used to correct bit errors.&lt;/p></description></item></channel></rss>