Fabrications personnelles

Un article de Wiki-Dstar-France.

Adaptateur universel

Satoshi Yasuda a mis en ligne une réalisation personnelle permettant d'adapter un Émetteur / Récepteur analogique à D-STAR

Image:Ambe_000.jpg

Cet adaptateur contient :
un micro contrôleur PIC18LF4550 avec le programme respectant les spécifications D-Star
un modem CMX589A
un convertisseur Analogique / Digital AD73311
un vocodeur DVSI AMBE-2020

Image:DV_pro.jpg

Le schéma complet est ici.
La liste des composants est ici.
Le programme du PIC (données HEXA) est ici.
Le programme de contrôle sous Windows XP est ici.
Le driver "LIBUSB" pour Windows XP est ici.

Vous trouverez ici, le groupe de discussion concernant la réalisation des cet adaptateur.

ATTENTION : ces informations sont reproduites avec l'autorisation de Satoshi Yasuda.
CopyRight © 2004-2008 All Rights Reserved. D-STAR™ JARL
Satoshi Yasuda 7M3TJZ/AD6GZ
E-mail: 7m3tjz@jk1zrw.ampr.org

Répéteur

Satoshi Yasuda a également mis au point un répéteur actif D-Star (DV Node), permettant de réaliser un répéteur à moindre frais.

L'interface décrite par Yasuda, permet plusieurs fonctions :
- un répéteur autonome
- une interface DPRS
- un point d'accès pour un réseau interconnecté

Image:DIGIpeater_pcb60.jpg

Le schéma est disponible ici.
Le programme pour le PIC est disponible ici.
Le driver LIBUSB pour Windows XP est disponible ici.

Cette interface connectée à un PC, pourra devenir un point d'accès DPRS à l'aide du programme disponible ici.

VK5ZEA a réalisé un répéteur à base d'E/R analogique et de l'interface de Satoshi.

Image:E835.jpg

Programmes

Quelques programmes sont diffusés par Satoshi pour exemple. Les sources ne sont pas toutes disponibles. Satoshi nous à permis de reproduire quelques informations. Il nous demande d'être patient, car il diffusera bientôt librement toutes les sources des programmes utilisés.

Voici un exemple de programme permettant de décoder ou d'encoder l'entête D-Star :

#include <stdio.h>

#define FALSE           0
#define TRUE            1


int s_path_memory[4][330];
int path_metric[4] = {0,0,0,0};
int output[330];
int mar = 0;


/*
	CRC Generation table for D-STAR 
 */

#define POLY 0x8408   /* 0x1021 bit reversed */


static unsigned short   crc_tabccitt[256]={
			0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf,
			0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7,
			0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e,
			0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876,
			0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd,
			0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5,
			0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c,
			0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974,
			0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb,
			0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3,
			0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a,
			0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72,
			0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9,
			0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1,
			0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738,
			0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70,
			0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7,
			0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff,
			0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036,
			0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e,
			0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5,
			0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd,
			0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134,
			0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c,
			0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3,
			0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb,
			0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232,
			0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a,
			0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1,
			0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9,
			0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330,
			0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78
		};


/*
	CRC update routine
 */

unsigned short update_crc_dstar( unsigned short crc, char c ) {

    unsigned short tmp, short_c,cc,bb;
    int i;

    short_c  = 0x00ff & (unsigned short) c;
	
    tmp = (crc & 0x00ff) ^ short_c;
    crc = (crc >> 8)  ^ crc_tabccitt[tmp];

    return crc;

}  /* update_crc_dstar */


/*
	CRC reslut routine
 */

unsigned short result_crc_dstar(unsigned short crc) {

    unsigned short tmp;

      crc = ~crc;
      tmp = crc;
      crc = (crc << 8) | (tmp >> 8 & 0xff);

    return crc;

}  /* result_crc_dstar */


/*
	Scramble table for D-STAR
 */
