RTTY decoded, by ON4CKO

Using Direct Digital Synthesis with an AD9850 DDS board, I made a RTTY transmitter using Python and a GreatFET device for General Port I/O on Windows.

The RTTY signal was fed back into the computer via an inductive coupling on the antenna, via a Kenwood HF TS-570D receiver and was decoded back on the computer using MINIMODEM - a very flexibel audio signal decoder.

The encoder- to decoder signal path can be seen below (click to start video).


REMARK: RTTY uses 45 baud. My setup was a bit too slow because I used python to interface the GreatFET pins. By programming GreatFET firmware, or, use a raspberry with integrated GPIO, a baudrate higher than 16.5 bits/second should be possible (but, minimodel can decode slower speeds).

Source code

Download here the python script.

SNIPPET 1: Send a RTTY bit by sending an UPDATE pulse ('pFQ_UD') via GreatFET to the AD9850. This pulse should be send before and after the desired frequency and phase send on the serial DATA pin.

def setFreq( f):
 # START UPDATE
 pulsePin(pFQ_UD)
 freq = int((f*(2**32))/CLKIN)

 phase = 0   
 phas = int ((phase*(2**5))/360)
 
  # FREQUENCY  
 for i in range (0,34):
  pDATA.write( freq & 0x01)
  pulsePin(pW_CLK)
  freq = freq >> 1
   
 pDATA.write( 0x00 & 0x01)
 pulsePin(pW_CLK)

  #PHASE  
 for j in range (0,4):
  pDATA.write( phas & 0x01)
  pulsePin(pW_CLK)
  phas = phas >> 1

 pDATA.write( 0x00 & 0x01)
 pulsePin(pW_CLK)

 # STOP UPDATE
 pulsePin(pFQ_UD)
SNIPPET 2: The main loop of RTTY.py is of course sending the MARK(0) and SPACE(1) bits; An excellent source is by W7AY.
 
    def setRTTYBit( bit):
     # The recommended audio frequencies are 2125 Hz for the MARK audio
     #  frequency and 2295(+170) Hz for the SPACE audio frequency. 
     if bit==0:
      setFreq( TXFREQUENCY + DELTAFREQ)  # SPACE
     else:
      setFreq( TXFREQUENCY )  # MARK         
            
setBit(1)  #   IDLE is MARK
s= "ON4CKO ON4CKO CQ CQ PSE K"
bitstring  = codext.encode( s, 'baudot-ccitt2')
print("TO DO:", s)
i=0
for c in [(bitstring[i:i+5][::-1]) for i in range(0, len(bitstring), 5)]:
 try:
  print( "%s(%c)"%(c, s[i]) ,end=" ")
  sys.stdout.flush()
 except:
  pass
 setBit( 0)  # 1 (start)
 for b in c: # 2,3,4,5,6
  
  if b=='0':
    setBit( 0) # 7
  else:
    setBit( 1)
    
 setBit(1) # 7 (2 x stop bit is MARk for amateur RTTY) 
 setBit(1) # 8 MARK
 i = i + 1   
 


Figure: Another test using an sample rtty recording from wikipedia