encode and decode images using SSTV in Robot 36 mode
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore also .gitignore generated gnuplot files Oct 29, 2011
COPYING changed license to CC0 Sep 8, 2011
Makefile fixed compilation for some distributions Jan 19, 2015
README updated image links Jan 20, 2015
alsa.c rearranged and fixed alsa init code Feb 23, 2015
alsa.h dont hide structs behind typedefs Jun 1, 2012
buffer.c oops: return pointer to last element, not to next Sep 18, 2012
buffer.h redesigned ddc, replaced delay lines with common buffer Sep 14, 2012
ddc.c normalize phasor after each step Nov 26, 2014
ddc.h redesigned ddc, replaced delay lines with common buffer Sep 14, 2012
debug.c removed unused y_pixel_x and uv_pixel_x Dec 15, 2013
decode.c do lerp of Y' in linear space. Nov 10, 2014
encode.c renamed linear_srgb to srgb and srgb_linear to linear Jan 28, 2014
img.c dont hide structs behind typedefs Jun 1, 2012
img.h dont hide structs behind typedefs Jun 1, 2012
mmap_file.c removed extra white space Sep 30, 2012
mmap_file.h changed license to CC0 Sep 8, 2011
pcm.c dont hide structs behind typedefs Jun 1, 2012
pcm.h dont hide structs behind typedefs Jun 1, 2012
ppm.c dont hide structs behind typedefs Jun 1, 2012
ppm.h dont hide structs behind typedefs Jun 1, 2012
sdl.c dont hide structs behind typedefs Jun 1, 2012
sdl.h dont hide structs behind typedefs Jun 1, 2012
smpte.ppm remade smpte.ppm again: sharp edges this time. Sep 2, 2013
utils.h make lerp more stable Oct 22, 2012
wav.c dont hide structs behind typedefs Jun 1, 2012
wav.h dont hide structs behind typedefs Jun 1, 2012
window.c changed license to CC0 Sep 8, 2011
window.h changed license to CC0 Sep 8, 2011
yuv.c renamed linear_srgb to srgb and srgb_linear to linear Jan 28, 2014
yuv.h renamed linear_srgb to srgb and srgb_linear to linear Jan 28, 2014

README

robot36 - encode and decode images using SSTV in Robot 36 mode
Written in 2011 by <Ahmet Inan> <xdsopl@googlemail.com>
To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.

robot36 is written from scratch just for the fun of it.
i have no ham radio and started this project out of curiosity how people are able to encode or decode FM in very good quality just using an DSP with DAC or ADC.

Theory of operation:
Robot 36 is one mode of many SSTV modes which transfers images using the luminance / chrominance information of the image.
Like with other SSTV modes, the information is send using FM and needs only 800hz bandwidth for data (1500hz-2300hz) and 200hz for control (1100hz-1300hz).
Robot 36 transfers 320x240 color images in around 36 seconds, hence the name Robot 36.
More information about Robot 36 mode and SSTV can be found on the Internet.
I suggest finding and reading the wonderful "Dayton Paper" of JL Barber (N7CXI).

encode:
Here we simply change the rate of an complex oscillator according to the Y, U and V values we get from the input image and only use the real part of the oscillator as output.

decode:
FM demodulation is not so easy. After many frustrating attempts to emulate hardware and playing around with zero cross detection and Phase-locked loop detectors i finally found a very nice way to do it:
Using Hilbert Transformation we get a complex valued function from a real valued function, which we differentiate in time using polar coordinates and getting the instantaneous frequency from the argument.
Doing Hilbert Transform in discrete space for this purpose is also know as Digital Down Conversion.
my DDC consists of an complex valued decimating ideal fir filter using Kaiser window at its input and an complex oscillator mixer at its output.
You can find a lot more about DDC's and FM demodulation on the Internet.
I Suggest finding and reading the enlightening "Virtual Radios" Paper of Vanu Bose, Michael Ismert, Matt Welborn, and John Guttag.
You should also look at GNU Radio: http://gnuradio.org/ and at the invaluable information at dspGuru: http://www.dspguru.com/

smpte.ppm is converted from http://en.wikipedia.org/wiki/File:SMPTE_Color_Bars.svg

compile everything:
# make

test encode and decode using smpte.ppm and various rates:
# make test

remove generated files:
# make clean

listen to default alsa device and write out ppm images with %F-%T.ppm as file name:
# ./decode

listen to alsa device plughw:0,0 and write out ppm images with %F-%T.ppm as file name:
# ./decode plughw:0,0

listen to default alsa device and show image in sdl window:
# ./decode default sdl:

read from wav file input.wav and write out to ppm image output.ppm:
# ./decode input.wav output.ppm

encode ppm image input.ppm to output.wav using rate of 40000Hz
# ./encode input.ppm output.wav 40000

encode ppm image input.ppm and write out to default alsa device
# ./encode input.ppm

last but not least, have fun with a debugging session:
# make fun

now ppm files have debugging pixels and show raw data like this:
https://sites.google.com/site/xdsopl/home/robot36_raw_image.png

you can look at the signal analysis using gnuplot:
# gnuplot
gnuplot> load "8000.gnu"

this should give you an output like this:
https://sites.google.com/site/xdsopl/home/robot36_signal_analysis.png