#include <stdio.h>
#include "asterisk.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.
|
Definition at line 36 of file fskmodem.c. |
|
Definition at line 38 of file fskmodem.c. |
|
Definition at line 54 of file fskmodem.c. Referenced by demodulador(). |
|
Definition at line 35 of file fskmodem.c. |
|
Definition at line 37 of file fskmodem.c. |
|
Definition at line 43 of file fskmodem.c. |
|
Definition at line 40 of file fskmodem.c. |
|
Definition at line 41 of file fskmodem.c. |
|
Definition at line 42 of file fskmodem.c. |
|
Definition at line 151 of file fskmodem.c. References GET_SAMPLE, and fsk_data::spb. 00153 { 00154 /* Esta funcion implementa un DPLL para sincronizarse con los bits */ 00155 float x,spb,spb2,ds; 00156 int f; 00157 00158 spb=fskd->spb; 00159 if (fskd->spb == 7) spb = 8000.0 / 1200.0; 00160 ds=spb/32.; 00161 spb2=spb/2.; 00162 00163 for (f=0;;){ 00164 if (demodulador(fskd,&x, GET_SAMPLE)) return(-1); 00165 if ((x*fskd->x0)<0) { /* Transicion */ 00166 if (!f) { 00167 if (fskd->cont<(spb2)) fskd->cont+=ds; else fskd->cont-=ds; 00168 f=1; 00169 }
|
|
Filtro pasa-bajos para datos demodulados Definition at line 131 of file fskmodem.c. References fsk_data::cola_demod, fsk_data::cola_filtro, fsk_data::cola_in, filtroM(), filtroS(), NCOLA, and fsk_data::pcola. 00133 { 00134 float xS,xM; 00135 00136 fskd->cola_in[fskd->pcola]=x; 00137 00138 xS=filtroS(fskd,x); 00139 xM=filtroM(fskd,x); 00140 00141 fskd->cola_filtro[fskd->pcola]=xM-xS; 00142 00143 x=filtroL(fskd,xM*xM - xS*xS); 00144 00145 fskd->cola_demod[fskd->pcola++]=x; 00146 fskd->pcola &= (NCOLA-1); 00147 00148 *retval = x; 00149 return(0);
|
|
Filtro pasa-banda para frecuencia de MARCA Definition at line 97 of file fskmodem.c. Referenced by filtroL().
|
|
Filtro pasa-banda para frecuencia de ESPACIO Definition at line 114 of file fskmodem.c. Referenced by filtroL().
|
|
Definition at line 201 of file fskmodem.c. Referenced by callerid_feed(), and tdd_feed(). 00205 { 00206 if (demodulador(zap,&x2)) return(-1); 00207 if (x1>0 && x2<0) break; 00208 x1=x2; 00209 } 00210 */ 00211 /* this is now the imprecise, losing, but functional code to detect the 00212 beginning of a start bit in the TDD sceanario. It just looks for sufficient 00213 level to maybe, perhaps, guess, maybe that its maybe the beginning of 00214 a start bit, perhaps. This whole thing stinks! */ 00215 if (demodulador(fskd,&fskd->x1,GET_SAMPLE)) return(-1); 00216 samples++; 00217 for(;;) 00218 { 00219 search_startbit2: 00220 if (!*len) { 00221 fskd->state = STATE_SEARCH_STARTBIT2; 00222 return 0; 00223 } 00224 samples++; 00225 if (demodulador(fskd,&fskd->x2,GET_SAMPLE)) return(-1); 00226 #if 0 00227 printf("x2 = %5.5f ", fskd->x2); 00228 #endif 00229 if (fskd->x2 < -0.5) break; 00230 } 00231 search_startbit3: 00232 /* Esperamos 0.5 bits antes de usar DPLL */ 00233 i=fskd->spb/2; 00234 if (*len < i) { 00235 fskd->state = STATE_SEARCH_STARTBIT3; 00236 return 0; 00237 } 00238 for(;i;i--) { if (demodulador(fskd,&fskd->x1,GET_SAMPLE)) return(-1); 00239 #if 0 00240 printf("x1 = %5.5f ", fskd->x1); 00241 #endif 00242 samples++; } 00243 00244 /* x1 debe ser negativo (confirmación del bit de start) */ 00245 00246 } while (fskd->x1>0); 00247 fskd->state = STATE_GET_BYTE; 00248 00249 getbyte: 00250 00251 /* Need at least 80 samples (for 1200) or 00252 1320 (for 45.5) to be sure we'll have a byte */ 00253 if (fskd->nbit < 8) { 00254 if (*len < 1320) 00255 return 0; 00256 } else { 00257 if (*len < 80) 00258 return 0; 00259 } 00260 /* Leemos ahora los bits de datos */ 00261 j=fskd->nbit; 00262 for (a=n1=0;j;j--) { 00263 olen = *len; 00264 i=get_bit_raw(fskd, buffer, len); 00265 buffer += (olen - *len); 00266 if (i == -1) return(-1); 00267 if (i) n1++; 00268 a>>=1; a|=i; 00269 } 00270 j=8-fskd->nbit; 00271 a>>=j; 00272 00273 /* Leemos bit de paridad (si existe) y la comprobamos */ 00274 if (fskd->paridad) { 00275 olen = *len; 00276 i=get_bit_raw(fskd, buffer, len); 00277 buffer += (olen - *len); 00278 if (i == -1) return(-1); 00279 if (i) n1++; 00280 if (fskd->paridad==1) { /* paridad=1 (par) */ 00281 if (n1&1) a|=0x100; /* error */ 00282 } else { /* paridad=2 (impar) */ 00283 if (!(n1&1)) a|=0x100; /* error */ 00284 } 00285 } 00286 00287 /* Leemos bits de STOP. Todos deben ser 1 */ 00288 00289 for (j=fskd->nstop;j;j--) { 00290 r = get_bit_raw(fskd, buffer, len); 00291 if (r == -1) return(-1); 00292 if (!r) a|=0x200; 00293 } 00294 00295 /* Por fin retornamos */ 00296 /* Bit 8 : Error de paridad */ 00297 /* Bit 9 : Error de Framming */ 00298 00299 *outbyte = a; 00300 fskd->state = STATE_SEARCH_STARTBIT; 00301 return 1; 00302 } 00303 }
|
|
Definition at line 171 of file fskmodem.c. 00173 { 00174 fskd->cont-=spb; 00175 break; 00176 } 00177 } 00178 f=(x>0)?0x80:0; 00179 return(f); 00180 } 00181 00182 int fsk_serie(fsk_data *fskd, short *buffer, int *len, int *outbyte) 00183 { 00184 int a; 00185 int i,j,n1,r; 00186 int samples=0; 00187 int olen; 00188 switch(fskd->state) { 00189 /* Pick up where we left off */ 00190 case STATE_SEARCH_STARTBIT2: 00191 goto search_startbit2; 00192 case STATE_SEARCH_STARTBIT3: 00193 goto search_startbit3; 00194 case STATE_GET_BYTE: 00195 goto getbyte; 00196 } 00197 /* Esperamos bit de start */ 00198 do { 00199 /* this was jesus's nice, reasonable, working (at least with RTTY) code
|
|
Definition at line 45 of file fskmodem.c. 00046 { 00047 float retval; 00048 retval = (float) **buffer / 256; 00049 (*buffer)++; 00050 (*len)--; 00051 return retval; 00052 }
|
|
Definition at line 62 of file fskmodem.c. |
|
Definition at line 86 of file fskmodem.c. |