static unsigned char scramble[]={
		0x0e,0xf2,0xc9,0x02,0x26,0x2e,0xb6,0x0c,
		0xd4,0xe7,0xb4,0x2a,0xfa,0x51,0xb8,0xfe,
		0x1d,0xe5,0x92,0x04,0x4c,0x5d,0x6c,0x19,
		0xa9,0xcf,0x68,0x55,0xf4,0xa3,0x71,0xfc,
		0x3b,0xcb,0x24,0x08,0x98,0xba,0xd8,0x33,
		0x53,0x9e,0xd0,0xab,0xe9,0x46,0xe3,0xf8,
		0x77,0x96,0x48,0x11,0x31,0x75,0xb0,0x66,
		0xa7,0x3d,0xa1,0x57,0xd2,0x8d,0xc7,0xf0,
		0xef,0x2c,0x90,0x22,0x62,0xeb,0x60,0xcd,
		0x4e,0x7b,0x42,0xaf,0xa5,0x1b,0x8f,0xe1,
		0xde,0x59,0x20,0x44,0xc5,0xd6,0xc1,0x9a,
		0x9c,0xf6};


/*
	Convolutine routine for D-STAR
 */
void convolution (unsigned char temp[], unsigned char data[])
{

	int d,d1,d2,g0,g1;
	int i,j,k;
	unsigned char mask;

	k = 0;
        d1 = 0;
        d2 = 0;
	for (i = 0; i < 42 ; i++)
	{

	        for (j = 0; j < 8 ; j++)
        	{
                	mask = (0x01 << j);
			d = 0;
			if (data[i] & mask) d = 1;
          	        g0 = (d + d2) % 2;
                	g1 = (d + d1 + d2) % 2;
        	        d2 = d1;
                	d1 = d;
			temp[k] = g1;
			k++;
			temp[k] = g0;
			k++;
        	}
	}
}

