*** empty log message ***

This commit is contained in:
Pascal Brisset
2005-08-20 13:41:00 +00:00
parent e6121bf8bf
commit 373b4db177
5 changed files with 220 additions and 1079 deletions
+134
View File
@@ -0,0 +1,134 @@
/*
* demod_afsk48p.c -- 4800 baud AFSK demodulator for paparazzi
*
* Copyright (C) 1996
* Thomas Sailer (sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* ---------------------------------------------------------------------- */
#include "multimon.h"
#include "filter.h"
#include "pprz.h"
#include <math.h>
#include <string.h>
/* ---------------------------------------------------------------------- */
/*
* Standard CMX469A clock frequency: 4.032 Mhz
* Xtal used: 4 MHz
* Ratio: 0.992063
* Mark frequency: 4761.905 Hz
* Space frequency: 2380.952 Hz
*/
#define FREQ_MARK 4762
#define FREQ_SPACE 2381
#define FREQ_SAMP 22050
//#define FREQ_SAMP 44100
#define BAUD 4762
/* ---------------------------------------------------------------------- */
#define CORRLEN (2*(int)(FREQ_SAMP/BAUD))
#define SPHASEINC (0x10000u*BAUD/FREQ_SAMP)
static float corr_mark_i[CORRLEN];
static float corr_mark_q[CORRLEN];
static float corr_space_i[CORRLEN];
static float corr_space_q[CORRLEN];
/* ---------------------------------------------------------------------- */
static void afsk48p_init(struct demod_state *s)
{
float f;
int i;
pprz_init(s);
memset(&s->l1.afsk48p, 0, sizeof(s->l1.afsk48p));
for (f = 0, i = 0; i < CORRLEN; i++) {
corr_mark_i[i] = cos(f);
corr_mark_q[i] = sin(f);
f += 2.0*M_PI*FREQ_MARK/FREQ_SAMP;
}
for (f = 0, i = 0; i < CORRLEN; i++) {
corr_space_i[i] = cos(f);
corr_space_q[i] = sin(f);
f += 2.0*M_PI*FREQ_SPACE/FREQ_SAMP;
}
for (i = 0; i < CORRLEN; i++) {
f = 0.54 - 0.46*cos(2*M_PI*i/(float)(CORRLEN-1));
corr_mark_i[i] *= f;
corr_mark_q[i] *= f;
corr_space_i[i] *= f;
corr_space_q[i] *= f;
}
s->l1.afsk48p.sample_count = 0;
}
/* ---------------------------------------------------------------------- */
static void afsk48p_demod(struct demod_state *s, float *buffer, int length)
{
float f;
unsigned char curbit;
s->l1.afsk48p.sample_count += length;
if (s->l1.afsk48p.sample_count > FREQ_SAMP) {
s->l1.afsk48p.sample_count -= FREQ_SAMP;
pprz_status(s);
}
for (; length > 0; length--, buffer++) {
f = fsqr(mac(buffer, corr_mark_i, CORRLEN)) +
fsqr(mac(buffer, corr_mark_q, CORRLEN)) -
fsqr(mac(buffer, corr_space_i, CORRLEN)) -
fsqr(mac(buffer, corr_space_q, CORRLEN));
s->l1.afsk48p.dcd_shreg <<= 1;
s->l1.afsk48p.dcd_shreg |= (f > 0);
verbprintf(10, "%c", '0'+(s->l1.afsk48p.dcd_shreg & 1));
/*
* check if transition
*/
if ((s->l1.afsk48p.dcd_shreg ^ (s->l1.afsk48p.dcd_shreg >> 1)) & 1) {
if (s->l1.afsk48p.sphase < (0x8000u-(SPHASEINC/2)))
s->l1.afsk48p.sphase += SPHASEINC/8;
else
s->l1.afsk48p.sphase -= SPHASEINC/8;
}
s->l1.afsk48p.sphase += SPHASEINC;
if (s->l1.afsk48p.sphase >= 0x10000u) {
s->l1.afsk48p.sphase &= 0xffffu;
s->l1.afsk48p.lasts <<= 1;
s->l1.afsk48p.lasts |= s->l1.afsk48p.dcd_shreg & 1;
/* we use direct coded bits, not NRZI */
curbit = (s->l1.afsk48p.lasts ^ 1) & 1;
verbprintf(9, " %c ", '0'+curbit);
pprz_baudot_rxbit(s, curbit);
}
}
}
/* ---------------------------------------------------------------------- */
const struct demod_param demod_afsk4800p = {
"AFSK4800_P", FREQ_SAMP, CORRLEN, afsk48p_init, afsk48p_demod
};
/* ---------------------------------------------------------------------- */
@@ -0,0 +1,86 @@
/*
* demod_display.c -- signal display
*
* Copyright (C) 1996
* Thomas Sailer (sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* ---------------------------------------------------------------------- */
#include "multimon.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <signal.h>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
/* ---------------------------------------------------------------------- */
#define SAMPLING_RATE 22050
/* ---------------------------------------------------------------------- */
static void scope_init(struct demod_state *s)
{
memset(&s->l1.scope, 0, sizeof(s->l1.scope));
s->l1.scope.dispnum = xdisp_start();
if (s->l1.scope.dispnum == -1)
return;
}
/* ---------------------------------------------------------------------- */
#define MEMSIZE sizeof(s->l1.scope.data)/sizeof(s->l1.scope.data[0])
static void scope_demod(struct demod_state *s, float *buffer, int length)
{
float *src, *dst;
int i;
if (s->l1.scope.dispnum == -1)
return;
if (length >= MEMSIZE) {
src = buffer+length-MEMSIZE;
dst = s->l1.scope.data;
i = MEMSIZE;
} else {
i = MEMSIZE-length;
memmove(s->l1.scope.data, s->l1.scope.data+i,
i*sizeof(s->l1.scope.data[0]));
src = buffer;
dst = s->l1.scope.data+i;
i = length;
}
s->l1.scope.datalen += i;
memcpy(dst, src, i*sizeof(s->l1.scope.data[0]));
if (s->l1.scope.datalen < MEMSIZE)
return;
if (xdisp_update(s->l1.scope.dispnum, s->l1.scope.data))
s->l1.scope.datalen = 0;
}
/* ---------------------------------------------------------------------- */
const struct demod_param demod_scope = {
"SCOPE", SAMPLING_RATE, 0, scope_init, scope_demod
};
/* ---------------------------------------------------------------------- */
@@ -1,8 +0,0 @@
fifsk96.o
fifsk96.p
fifsk96.g
72
hamming
0
66150
0 6100 1.000
File diff suppressed because it is too large Load Diff
@@ -1,43 +0,0 @@
float fir_coeff[72] = {
0.000709, 0.000686, 0.000440, -0.000018,
-0.000618, -0.001198, -0.001520, -0.001332,
-0.000493, 0.000909, 0.002494, 0.003648,
0.003711, 0.002258, -0.000630, -0.004235,
-0.007308, -0.008433, -0.006559, -0.001538,
0.005567, 0.012568, 0.016708, 0.015557,
0.008024, -0.004897, -0.019931, -0.032062,
-0.035748, -0.026514, -0.002471, 0.034724,
0.079822, 0.124956, 0.161417, 0.181779,
0.181779, 0.161417, 0.124956, 0.079822,
0.034724, -0.002471, -0.026514, -0.035748,
-0.032062, -0.019931, -0.004897, 0.008024,
0.015557, 0.016708, 0.012568, 0.005567,
-0.001538, -0.006559, -0.008433, -0.007308,
-0.004235, -0.000630, 0.002258, 0.003711,
0.003648, 0.002494, 0.000909, -0.000493,
-0.001332, -0.001520, -0.001198, -0.000618,
-0.000018, 0.000440, 0.000686, 0.000709
};
#include <stdio.h>
#define UPSAMP 3
#define FILTLEN (sizeof(fir_coeff)/sizeof(fir_coeff[0])/UPSAMP)
void main(void)
{
const float *f;
int i, j;
printf("#define FILTLEN %d\n"
"#define UPSAMP %d\n"
"static const float inp_filt[%d][%d] = {\n\t", FILTLEN, UPSAMP, UPSAMP, FILTLEN);
for (i = 0; i < UPSAMP; i++) {
printf("{");
for (j = 0, f = fir_coeff+i; j < FILTLEN; j++, f += UPSAMP)
printf("%10f%s", *f, (j < FILTLEN-1) ? (((j & 3) == 3) ? ",\n\t " : ",") : "");
printf("}%s", (i < UPSAMP-1) ? ",\n\t" : "");
}
printf("\n};\n\n");
exit(0);
}