#include <stdio.h>
#include "asterisk.h"
#include "asterisk/fskmodem.h"
#include "coef_in.h"
#include "coef_out.h"
Include dependency graph for fskmodem.c:

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(), and fsk_serie(). |
|
|
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. Referenced by fsk_serie(). |
|
|
Definition at line 42 of file fskmodem.c. |
|
||||||||||||||||
|
Definition at line 151 of file fskmodem.c. References fsk_data::cont, GET_SAMPLE, fsk_data::spb, and fsk_data::x0. Referenced by fsk_serie(). 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 filtroM(), filtroS(), and NCOLA. 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(). 00113 {
|
|
||||||||||||
|
Filtro pasa-banda para frecuencia de ESPACIO Definition at line 114 of file fskmodem.c. Referenced by filtroL(). 00133 {
|
|
||||||||||||||||||||
|
Definition at line 201 of file fskmodem.c. References demodulador(), GET_SAMPLE, and STATE_SEARCH_STARTBIT2. 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. References fsk_data::cont. 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. |
1.4.2