static int	InterleaveGenTable[1320] = {
		0x00,0x00,0x03,0x04,0x07,0x00,0x0a,0x04,0x0e,0x00,
		0x11,0x04,0x15,0x00,0x18,0x04,0x1c,0x00,0x1f,0x04,
		0x23,0x00,0x26,0x04,0x2a,0x00,0x2d,0x03,0x30,0x06,
		0x34,0x01,0x37,0x04,0x3a,0x07,0x3e,0x02,0x41,0x05,
		0x45,0x00,0x48,0x03,0x4b,0x06,0x4f,0x01,0x00,0x01,
		0x03,0x05,0x07,0x01,0x0a,0x05,0x0e,0x01,0x11,0x05,
		0x15,0x01,0x18,0x05,0x1c,0x01,0x1f,0x05,0x23,0x01,
		0x26,0x05,0x2a,0x01,0x2d,0x04,0x30,0x07,0x34,0x02,
		0x37,0x05,0x3b,0x00,0x3e,0x03,0x41,0x06,0x45,0x01,
		0x48,0x04,0x4b,0x07,0x4f,0x02,0x00,0x02,0x03,0x06,
		0x07,0x02,0x0a,0x06,0x0e,0x02,0x11,0x06,0x15,0x02,
		0x18,0x06,0x1c,0x02,0x1f,0x06,0x23,0x02,0x26,0x06,
		0x2a,0x02,0x2d,0x05,0x31,0x00,0x34,0x03,0x37,0x06,
		0x3b,0x01,0x3e,0x04,0x41,0x07,0x45,0x02,0x48,0x05,
		0x4c,0x00,0x4f,0x03,0x00,0x03,0x03,0x07,0x07,0x03,
		0x0a,0x07,0x0e,0x03,0x11,0x07,0x15,0x03,0x18,0x07,
		0x1c,0x03,0x1f,0x07,0x23,0x03,0x26,0x07,0x2a,0x03,
		0x2d,0x06,0x31,0x01,0x34,0x04,0x37,0x07,0x3b,0x02,
		0x3e,0x05,0x42,0x00,0x45,0x03,0x48,0x06,0x4c,0x01,
		0x4f,0x04,0x00,0x04,0x04,0x00,0x07,0x04,0x0b,0x00,
		0x0e,0x04,0x12,0x00,0x15,0x04,0x19,0x00,0x1c,0x04,
		0x20,0x00,0x23,0x04,0x27,0x00,0x2a,0x04,0x2d,0x07,
		0x31,0x02,0x34,0x05,0x38,0x00,0x3b,0x03,0x3e,0x06,
		0x42,0x01,0x45,0x04,0x48,0x07,0x4c,0x02,0x4f,0x05,
		0x00,0x05,0x04,0x01,0x07,0x05,0x0b,0x01,0x0e,0x05,
		0x12,0x01,0x15,0x05,0x19,0x01,0x1c,0x05,0x20,0x01,
		0x23,0x05,0x27,0x01,0x2a,0x05,0x2e,0x00,0x31,0x03,
		0x34,0x06,0x38,0x01,0x3b,0x04,0x3e,0x07,0x42,0x02,
		0x45,0x05,0x49,0x00,0x4c,0x03,0x4f,0x06,0x00,0x06,
		0x04,0x02,0x07,0x06,0x0b,0x02,0x0e,0x06,0x12,0x02,
		0x15,0x06,0x19,0x02,0x1c,0x06,0x20,0x02,0x23,0x06,
		0x27,0x02,0x2a,0x06,0x2e,0x01,0x31,0x04,0x34,0x07,
		0x38,0x02,0x3b,0x05,0x3f,0x00,0x42,0x03,0x45,0x06,
		0x49,0x01,0x4c,0x04,0x4f,0x07,0x00,0x07,0x04,0x03,
		0x07,0x07,0x0b,0x03,0x0e,0x07,0x12,0x03,0x15,0x07,
		0x19,0x03,0x1c,0x07,0x20,0x03,0x23,0x07,0x27,0x03,
		0x2a,0x07,0x2e,0x02,0x31,0x05,0x35,0x00,0x38,0x03,
		0x3b,0x06,0x3f,0x01,0x42,0x04,0x45,0x07,0x49,0x02,
		0x4c,0x05,0x50,0x00,0x01,0x00,0x04,0x04,0x08,0x00,
		0x0b,0x04,0x0f,0x00,0x12,0x04,0x16,0x00,0x19,0x04,
		0x1d,0x00,0x20,0x04,0x24,0x00,0x27,0x04,0x2b,0x00,
		0x2e,0x03,0x31,0x06,0x35,0x01,0x38,0x04,0x3b,0x07,
		0x3f,0x02,0x42,0x05,0x46,0x00,0x49,0x03,0x4c,0x06,
		0x50,0x01,0x01,0x01,0x04,0x05,0x08,0x01,0x0b,0x05,
		0x0f,0x01,0x12,0x05,0x16,0x01,0x19,0x05,0x1d,0x01,
		0x20,0x05,0x24,0x01,0x27,0x05,0x2b,0x01,0x2e,0x04,
		0x31,0x07,0x35,0x02,0x38,0x05,0x3c,0x00,0x3f,0x03,
		0x42,0x06,0x46,0x01,0x49,0x04,0x4c,0x07,0x50,0x02,
		0x01,0x02,0x04,0x06,0x08,0x02,0x0b,0x06,0x0f,0x02,
		0x12,0x06,0x16,0x02,0x19,0x06,0x1d,0x02,0x20,0x06,
		0x24,0x02,0x27,0x06,0x2b,0x02,0x2e,0x05,0x32,0x00,
		0x35,0x03,0x38,0x06,0x3c,0x01,0x3f,0x04,0x42,0x07,
		0x46,0x02,0x49,0x05,0x4d,0x00,0x50,0x03,0x01,0x03,
		0x04,0x07,0x08,0x03,0x0b,0x07,0x0f,0x03,0x12,0x07,
		0x16,0x03,0x19,0x07,0x1d,0x03,0x20,0x07,0x24,0x03,
		0x27,0x07,0x2b,0x03,0x2e,0x06,0x32,0x01,0x35,0x04,
		0x38,0x07,0x3c,0x02,0x3f,0x05,0x43,0x00,0x46,0x03,
		0x49,0x06,0x4d,0x01,0x50,0x04,0x01,0x04,0x05,0x00,
		0x08,0x04,0x0c,0x00,0x0f,0x04,0x13,0x00,0x16,0x04,
		0x1a,0x00,0x1d,0x04,0x21,0x00,0x24,0x04,0x28,0x00,
		0x2b,0x04,0x2e,0x07,0x32,0x02,0x35,0x05,0x39,0x00,
		0x3c,0x03,0x3f,0x06,0x43,0x01,0x46,0x04,0x49,0x07,
		0x4d,0x02,0x50,0x05,0x01,0x05,0x05,0x01,0x08,0x05,
		0x0c,0x01,0x0f,0x05,0x13,0x01,0x16,0x05,0x1a,0x01,
		0x1d,0x05,0x21,0x01,0x24,0x05,0x28,0x01,0x2b,0x05,
		0x2f,0x00,0x32,0x03,0x35,0x06,0x39,0x01,0x3c,0x04,
		0x3f,0x07,0x43,0x02,0x46,0x05,0x4a,0x00,0x4d,0x03,
		0x50,0x06,0x01,0x06,0x05,0x02,0x08,0x06,0x0c,0x02,
		0x0f,0x06,0x13,0x02,0x16,0x06,0x1a,0x02,0x1d,0x06,
		0x21,0x02,0x24,0x06,0x28,0x02,0x2b,0x06,0x2f,0x01,
		0x32,0x04,0x35,0x07,0x39,0x02,0x3c,0x05,0x40,0x00,
		0x43,0x03,0x46,0x06,0x4a,0x01,0x4d,0x04,0x50,0x07,	
		0x01,0x07,0x05,0x03,0x08,0x07,0x0c,0x03,0x0f,0x07,
		0x13,0x03,0x16,0x07,0x1a,0x03,0x1d,0x07,0x21,0x03,
		0x24,0x07,0x28,0x03,0x2b,0x07,0x2f,0x02,0x32,0x05,
		0x36,0x00,0x39,0x03,0x3c,0x06,0x40,0x01,0x43,0x04,
		0x46,0x07,0x4a,0x02,0x4d,0x05,0x51,0x00,0x02,0x00,
		0x05,0x04,0x09,0x00,0x0c,0x04,0x10,0x00,0x13,0x04,
		0x17,0x00,0x1a,0x04,0x1e,0x00,0x21,0x04,0x25,0x00,
		0x28,0x04,0x2c,0x00,0x2f,0x03,0x32,0x06,0x36,0x01,
		0x39,0x04,0x3c,0x07,0x40,0x02,0x43,0x05,0x47,0x00,
		0x4a,0x03,0x4d,0x06,0x51,0x01,0x02,0x01,0x05,0x05,
		0x09,0x01,0x0c,0x05,0x10,0x01,0x13,0x05,0x17,0x01,
		0x1a,0x05,0x1e,0x01,0x21,0x05,0x25,0x01,0x28,0x05,
		0x2c,0x01,0x2f,0x04,0x32,0x07,0x36,0x02,0x39,0x05,
		0x3d,0x00,0x40,0x03,0x43,0x06,0x47,0x01,0x4a,0x04,
		0x4d,0x07,0x51,0x02,0x02,0x02,0x05,0x06,0x09,0x02,
		0x0c,0x06,0x10,0x02,0x13,0x06,0x17,0x02,0x1a,0x06,
		0x1e,0x02,0x21,0x06,0x25,0x02,0x28,0x06,0x2c,0x02,
		0x2f,0x05,0x33,0x00,0x36,0x03,0x39,0x06,0x3d,0x01,
		0x40,0x04,0x43,0x07,0x47,0x02,0x4a,0x05,0x4e,0x00,
		0x51,0x03,0x02,0x03,0x05,0x07,0x09,0x03,0x0c,0x07,
		0x10,0x03,0x13,0x07,0x17,0x03,0x1a,0x07,0x1e,0x03,
		0x21,0x07,0x25,0x03,0x28,0x07,0x2c,0x03,0x2f,0x06,
		0x33,0x01,0x36,0x04,0x39,0x07,0x3d,0x02,0x40,0x05,
		0x44,0x00,0x47,0x03,0x4a,0x06,0x4e,0x01,0x51,0x04,
		0x02,0x04,0x06,0x00,0x09,0x04,0x0d,0x00,0x10,0x04,
		0x14,0x00,0x17,0x04,0x1b,0x00,0x1e,0x04,0x22,0x00,
		0x25,0x04,0x29,0x00,0x2c,0x04,0x2f,0x07,0x33,0x02,
		0x36,0x05,0x3a,0x00,0x3d,0x03,0x40,0x06,0x44,0x01,
		0x47,0x04,0x4a,0x07,0x4e,0x02,0x51,0x05,0x02,0x05,
		0x06,0x01,0x09,0x05,0x0d,0x01,0x10,0x05,0x14,0x01,
		0x17,0x05,0x1b,0x01,0x1e,0x05,0x22,0x01,0x25,0x05,
		0x29,0x01,0x2c,0x05,0x30,0x00,0x33,0x03,0x36,0x06,
		0x3a,0x01,0x3d,0x04,0x40,0x07,0x44,0x02,0x47,0x05,
		0x4b,0x00,0x4e,0x03,0x51,0x06,0x02,0x06,0x06,0x02,
		0x09,0x06,0x0d,0x02,0x10,0x06,0x14,0x02,0x17,0x06,
		0x1b,0x02,0x1e,0x06,0x22,0x02,0x25,0x06,0x29,0x02,
		0x2c,0x06,0x30,0x01,0x33,0x04,0x36,0x07,0x3a,0x02,
		0x3d,0x05,0x41,0x00,0x44,0x03,0x47,0x06,0x4b,0x01,
		0x4e,0x04,0x51,0x07,0x02,0x07,0x06,0x03,0x09,0x07,
		0x0d,0x03,0x10,0x07,0x14,0x03,0x17,0x07,0x1b,0x03,
		0x1e,0x07,0x22,0x03,0x25,0x07,0x29,0x03,0x2c,0x07,
		0x30,0x02,0x33,0x05,0x37,0x00,0x3a,0x03,0x3d,0x06,
		0x41,0x01,0x44,0x04,0x47,0x07,0x4b,0x02,0x4e,0x05,
		0x52,0x00,0x03,0x00,0x06,0x04,0x0a,0x00,0x0d,0x04,
		0x11,0x00,0x14,0x04,0x18,0x00,0x1b,0x04,0x1f,0x00,
		0x22,0x04,0x26,0x00,0x29,0x04,0x2d,0x00,0x30,0x03,
		0x33,0x06,0x37,0x01,0x3a,0x04,0x3d,0x07,0x41,0x02,
		0x44,0x05,0x48,0x00,0x4b,0x03,0x4e,0x06,0x52,0x01,
		0x03,0x01,0x06,0x05,0x0a,0x01,0x0d,0x05,0x11,0x01,
		0x14,0x05,0x18,0x01,0x1b,0x05,0x1f,0x01,0x22,0x05,
		0x26,0x01,0x29,0x05,0x2d,0x01,0x30,0x04,0x33,0x07,
		0x37,0x02,0x3a,0x05,0x3e,0x00,0x41,0x03,0x44,0x06,
		0x48,0x01,0x4b,0x04,0x4e,0x07,0x52,0x02,0x03,0x02,
		0x06,0x06,0x0a,0x02,0x0d,0x06,0x11,0x02,0x14,0x06,
		0x18,0x02,0x1b,0x06,0x1f,0x02,0x22,0x06,0x26,0x02,
		0x29,0x06,0x2d,0x02,0x30,0x05,0x34,0x00,0x37,0x03,
		0x3a,0x06,0x3e,0x01,0x41,0x04,0x44,0x07,0x48,0x02,
		0x4b,0x05,0x4f,0x00,0x52,0x03,0x03,0x03,0x06,0x07,
		0x0a,0x03,0x0d,0x07,0x11,0x03,0x14,0x07,0x18,0x03,
		0x1b,0x07,0x1f,0x03,0x22,0x07,0x26,0x03,0x29,0x07
		};
