www.pudn.com > slow.zip > fsktx.C
/********************************************************* ********************************************************** fskrx.c ********************************************************** **********************************************************/ /* Modem for MIPS AJF January 1995 FSK transmit routines */ #include#include #include #include "modem.h" struct fskinfo { int bps; /* Tx bit rate */ float f0, f1; /* Tx tone freqs */ }; static fskinfo fskinfo[] = { { 300, 1180.0, 980.0 }, /* V21o */ { 300, 1850.0, 1650.0 }, /* V21a */ { 75, 450.0, 390.0 }, /* V23o */ { 1200, 2100.0, 1300.0 }, /* V23a */ }; static sinegen *sgen = NULL; /* statically init'ed */ static float tone0, tone1; static int bitlen; static uchar prevbits; static void putoctet(uchar), pbit(int); global void inittx_fsk(vmode mode) { unless (mode >= 0 && mode < 4) giveup("Bug! bad mode %d in fsk tx init", mode); if (sgen == NULL) sgen = new sinegen(0.0); /* once-only initialization */ tone0 = fskinfo[mode].f0; tone1 = fskinfo[mode].f1; bitlen = SAMPLERATE / fskinfo[mode].bps; /* num. samples in one bit */ prevbits = 0; } global void putasync(int n) /* asynchronous output */ { uint un = (n >= 0) ? (n << 1) | 0x200 : /* add start bit, 1 stop bit */ 0x3ff; /* send mark bits while idle */ until (un == 0) { pbit(un & 1); un >>= 1; } } global void putsync(int x) /* synchronous output */ { if (x == HDLC_FLAG) putoctet(0x7e); else if (x == HDLC_ABORT) putoctet(0x7f); else { uchar n = x; for (int i = 0; i < 8; i++) { pbit(n >> 7); if ((prevbits & 0x1f) == 0x1f) pbit(0); /* bit-stuffing */ n <<= 1; } } } static void putoctet(uchar n) { for (int i=0; i < 8; i++) { pbit(n >> 7); n <<= 1; } } static void pbit(int bit) { sgen -> setfreq(bit ? tone1 : tone0); for (int i = 0; i < bitlen; i++) { float val = sgen -> fnext(); outsample(val); } prevbits = (prevbits << 1) | bit; }