• Stars
    star
    178
  • Rank 214,324 (Top 5 %)
  • Language
    Java
  • License
    BSD Zero Clause L...
  • Created almost 13 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Decode SSTV encoded audio signals to images
robot36 - encode and decode images using SSTV in Robot 36 mode
Written in 2011 by <Ahmet Inan> <[email protected]>
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

More Repositories

1

LDPC

Playing with Low-density parity-check codes
C++
81
star
2

framebuffer

access Linux framebuffer as draw.Image
Go
27
star
3

pcspkr

listen to pcm sound over the internal pc speaker
C
27
star
4

mpss-modules

This is a port of the mic module for the Intel Xeon Phi Coprocessor for linux-4.1
C
16
star
5

qsstv

Receiving and transmitting of SSTV and HAMDRM (DSSTV)
C++
15
star
6

FEC

RS and BCH forward error correction
C++
10
star
7

fft

Mixed-Radix DIT FFT in C++11
C++
10
star
8

spectrum

quick and dirty spectrum analyzer
C
9
star
9

polar

Playing with successive cancellation decoding of polar codes
C++
8
star
10

sn76489

sn76489 emulator for vgm
C
7
star
11

xrandrd

try to do the right thing without user interaction if a display gets (dis-)connected
C
6
star
12

dwt

playing with dwt, lossy and lossless image compression
C
5
star
13

umpi

intentionally small and simple MPI implementation
C++
4
star
14

lqt

Playing with lossless image compression based on the quadtree data structure
C
4
star
15

gsm

encode and decode message in GSM 03.38
C
3
star
16

i2s_mic

Playing with the INMP441 I2S microphone on the Raspberry Pi Pico
C
3
star
17

vhdl

FPGA experiments with VHDL
VHDL
2
star
18

sos

SDL OpenGL Skeleton
C
2
star
19

panorama

downsample spherical panorama images
C
2
star
20

webgl

some experiments with GLSL in WebGL
HTML
2
star
21

erasure

Cauchy Reed Solomon Erasure Coding
C
2
star
22

svd

Playing with lossy image compression based on the singular value decomposition
C
2
star
23

dft

playing with dft and radix-2 fft
C
2
star
24

dct

playing with dct and lossy image compression
C
2
star
25

contest

Contesting DSP::FFT with other implementations
C++
1
star
26

whitepoint

Find brightest RGB value closest to d65 on Linux framebuffer
Go
1
star
27

mandelbrot

visualize Mandelbrot set using SIMD
C
1
star
28

timetable

create timetable from spreadsheet using lpsolve
Python
1
star
29

sparsematrix

GF(2) sparse matrix fun
Go
1
star
30

fir

just playing around with fir filters
C
1
star
31

sparse

sparse file encoding, decoding and patching
C
1
star
32

38kHz

IR sender / receiver with CRC8 using ATmega328p
C
1
star
33

sphere

tessellate a sphere through subdivision of triangles
C
1
star
34

ieee754

some functions missing from c
C
1
star
35

spatial

spatial search acceleration using morton codes
C++
1
star
36

img

Playing with lossy image compression based on tile prediction and the discrete wavelet transformation
C
1
star