/*
	Interleave routine for D-STAR
 */
void interleave_gen (unsigned char inter[], unsigned char temp[])
{

	int i,j,k;

	for (i = 0 ; i < 83 ; i++) inter[i] = 0;
 
	k = 0;
	for (i = 0 ; i < 660 ; i++)
	{
		if (temp[i])
		{
			inter[InterleaveGenTable[i*2]] |= (0x80 >>InterleaveGenTable[i*2+1]);
		}
	}
}


/*
	Decode of Interleave  for D-STAR
 */
void interleave_decode (unsigned char temp[], unsigned char inter[])
{

	int i,j,k;

	k = 0;
	for (i = 0 ; i < 83 ; i++) temp[i] = 0;

	for (i = 0 ; i < 83 ; i++)
	{
		for (j = 0 ; j < 8 ; j++)
	 	{
			if (inter[i] & (0x80 >> j)) temp[k/8] |= 0x80 >> (k % 8);
			k += 24;
			if (k >= 672 ) k -= 671;
			else if (k >= 660 ) k -= 647;
		 }
	}
}


/*

  Viterbi decoder using Traceback method.
  Original Source was written by Sho Tamaoki and Tom Wada
  See http://www.lsi.ie.u-ryukyu.ac.jp/~sho/midterm/

  Modifed by Satoshi Yasuda 7m3tjz/ad6gz

 */

