mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-31 20:38:27 +08:00
*** empty log message ***
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user