Source: kpsk/modes/psk31-coder.h


Annotated List
Files
Globals
Hierarchy
Index
/* PSK31 -- Viterbi and Varicode encoder / decoder
 * based on PSK31-Code by Andrew Senior, G0TJZ
 * (C) 1998,1999 Hansi Reiser, DL9RDZ
 * subject to GPL -- see LICENSE for details
 */

#ifndef __PSK31_CODER_INCLUDED
#define __PSK31_CODER_INCLUDED

#ifndef CMPLX_DEFINED
#define CMPLX_DEFINED
typedef struct {
        double x,y;
} cmplx;
#endif

/* codeword-flags */
#define CODE_USE_QPSK 0x010000       /* use qpsk for this codeword flag */
#define CODE_TONE_ON  0x020000       /* tone on flag */
#define CODE_CW_ECHO  0x040000       /* cw char for echo only */
#define CODE_PLAIN    0x080000       /* not yet encoded byte */

/* Send- and Echo-Char flags. Also used in the codeword buffer */
#define TX_MODE       0x200000
#define TXM_BPSK      0x000000
#define TXM_BPSK_L    0x000001
#define TXM_QPSK      0x000002
#define TXM_QPSK_L    0x000003
#define TXM_LSB       0x000001
#define TXM_CW        0x000004       // setting CW or TUNE does not change
#define TXM_TUNE      0x000008       // QPSK or LSB setting!

#define TX_FREQ       0x400000       /* 3xxxxx xx 0.01Hz */
#define TX_START      0x100001       /* start new transmission */
#define TX_END        0x100002       /* indicate end of transmission */
#define TX_URGENT   0x40000000       /* flag to execute cmds immediately*/
#define TX_DUMMY    0x001FFFFF       /* "unused" codeword */

#define NO_CHAR       0x800000
#define TX_BUSY       0x800001
#define TX_ERROR      0x800002

#define EMPTY_SAMPLE  0x100000


/* Viterbi and Varicode encoding and decoding funktions */
class psk31_coder {
private:
	/* Varicode data tables */
	static int hallo;
	static int decotab[2048];
	static int encotab[256];
	/* Convolutional coder/Viterbi coder data */
	static unsigned char symbols[32];
	static const unsigned char poly1 = 0x19, poly2 = 0x17;

	int qpsk, lsb;
	struct state {
		float dist;
		int last_abs_phase;
		long estimate;
	};
	int lastphase;

	struct state states[16];     /* QPSK decoder trellis */
	float agc,ampl;
	int vlerror, rxreg;   /* Varicode decoder state */

	unsigned int encode_qpsk(unsigned int sreg);
	unsigned int encode_bpsk(unsigned int sreg);
	int decode_qpsk(cmplx rxsymbol);
	int decode_bpsk(cmplx rxsymbol);
	float x_distance(cmplx rxsymb, int lastphase, int delta);
	int decode_varicode(int bit);
	static unsigned char parity(unsigned char u);
public:
	void prime_decoder();
	static int init_tables();
	psk31_coder() { 
		agc=ampl=vlerror=rxreg=0; lastphase=0; 
		qpsk=lsb=0;
		for(int i=0; i<16; i++) {
			states[i].dist=states[i].last_abs_phase=0;
			states[i].estimate=0;
		}
	}
	void setmode(int qpskfl, int lsbfl) { qpsk=qpskfl; lsb=lsbfl; }
	/* encodes shift register data in phase increment (0..3) */
	unsigned int encode(unsigned int sreg, int use_qpsk);
	int encode_varicode(int symb);
	int decode(cmplx rxsymbol, int symb);
	static int IQ2iphase(cmplx IQval);
};

#endif

Generated by: ernie on homer on Sun Oct 6 11:23:16 2002, using kdoc 2.0a53.