void acs(int metric[])
{
  int survival_path,m1,m2,temp_metric[4];
  int i;

    // Pres. state = S0, Prev. state = S0 & S2
    survival_path = ((m1=metric[0]+path_metric[0]) < (m2=metric[4]+path_metric[2])) ? 0 : 1;
    temp_metric[0] = m1 < m2 ? m1 : m2;

    //printf ("debug  %d %d %d\n",m1,m2,temp_metric[0]);
    s_path_memory[0][mar] = survival_path;
    // Pres. state = S1, Prev. state = S0 & S2
    survival_path = ((m1=metric[1]+path_metric[0]) < (m2=metric[5]+path_metric[2])) ? 0 : 1;
    temp_metric[1] = m1 < m2 ? m1 : m2;
    s_path_memory[1][mar] = survival_path;

    // Pres. state = S2, Prev. state = S2 & S3
    survival_path = ((m1=metric[2]+path_metric[1]) < (m2=metric[6]+path_metric[3])) ? 0 : 1;
    temp_metric[2] = m1 < m2 ? m1 : m2;
    s_path_memory[2][mar] = survival_path;

    // Pres. state = S3, Prev. state = S1 & S3
    survival_path = ((m1=metric[3]+path_metric[1]) < (m2=metric[7]+path_metric[3])) ? 0 : 1;
    temp_metric[3] = m1 < m2 ? m1 : m2;
    s_path_memory[3][mar] = survival_path;

    for(i = 0 ; i < 4 ; i++) path_metric[i] = temp_metric[i];
    mar++;

  return;
}

  
void viterbi_decode(int data[])
{
  int metric[8];

      metric[0] = (data[1] ^ 0) + (data[0] ^ 0);
      metric[1] = (data[1] ^ 1) + (data[0] ^ 1);
      metric[2] = (data[1] ^ 1) + (data[0] ^ 0);
      metric[3] = (data[1] ^ 0) + (data[0] ^ 1);
      metric[4] = (data[1] ^ 1) + (data[0] ^ 1);
      metric[5] = (data[1] ^ 0) + (data[0] ^ 0);
      metric[6] = (data[1] ^ 0) + (data[0] ^ 1);
      metric[7] = (data[1] ^ 1) + (data[0] ^ 0);
  
      acs(metric);

  return;
}



