BAUDOT and DTMF tools

This experimental page started off experimenting with the CANVAS for drawing and audio. Ways of generating sinewaves were tried.

more uptodate versions are here

use UPPERCASE and l for letters and f for FIGS / numbers. Start with "lfl "

Slow:

BELL103: BAUDOT reference

"123A456B789C*0#D"

LOOP DISCONNECT experiment, NOTE: Adjust spm to set samples per milli second. - should be 8 but 0.1 makes pulses fit on page.

found digits. "123A456B789C*0#D"

found digits. "123A456B789C*0#D"

Graphs - of X, Y,Z -

Plots different ways of genrating sine waves

* 3 Phase Oscillator and x=x+y*n, y=y-x*n  	
* iir  						
* IIR using Andrew Bateman's version of Geortzel's  Oscillator function analyseSamples3(){
*  Rotating Phasor Oscillator A = A*M, Increment A by M, where M is a Phasor.

filter: Hz start: Hz step Hz samples Hz


| | 300 baud | V.21(low band) 970Hz: Hz 1170Hz: Hz

found

textarea

samples to copy into the other webpages.

Web Audio API: AudioBuffer



/*
*  modem
*/

/* 
*
* Baudot 
*
* I have a string of text, 
*
* I need to convert it to a string of baudot.
* It needs a Shift character added as required.
* if there is a need for a shift insert one
* send a shift every 71 characters.
*
* Put all of that together and we get this:
*
* carrier (for 150ms) + 0 + 11000 + 1 (for 40ms)
*
* 0 - 1800Hz
* 1 - 1400Hz
* START 0
* STOP  1
*
* How do you do the shifts?
* Use a bit to say do shift
* 
*  [ string of ASCII ]--[ convert to  BAUDOT ]--[ UART ]--[ numerically controlled Osc ]--[ audio sample ]
*
*  for each audio sample use nested count down state machines. 
*
*
*/


function asciiToBaudot( letter ){

  var code = letter
  //return( letter1 )
    
  // https://learn.adafruit.com/clue-teletype-transmitter/tty-fundamentals

  // using \B - backspace \n - CR \r - LF \" - "  
  var baudot = "\bE\nA SIU\rDRJNFCKTZLWHYPQOBGnMXVl" +
               "\b3\n- _87\r$4',!:(5\")2=6019?+n./;l"
  
  var code = baudot.search( letter )
  console.log( letter, code )  
  //console.log( letter1, code )
  if ( code > 0 ){ 
   return code 
  } else {
   return 0x04
  }  
}



/*
*  Send Text String as BAUDOT
*
*  This function generates a sequence of samples. 
*  It is assumed that the sampling rate is 8000 samples per second.
*  It could be modified to other sample rates.
*
*  [ String buffer ]---[ ASCII/BAUDOT converter]---[ UART ]---[ modem ]
*  The UART is clocked at the BAUD rate for BAUDOT, which can be 50, 45.45, or 47 BAUD , just to complicate things.
*  The for next loop increments time in steps of 1/SAMPLE Rate
*
*  The modem is implimented using A=A*M 
*  where A is a complex number and M is a Phasor constant.
*
*  There is an M for  a "0" bit and an M for a  "1" bit.
*  A accumulates and the real component is output to the D to A converter.
* 
*  In this code, the modem pulls, the next bit at 8000/BAUDOT
*  The state machine for the UART , pulls a character from the ASCII/BAUDOT converter.
*
*  The ASCII / BAUDOT converter pulls a character from the string to send.
*  If there is no character to send, it should poll the string buffer periodically
*  to see if a character is available for transmission.
*  or every sample, it should poll to see if the CountDown UART is running.
*
*  
*/


Geotzel

The Geotzel Algorithm is a very simple way to generate a sine wave and can be used as a resonator.

  exp( jx )  = cos( x ) +  j sin( x )
  exp( -jx ) = cos( x ) + -j sin( x )
  
   2* cos( x ) = exp( jx ) + exp( -jx )
  j2* sin( x ) = exp( jx ) - exp( -jx )
  

A way of thinking is two contra rotating Phasors, p1 and p2.

p1 and p2 could also be poles.

 A1 = A1*p1 
 A2 = A2*p2
 A  = A1+A2

Consider:-

  [ z^-1 ] is a delay of one sample. 
  
  
            sum
  ip --(+)--|--[ z^-1 ]-+-[ z^-1 ]-+
        |               | b1       | b2
        +---------------+----------+

  simplify it to:-

            sum
  ip --(+)--|--[ B ]-+
        |            |
        +------------+


  sum = ip + B*sum
  sum*( 1 - B ) = ip
  
  
  ip = 1/( 1 - B )
  
  Z transform where Z is normally z^-1 = exp( j 2PI f/Fs )   where T is 1/Fs the samples rate
  
  p1 and p2 are two poles within the unit circle.
  
  p1 = mag*exp( jx )
  p2 = mag*exp( -jx )
  
  p1+p2 = mag*2*cos( x )
  p1*p2 = mag*mag*exp( jx -jx) = mag*mag* exp( 0 ) = mag*mag
  
  
  B = ( 1 + p1 Z )(1 + p2 Z )
    = ( 1 + p1 Z + p2 Z  +p1 Z p2 Z )
    = ( 1 + ( p1+p2 ) Z  +p1*p2*Z*Z )
	= ( 1 + mag*2*cos( x ) * Z + mag*mag * Z * Z)  
	

  ( 1 - B ) = ( 1- ( 1 + mag*2*cos( x ) * Z + mag*mag * Z*Z ) ) 
            = ( 1- mag*2*cos( x ) * z^-1 - mag*mag * z^-2  ) 
  		
  b1 = 	- mag*2*cos( x ) where x = 2PI f/Fs 
  b2 =  - mag*mag 

  NOTE: check for errors!