#include "asterisk.h"
#include <stdio.h>
#include "asterisk/fskmodem.h"
#include "coef_in.h"
#include "coef_out.h"
Go to the source code of this file.
Defines | |
#define | BWLIST {75,800} |
#define | FLIST {1400,1800,1200,2200,1300,2100} |
#define | GET_SAMPLE get_sample(&buffer, len) |
#define | NBW 2 |
#define | NF 6 |
#define | STATE_GET_BYTE 3 |
#define | STATE_SEARCH_STARTBIT 0 |
#define | STATE_SEARCH_STARTBIT2 1 |
#define | STATE_SEARCH_STARTBIT3 2 |
Functions | |
static int | demodulador (fsk_data *fskd, float *retval, float x) |
static float | filtroL (fsk_data *fskd, float in) |
static float | filtroM (fsk_data *fskd, float in) |
static float | filtroS (fsk_data *fskd, float in) |
int | fsk_serie (fsk_data *fskd, short *buffer, int *len, int *outbyte) |
static int | get_bit_raw (fsk_data *fskd, short *buffer, int *len) |
static float | get_sample (short **buffer, int *len) |
Variables | |
static double | coef_in [NF][NBW][8] |
static double | coef_out [NBW][8] |
Definition in file fskmodem.c.
#define BWLIST {75,800} |
Definition at line 39 of file fskmodem.c.
#define FLIST {1400,1800,1200,2200,1300,2100} |
Definition at line 41 of file fskmodem.c.
#define GET_SAMPLE get_sample(&buffer, len) |
#define NBW 2 |
Definition at line 38 of file fskmodem.c.
#define NF 6 |
Definition at line 40 of file fskmodem.c.
#define STATE_GET_BYTE 3 |
Definition at line 46 of file fskmodem.c.
#define STATE_SEARCH_STARTBIT 0 |
Definition at line 43 of file fskmodem.c.
#define STATE_SEARCH_STARTBIT2 1 |
#define STATE_SEARCH_STARTBIT3 2 |
static int demodulador | ( | fsk_data * | fskd, | |
float * | retval, | |||
float | x | |||
) | [inline, static] |
Definition at line 154 of file fskmodem.c.
References f, GET_SAMPLE, and fsk_data::spb.
Referenced by fsk_serie().
00156 { 00157 /* Esta funcion implementa un DPLL para sincronizarse con los bits */ 00158 float x,spb,spb2,ds; 00159 int f; 00160 00161 spb=fskd->spb; 00162 if (fskd->spb == 7) spb = 8000.0 / 1200.0; 00163 ds=spb/32.; 00164 spb2=spb/2.; 00165 00166 for (f=0;;){ 00167 if (demodulador(fskd,&x, GET_SAMPLE)) return(-1); 00168 if ((x*fskd->x0)<0) { /* Transicion */ 00169 if (!f) { 00170 if (fskd->cont<(spb2)) fskd->cont+=ds; else fskd->cont-=ds; 00171 f=1; 00172 }
static float filtroL | ( | fsk_data * | fskd, | |
float | in | |||
) | [inline, static] |
Filtro pasa-bajos para datos demodulados
Definition at line 134 of file fskmodem.c.
References fsk_data::cola_demod, fsk_data::cola_filtro, fsk_data::cola_in, filtroM(), filtroS(), NCOLA, and fsk_data::pcola.
00136 { 00137 float xS,xM; 00138 00139 fskd->cola_in[fskd->pcola]=x; 00140 00141 xS=filtroS(fskd,x); 00142 xM=filtroM(fskd,x); 00143 00144 fskd->cola_filtro[fskd->pcola]=xM-xS; 00145 00146 x=filtroL(fskd,xM*xM - xS*xS); 00147 00148 fskd->cola_demod[fskd->pcola++]=x; 00149 fskd->pcola &= (NCOLA-1); 00150 00151 *retval = x; 00152 return(0);
static float filtroM | ( | fsk_data * | fskd, | |
float | in | |||
) | [inline, static] |
Filtro pasa-banda para frecuencia de MARCA
Definition at line 100 of file fskmodem.c.
Referenced by filtroL().
static float filtroS | ( | fsk_data * | fskd, | |
float | in | |||
) | [inline, static] |
Filtro pasa-banda para frecuencia de ESPACIO
Definition at line 117 of file fskmodem.c.
Referenced by filtroL().
int fsk_serie | ( | fsk_data * | fskd, | |
short * | buffer, | |||
int * | len, | |||
int * | outbyte | |||
) |
Definition at line 204 of file fskmodem.c.
References demodulador(), GET_SAMPLE, STATE_SEARCH_STARTBIT2, and STATE_SEARCH_STARTBIT3.
Referenced by callerid_feed(), callerid_feed_jp(), and tdd_feed().
00204 { 00205 /* this was jesus's nice, reasonable, working (at least with RTTY) code 00206 to look for the beginning of the start bit. Unfortunately, since TTY/TDD's 00207 just start sending a start bit with nothing preceding it at the beginning 00208 of a transmission (what a LOSING design), we cant do it this elegantly */ 00209 /* 00210 if (demodulador(zap,&x1)) return(-1); 00211 for(;;) { 00212 if (demodulador(zap,&x2)) return(-1); 00213 if (x1>0 && x2<0) break; 00214 x1=x2; 00215 } 00216 */ 00217 /* this is now the imprecise, losing, but functional code to detect the 00218 beginning of a start bit in the TDD sceanario. It just looks for sufficient 00219 level to maybe, perhaps, guess, maybe that its maybe the beginning of 00220 a start bit, perhaps. This whole thing stinks! */ 00221 beginlenx=beginlen; /* just to avoid unused war warnings */ 00222 if (demodulador(fskd,&fskd->x1,GET_SAMPLE)) return(-1); 00223 samples++; 00224 for(;;) 00225 { 00226 search_startbit2: 00227 if (*len <= 0) { 00228 fskd->state = STATE_SEARCH_STARTBIT2; 00229 return 0; 00230 } 00231 samples++; 00232 if (demodulador(fskd,&fskd->x2,GET_SAMPLE)) return(-1); 00233 #if 0 00234 printf("x2 = %5.5f ", fskd->x2); 00235 #endif 00236 if (fskd->x2 < -0.5) break; 00237 } 00238 search_startbit3: 00239 /* Esperamos 0.5 bits antes de usar DPLL */ 00240 i=fskd->spb/2; 00241 if (*len < i) { 00242 fskd->state = STATE_SEARCH_STARTBIT3; 00243 return 0; 00244 } 00245 for(;i>0;i--) { if (demodulador(fskd,&fskd->x1,GET_SAMPLE)) return(-1); 00246 #if 0 00247 printf("x1 = %5.5f ", fskd->x1); 00248 #endif 00249 samples++; } 00250 00251 /* x1 debe ser negativo (confirmación del bit de start) */ 00252 00253 } while (fskd->x1>0); 00254 fskd->state = STATE_GET_BYTE; 00255 00256 getbyte: 00257 00258 /* Need at least 80 samples (for 1200) or 00259 1320 (for 45.5) to be sure we'll have a byte */ 00260 if (fskd->nbit < 8) { 00261 if (*len < 1320) 00262 return 0; 00263 } else { 00264 if (*len < 80) 00265 return 0; 00266 } 00267 /* Leemos ahora los bits de datos */ 00268 j=fskd->nbit; 00269 for (a=n1=0;j;j--) { 00270 olen = *len; 00271 i=get_bit_raw(fskd, buffer, len); 00272 buffer += (olen - *len); 00273 if (i == -1) return(-1); 00274 if (i) n1++; 00275 a>>=1; a|=i; 00276 } 00277 j=8-fskd->nbit; 00278 a>>=j; 00279 00280 /* Leemos bit de paridad (si existe) y la comprobamos */ 00281 if (fskd->paridad) { 00282 olen = *len; 00283 i=get_bit_raw(fskd, buffer, len); 00284 buffer += (olen - *len); 00285 if (i == -1) return(-1); 00286 if (i) n1++; 00287 if (fskd->paridad==1) { /* paridad=1 (par) */ 00288 if (n1&1) a|=0x100; /* error */ 00289 } else { /* paridad=2 (impar) */ 00290 if (!(n1&1)) a|=0x100; /* error */ 00291 } 00292 } 00293 00294 /* Leemos bits de STOP. Todos deben ser 1 */ 00295 00296 for (j=fskd->nstop;j;j--) { 00297 r = get_bit_raw(fskd, buffer, len); 00298 if (r == -1) return(-1); 00299 if (!r) a|=0x200; 00300 } 00301 00302 /* Por fin retornamos */ 00303 /* Bit 8 : Error de paridad */ 00304 /* Bit 9 : Error de Framming */ 00305 00306 *outbyte = a; 00307 fskd->state = STATE_SEARCH_STARTBIT; 00308 return 1; 00309 } 00310 }
static int get_bit_raw | ( | fsk_data * | fskd, | |
short * | buffer, | |||
int * | len | |||
) | [static] |
Definition at line 174 of file fskmodem.c.
00176 { 00177 fskd->cont-=spb; 00178 break; 00179 } 00180 } 00181 f=(x>0)?0x80:0; 00182 return(f); 00183 } 00184 00185 int fsk_serie(fsk_data *fskd, short *buffer, int *len, int *outbyte) 00186 { 00187 int a; 00188 int i,j,n1,r; 00189 int samples=0; 00190 int olen; 00191 int beginlen=*len; 00192 int beginlenx; 00193 00194 switch(fskd->state) { 00195 /* Pick up where we left off */ 00196 case STATE_SEARCH_STARTBIT2: 00197 goto search_startbit2; 00198 case STATE_SEARCH_STARTBIT3: 00199 goto search_startbit3; 00200 case STATE_GET_BYTE: 00201 goto getbyte; 00202 }
static float get_sample | ( | short ** | buffer, | |
int * | len | |||
) | [inline, static] |
Definition at line 48 of file fskmodem.c.
00049 { 00050 float retval; 00051 retval = (float) **buffer / 256; 00052 (*buffer)++; 00053 (*len)--; 00054 return retval; 00055 }
double coef_in[NF][NBW][8] [static] |
Definition at line 65 of file fskmodem.c.
double coef_out[NBW][8] [static] |
Definition at line 89 of file fskmodem.c.