void trace_back(void)
{
  int i,j,k=0;

  // Start from the S0, t=31
  j=0;
  for(i=329;i>=0;i--){
    switch(j){
    case 0: // if state = S0
      if(s_path_memory[j][i] == 0){ // upper path
	j=0;
      } else { // lower path
	j=2;
      }
	output[k++]=0;
      break;
    case 1: // if state = S1
      if(s_path_memory[j][i] == 0){ // upper path
	j=0;
      } else { // lower path
	j=2;
      }
	output[k++]=1;
      break;
    case 2: // if state = S1
      if(s_path_memory[j][i] == 0){ // upper path
	j=1;
      } else { // lower path
	j=3;
      }
	output[k++]=0;
      break;
    case 3: // if state = S1
      if(s_path_memory[j][i] == 0){ // upper path
	j=1;
      } else { // lower path
	j=3;
      }
	output[k++]=1;
      break;
    }
  }
  
}

void viterbi (unsigned char dd[], unsigned char temp[])
{
  int decode_data[2],i,j,mar;
		
  mar = 0;

  for (i = 0 ; i < 660 ; i += 2)
  {
	if (temp[i/8] & (0x80 >> i%8)) decode_data[1] = 1;
	else decode_data[1] = 0;

	if (temp[i/8] & (0x40 >> i%8)) decode_data[0] = 1;
	else decode_data[0] = 0;

	viterbi_decode(decode_data);
  }

  trace_back();

	for (i = 0 ; i < 41 ; i++) dd[i] = 0;

	j = 0;
  	for(i = 329 ; i >= 0 ; i--)
	{
		if (output[i] == 1)
		{
			dd[j/8] |= (0x01 << (j%8));
		}
		j++;
	}

}


