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
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
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é
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.
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]);
}
}