void main()
{
unsigned char testdata[]={
		0x00,0x00,0x00,
		0x44,0x49,0x52,0x45,0x43,0x54,0x20,0x20,	// "DIRECT  "
		0x44,0x49,0x52,0x45,0x43,0x54,0x20,0x20,	// "DIRECT  "
		0x43,0x51,0x43,0x51,0x43,0x51,0x20,0x20,	// "CQCQCQ  "
		0x37,0x4d,0x33,0x54,0x4a,0x5a,0x20,0x43,	// "7M3TJZ C"
		0x20,0x20,0x20,0x20,				// "    "
		0x00,0x00,					// CRC
		0x00						// DUMMY for convolution
		};



unsigned char	bb[83];
unsigned char	temp[700],dd[41];



unsigned short	crc_dstar_ffff;

int	i,j,k;

/* Encode Step 1. CRC Gen. */ 

        crc_dstar_ffff = 0xffff;	/* nornal value 0xffff */

	for (i = 0; i < 39 ; i++)
	{
		crc_dstar_ffff = update_crc_dstar( crc_dstar_ffff, testdata[i]);
	}

	crc_dstar_ffff = result_crc_dstar(crc_dstar_ffff);

	testdata[39] = crc_dstar_ffff >> 8;
	testdata[40] = crc_dstar_ffff & 0x00ff;


/* Encode Step 2. Convolution */
	convolution (temp, testdata);

/* Encode Step 3. Interleave Gen. */
	interleave_gen (bb, temp);

/* Encode Step 4. Scramble */
	for (i = 0 ; i < 83 ; i++)
	{
		bb[i] = bb[i] ^ scramble[i];		
	}	


/*  Encode Final  Out put */

	for (i = 0 ; i < 83 ; i++)
	{
		printf ("%2.2x ",bb[i]);
	}	

	printf ("\n");

/* Decode Step 1. DeScramble */
/* same as scramble of encode */
	for (i = 0 ; i < 83 ; i++)
	{
		bb[i] = bb[i] ^ scramble[i];		
	}	

/* Decode Step 2. DeInterleave */
	interleave_decode (temp, bb);

/* Decode Step 3. DeConvolustion (Viterbi method) */
	viterbi (dd,temp);

	for (i = 0 ; i < 41 ; i++)
	{
		printf ("%2.2x ",dd[i]);
	}

}