Add files via upload
parent
e5dd1108e0
commit
252da45c4e
855
dump.c
855
dump.c
|
@ -1,676 +1,179 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
|
||||
FILE........: dump.c
|
||||
AUTHOR......: David Rowe
|
||||
DATE CREATED: 25/8/09
|
||||
|
||||
Routines to dump data to text files for Octave analysis.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||
published by the Free Software Foundation. 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 Lesser General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "defines.h"
|
||||
#include "comp.h"
|
||||
#include "dump.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#ifdef __EMBEDDED__
|
||||
#include "gdb_stdio.h"
|
||||
#define fprintf gdb_stdio_fprintf
|
||||
#define fopen gdb_stdio_fopen
|
||||
#define fclose gdb_stdio_fclose
|
||||
#endif
|
||||
|
||||
#ifdef DUMP
|
||||
static int dumpon = 0;
|
||||
|
||||
static FILE *fsn = NULL;
|
||||
static FILE *fsw = NULL;
|
||||
static FILE *few = NULL;
|
||||
static FILE *fsw_ = NULL;
|
||||
static FILE *fsoftdec = NULL;
|
||||
static FILE *fmodel = NULL;
|
||||
static FILE *fqmodel = NULL;
|
||||
static FILE *fpwb = NULL;
|
||||
static FILE *fpw = NULL;
|
||||
static FILE *frw = NULL;
|
||||
static FILE *flsp = NULL;
|
||||
static FILE *fweights = NULL;
|
||||
static FILE *flsp_ = NULL;
|
||||
static FILE *fmel = NULL;
|
||||
static FILE *fmel_indexes = NULL;
|
||||
static FILE *fphase = NULL;
|
||||
static FILE *fphase_ = NULL;
|
||||
static FILE *ffw = NULL;
|
||||
static FILE *fe = NULL;
|
||||
static FILE *fsq = NULL;
|
||||
static FILE *fdec = NULL;
|
||||
static FILE *fsnr = NULL;
|
||||
static FILE *flpcsnr = NULL;
|
||||
static FILE *fak = NULL;
|
||||
static FILE *fak_ = NULL;
|
||||
static FILE *fbg = NULL;
|
||||
static FILE *fE = NULL;
|
||||
static FILE *frk = NULL;
|
||||
static FILE *fhephase = NULL;
|
||||
|
||||
static char prefix[MAX_STR];
|
||||
|
||||
void dump_on(char p[]) {
|
||||
dumpon = 1;
|
||||
strcpy(prefix, p);
|
||||
}
|
||||
|
||||
void dump_off(){
|
||||
if (fsn != NULL)
|
||||
fclose(fsn);
|
||||
if (fsw != NULL)
|
||||
fclose(fsw);
|
||||
if (fsw_ != NULL)
|
||||
fclose(fsw_);
|
||||
if (few != NULL)
|
||||
fclose(few);
|
||||
if (fmodel != NULL)
|
||||
fclose(fmodel);
|
||||
if (fsoftdec != NULL)
|
||||
fclose(fsoftdec);
|
||||
if (fqmodel != NULL)
|
||||
fclose(fqmodel);
|
||||
if (fpwb != NULL)
|
||||
fclose(fpwb);
|
||||
if (fpw != NULL)
|
||||
fclose(fpw);
|
||||
if (frw != NULL)
|
||||
fclose(frw);
|
||||
if (flsp != NULL)
|
||||
fclose(flsp);
|
||||
if (fweights != NULL)
|
||||
fclose(fweights);
|
||||
if (flsp_ != NULL)
|
||||
fclose(flsp_);
|
||||
if (fmel != NULL)
|
||||
fclose(fmel);
|
||||
if (fmel_indexes != NULL)
|
||||
fclose(fmel_indexes);
|
||||
if (fphase != NULL)
|
||||
fclose(fphase);
|
||||
if (fphase_ != NULL)
|
||||
fclose(fphase_);
|
||||
if (ffw != NULL)
|
||||
fclose(ffw);
|
||||
if (fe != NULL)
|
||||
fclose(fe);
|
||||
if (fsq != NULL)
|
||||
fclose(fsq);
|
||||
if (fdec != NULL)
|
||||
fclose(fdec);
|
||||
if (fsnr != NULL)
|
||||
fclose(fsnr);
|
||||
if (flpcsnr != NULL)
|
||||
fclose(flpcsnr);
|
||||
if (fak != NULL)
|
||||
fclose(fak);
|
||||
if (fak_ != NULL)
|
||||
fclose(fak_);
|
||||
if (fbg != NULL)
|
||||
fclose(fbg);
|
||||
if (fE != NULL)
|
||||
fclose(fE);
|
||||
if (frk != NULL)
|
||||
fclose(frk);
|
||||
if (fhephase != NULL)
|
||||
fclose(fhephase);
|
||||
}
|
||||
|
||||
void dump_Sn(int m_pitch, float Sn[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fsn == NULL) {
|
||||
sprintf(s,"%s_sn.txt", prefix);
|
||||
fsn = fopen(s, "wt");
|
||||
assert(fsn != NULL);
|
||||
}
|
||||
|
||||
/* split across two lines to avoid max line length problems */
|
||||
/* reconstruct in Octave */
|
||||
|
||||
for(i=0; i<m_pitch/2; i++)
|
||||
fprintf(fsn,"%f\t",Sn[i]);
|
||||
fprintf(fsn,"\n");
|
||||
for(i=m_pitch/2; i<m_pitch; i++)
|
||||
fprintf(fsn,"%f\t",Sn[i]);
|
||||
fprintf(fsn,"\n");
|
||||
}
|
||||
|
||||
void dump_Sw(COMP Sw[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fsw == NULL) {
|
||||
sprintf(s,"%s_sw.txt", prefix);
|
||||
fsw = fopen(s, "wt");
|
||||
assert(fsw != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<FFT_ENC/2; i++)
|
||||
fprintf(fsw,"%f\t",
|
||||
10.0*log10(Sw[i].real*Sw[i].real + Sw[i].imag*Sw[i].imag));
|
||||
fprintf(fsw,"\n");
|
||||
}
|
||||
|
||||
void dump_Sw_(COMP Sw_[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fsw_ == NULL) {
|
||||
sprintf(s,"%s_sw_.txt", prefix);
|
||||
fsw_ = fopen(s, "wt");
|
||||
assert(fsw_ != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<FFT_ENC/2; i++)
|
||||
fprintf(fsw_,"%f\t",
|
||||
10.0*log10(Sw_[i].real*Sw_[i].real + Sw_[i].imag*Sw_[i].imag));
|
||||
fprintf(fsw_,"\n");
|
||||
}
|
||||
|
||||
void dump_Ew(COMP Ew[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (few == NULL) {
|
||||
sprintf(s,"%s_ew.txt", prefix);
|
||||
few = fopen(s, "wt");
|
||||
assert(few != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<FFT_ENC/2; i++)
|
||||
fprintf(few,"%f\t",
|
||||
10.0*log10(Ew[i].real*Ew[i].real + Ew[i].imag*Ew[i].imag));
|
||||
fprintf(few,"\n");
|
||||
}
|
||||
|
||||
void dump_softdec(float *softdec, int n)
|
||||
{
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fsoftdec == NULL) {
|
||||
sprintf(s,"%s_softdec.txt", prefix);
|
||||
fsoftdec = fopen(s, "wt");
|
||||
assert(fsoftdec != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<n; i++)
|
||||
fprintf(fsoftdec,"%f\t", softdec[i]);
|
||||
fprintf(fsoftdec,"\n");
|
||||
}
|
||||
|
||||
void dump_model(MODEL *model) {
|
||||
int l;
|
||||
char s[MAX_STR];
|
||||
char line[MAX_STR*10];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fmodel == NULL) {
|
||||
sprintf(s,"%s_model.txt", prefix);
|
||||
fmodel = fopen(s, "wt");
|
||||
assert(fmodel != NULL);
|
||||
}
|
||||
|
||||
sprintf(line,"%12f %12d ", model->Wo, model->L);
|
||||
for(l=1; l<=model->L; l++) {
|
||||
sprintf(s,"%12f ",model->A[l]);
|
||||
strcat(line, s);
|
||||
assert(strlen(line) < MAX_STR*10);
|
||||
}
|
||||
for(l=model->L+1; l<=MAX_AMP; l++) {
|
||||
sprintf(s,"%12f ", 0.0);
|
||||
strcat(line,s);
|
||||
assert(strlen(line) < MAX_STR*10);
|
||||
}
|
||||
|
||||
sprintf(s,"%d\n",model->voiced);
|
||||
strcat(line,s);
|
||||
fprintf(fmodel,"%s",line);
|
||||
}
|
||||
|
||||
void dump_quantised_model(MODEL *model) {
|
||||
int l;
|
||||
char s[MAX_STR];
|
||||
char line[4096];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fqmodel == NULL) {
|
||||
sprintf(s,"%s_qmodel.txt", prefix);
|
||||
fqmodel = fopen(s, "wt");
|
||||
assert(fqmodel != NULL);
|
||||
}
|
||||
|
||||
sprintf(line,"%12f %12d ", model->Wo, model->L);
|
||||
for(l=1; l<=model->L; l++) {
|
||||
sprintf(s,"%12f ",model->A[l]);
|
||||
strcat(line, s);
|
||||
assert(strlen(line) < 4096);
|
||||
}
|
||||
for(l=model->L+1; l<=MAX_AMP; l++) {
|
||||
sprintf(s,"%12f ", 0.0);
|
||||
strcat(line, s);
|
||||
assert(strlen(line) < 4096);
|
||||
}
|
||||
|
||||
sprintf(s,"%d\n",model->voiced);
|
||||
strcat(line, s);
|
||||
fprintf(fqmodel, "%s", line);
|
||||
}
|
||||
|
||||
void dump_phase(float phase[], int L) {
|
||||
int l;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fphase == NULL) {
|
||||
sprintf(s,"%s_phase.txt", prefix);
|
||||
fphase = fopen(s, "wt");
|
||||
assert(fphase != NULL);
|
||||
}
|
||||
|
||||
for(l=1; l<=L; l++)
|
||||
fprintf(fphase,"%f\t",phase[l]);
|
||||
for(l=L+1; l<=MAX_AMP; l++)
|
||||
fprintf(fphase,"%f\t",0.0);
|
||||
fprintf(fphase,"\n");
|
||||
}
|
||||
|
||||
void dump_phase_(float phase_[], int L) {
|
||||
int l;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fphase_ == NULL) {
|
||||
sprintf(s,"%s_phase_.txt", prefix);
|
||||
fphase_ = fopen(s, "wt");
|
||||
assert(fphase_ != NULL);
|
||||
}
|
||||
|
||||
for(l=1; l<=L; l++)
|
||||
fprintf(fphase_,"%f\t",phase_[l]);
|
||||
for(l=L+1; l<MAX_AMP; l++)
|
||||
fprintf(fphase_,"%f\t",0.0);
|
||||
fprintf(fphase_,"\n");
|
||||
}
|
||||
|
||||
|
||||
void dump_hephase(int ind[], int dim) {
|
||||
int m;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fhephase == NULL) {
|
||||
sprintf(s,"%s_hephase.txt", prefix);
|
||||
fhephase = fopen(s, "wt");
|
||||
assert(fhephase != NULL);
|
||||
}
|
||||
|
||||
for(m=0; m<dim; m++)
|
||||
fprintf(fhephase,"%d\t",ind[m]);
|
||||
fprintf(fhephase,"\n");
|
||||
}
|
||||
|
||||
|
||||
void dump_snr(float snr) {
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fsnr == NULL) {
|
||||
sprintf(s,"%s_snr.txt", prefix);
|
||||
fsnr = fopen(s, "wt");
|
||||
assert(fsnr != NULL);
|
||||
}
|
||||
|
||||
fprintf(fsnr,"%f\n",snr);
|
||||
}
|
||||
|
||||
void dump_lpc_snr(float snr) {
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (flpcsnr == NULL) {
|
||||
sprintf(s,"%s_lpc_snr.txt", prefix);
|
||||
flpcsnr = fopen(s, "wt");
|
||||
assert(flpcsnr != NULL);
|
||||
}
|
||||
|
||||
fprintf(flpcsnr,"%f\n",snr);
|
||||
}
|
||||
|
||||
/* Pw "before" post filter so we can plot before and after */
|
||||
|
||||
void dump_Pwb(float Pwb[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fpwb == NULL) {
|
||||
sprintf(s,"%s_pwb.txt", prefix);
|
||||
fpwb = fopen(s, "wt");
|
||||
assert(fpwb != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<FFT_ENC/2; i++)
|
||||
fprintf(fpwb,"%f\t",Pwb[i]);
|
||||
fprintf(fpwb,"\n");
|
||||
}
|
||||
|
||||
void dump_Pw(float Pw[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fpw == NULL) {
|
||||
sprintf(s,"%s_pw.txt", prefix);
|
||||
fpw = fopen(s, "wt");
|
||||
assert(fpw != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<FFT_ENC/2; i++)
|
||||
fprintf(fpw,"%f\t",Pw[i]);
|
||||
fprintf(fpw,"\n");
|
||||
}
|
||||
|
||||
void dump_Rw(float Rw[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (frw == NULL) {
|
||||
sprintf(s,"%s_rw.txt", prefix);
|
||||
frw = fopen(s, "wt");
|
||||
assert(frw != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<FFT_ENC/2; i++)
|
||||
fprintf(frw,"%f\t",Rw[i]);
|
||||
fprintf(frw,"\n");
|
||||
}
|
||||
|
||||
void dump_weights(float w[], int order) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fweights == NULL) {
|
||||
sprintf(s,"%s_weights.txt", prefix);
|
||||
fweights = fopen(s, "wt");
|
||||
assert(fweights != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<order; i++)
|
||||
fprintf(fweights,"%f\t", w[i]);
|
||||
fprintf(fweights,"\n");
|
||||
}
|
||||
|
||||
void dump_lsp(float lsp[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (flsp == NULL) {
|
||||
sprintf(s,"%s_lsp.txt", prefix);
|
||||
flsp = fopen(s, "wt");
|
||||
assert(flsp != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<10; i++)
|
||||
fprintf(flsp,"%f\t",lsp[i]);
|
||||
fprintf(flsp,"\n");
|
||||
}
|
||||
|
||||
void dump_lsp_(float lsp_[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (flsp_ == NULL) {
|
||||
sprintf(s,"%s_lsp_.txt", prefix);
|
||||
flsp_ = fopen(s, "wt");
|
||||
assert(flsp_ != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<10; i++)
|
||||
fprintf(flsp_,"%f\t",lsp_[i]);
|
||||
fprintf(flsp_,"\n");
|
||||
}
|
||||
|
||||
void dump_mel(float mel[], int order) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fmel == NULL) {
|
||||
sprintf(s,"%s_mel.txt", prefix);
|
||||
fmel = fopen(s, "wt");
|
||||
assert(fmel != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<order; i++)
|
||||
fprintf(fmel,"%f\t",mel[i]);
|
||||
fprintf(fmel,"\n");
|
||||
}
|
||||
|
||||
void dump_mel_indexes(int mel_indexes[], int order) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fmel_indexes == NULL) {
|
||||
sprintf(s,"%s_mel_indexes.txt", prefix);
|
||||
fmel_indexes = fopen(s, "wt");
|
||||
assert(fmel_indexes != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<order; i++)
|
||||
fprintf(fmel_indexes,"%d\t",mel_indexes[i]);
|
||||
fprintf(fmel_indexes,"\n");
|
||||
}
|
||||
|
||||
void dump_ak(float ak[], int order) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fak == NULL) {
|
||||
sprintf(s,"%s_ak.txt", prefix);
|
||||
fak = fopen(s, "wt");
|
||||
assert(fak != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<=order; i++)
|
||||
fprintf(fak,"%f\t",ak[i]);
|
||||
fprintf(fak,"\n");
|
||||
}
|
||||
|
||||
void dump_ak_(float ak_[], int order) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fak_ == NULL) {
|
||||
sprintf(s,"%s_ak_.txt", prefix);
|
||||
fak_ = fopen(s, "wt");
|
||||
assert(fak_ != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<=order; i++)
|
||||
fprintf(fak_,"%f\t",ak_[i]);
|
||||
fprintf(fak_,"\n");
|
||||
}
|
||||
|
||||
void dump_Fw(COMP Fw[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (ffw == NULL) {
|
||||
sprintf(s,"%s_fw.txt", prefix);
|
||||
ffw = fopen(s, "wt");
|
||||
assert(ffw != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<256; i++)
|
||||
fprintf(ffw,"%f\t",Fw[i].real);
|
||||
fprintf(ffw,"\n");
|
||||
}
|
||||
|
||||
void dump_e(float e_hz[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fe == NULL) {
|
||||
sprintf(s,"%s_e.txt", prefix);
|
||||
fe = fopen(s, "wt");
|
||||
assert(fe != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<500/2; i++)
|
||||
fprintf(fe,"%f\t",e_hz[i]);
|
||||
fprintf(fe,"\n");
|
||||
for(i=500/2; i<500; i++)
|
||||
fprintf(fe,"%f\t",e_hz[i]);
|
||||
fprintf(fe,"\n");
|
||||
}
|
||||
|
||||
void dump_sq(int m_pitch, float sq[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fsq == NULL) {
|
||||
sprintf(s,"%s_sq.txt", prefix);
|
||||
fsq = fopen(s, "wt");
|
||||
assert(fsq != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<m_pitch/2; i++)
|
||||
fprintf(fsq,"%f\t",sq[i]);
|
||||
fprintf(fsq,"\n");
|
||||
for(i=m_pitch/2; i<m_pitch; i++)
|
||||
fprintf(fsq,"%f\t",sq[i]);
|
||||
fprintf(fsq,"\n");
|
||||
}
|
||||
|
||||
void dump_dec(COMP Fw[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fdec == NULL) {
|
||||
sprintf(s,"%s_dec.txt", prefix);
|
||||
fdec = fopen(s, "wt");
|
||||
assert(fdec != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<320/5; i++)
|
||||
fprintf(fdec,"%f\t",Fw[i].real);
|
||||
fprintf(fdec,"\n");
|
||||
}
|
||||
|
||||
void dump_bg(float e, float bg_est, float percent_uv) {
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fbg == NULL) {
|
||||
sprintf(s,"%s_bg.txt", prefix);
|
||||
fbg = fopen(s, "wt");
|
||||
assert(fbg != NULL);
|
||||
}
|
||||
|
||||
fprintf(fbg,"%f\t%f\t%f\n", e, bg_est, percent_uv);
|
||||
}
|
||||
|
||||
void dump_E(float E) {
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (fE == NULL) {
|
||||
sprintf(s,"%s_E.txt", prefix);
|
||||
fE = fopen(s, "wt");
|
||||
assert(fE != NULL);
|
||||
}
|
||||
|
||||
fprintf(fE,"%f\n", 10.0*log10(E));
|
||||
}
|
||||
|
||||
#if 0
|
||||
void dump_Rk(float Rk[]) {
|
||||
int i;
|
||||
char s[MAX_STR];
|
||||
|
||||
if (!dumpon) return;
|
||||
|
||||
if (frk == NULL) {
|
||||
sprintf(s,"%s_rk.txt", prefix);
|
||||
frk = fopen(s, "wt");
|
||||
assert(frk != NULL);
|
||||
}
|
||||
|
||||
for(i=0; i<P_MAX; i++)
|
||||
fprintf(frk,"%f\t",Rk[i]);
|
||||
fprintf(frk,"\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
//as usual...
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
//internet
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
//port
|
||||
uint16_t port_num=17000; //default port
|
||||
|
||||
//UDP packet
|
||||
uint8_t bits[54];
|
||||
|
||||
//internet
|
||||
struct sockaddr_in si_me, si_other;
|
||||
int s, i, slen = sizeof(si_other) , rcv_len;
|
||||
|
||||
//CRC
|
||||
uint16_t CRC_LUT[256];
|
||||
uint16_t poly=0x5935;
|
||||
|
||||
//test
|
||||
//FILE *fp;
|
||||
|
||||
//stream info
|
||||
struct moip_packet
|
||||
{
|
||||
uint16_t sid;
|
||||
uint8_t src[10];
|
||||
uint8_t dst[10];
|
||||
uint16_t type;
|
||||
uint8_t nonce[14];
|
||||
uint16_t fn;
|
||||
uint8_t payload[16];
|
||||
uint16_t crc_udp;
|
||||
} packet;
|
||||
|
||||
void CRC_Init(uint16_t *crc_table, uint16_t poly)
|
||||
{
|
||||
uint16_t remainder;
|
||||
|
||||
for(uint16_t dividend=0; dividend<256; dividend++)
|
||||
{
|
||||
remainder=dividend<<8;
|
||||
|
||||
for(uint8_t bit=8; bit>0; bit--)
|
||||
{
|
||||
if(remainder&(1<<15))
|
||||
remainder=(remainder<<1)^poly;
|
||||
else
|
||||
remainder=(remainder<<1);
|
||||
}
|
||||
|
||||
crc_table[dividend]=remainder;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t CRC_M17(uint16_t* crc_table, const uint8_t* message, uint16_t nBytes)
|
||||
{
|
||||
uint8_t data;
|
||||
uint16_t remainder=0xFFFF;
|
||||
|
||||
for(uint16_t byte=0; byte<nBytes; byte++)
|
||||
{
|
||||
data=message[byte]^(remainder>>8);
|
||||
remainder=crc_table[data]^(remainder<<8);
|
||||
}
|
||||
|
||||
return(remainder);
|
||||
}
|
||||
|
||||
uint8_t* decode_callsign_base40(uint64_t encoded, uint8_t *callsign)
|
||||
{
|
||||
if(encoded >= 262144000000000)
|
||||
{
|
||||
*callsign=0;
|
||||
return callsign;
|
||||
}
|
||||
|
||||
uint8_t *p = callsign;
|
||||
|
||||
for (; encoded>0; p++)
|
||||
{
|
||||
*p = "xABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/."[encoded % 40];
|
||||
encoded/=40;
|
||||
}
|
||||
|
||||
*p = 0;
|
||||
|
||||
return callsign;
|
||||
}
|
||||
|
||||
// ./this.out port
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if(argc==2)
|
||||
{
|
||||
port_num=atoi(argv[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Not enough args\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
//init
|
||||
memset(bits, 0, 54);
|
||||
CRC_Init(CRC_LUT, poly);
|
||||
|
||||
s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
|
||||
if(s==-1)
|
||||
{
|
||||
fprintf(stderr, "Socket error\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
//zero out the structure
|
||||
memset((char*)&si_me, 0, sizeof(si_me));
|
||||
|
||||
si_me.sin_family = AF_INET;
|
||||
si_me.sin_port = htons(port_num);
|
||||
si_me.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
if(bind(s, (struct sockaddr*)&si_me, sizeof(si_me))==-1)
|
||||
{
|
||||
fprintf(stderr, "Can't bind to port %d\n", port_num);
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("Listening for M17 frames on port %d:\n", port_num);
|
||||
printf("Src\t\tDst\t\tType\tPld\n");
|
||||
|
||||
while(1)
|
||||
{
|
||||
//receive packet via UDP
|
||||
if((rcv_len=recvfrom(s, bits, 54, 0, (struct sockaddr*)&si_other, &slen))==-1)
|
||||
{
|
||||
fprintf(stderr, "What the hell?\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(rcv_len==54)
|
||||
{
|
||||
packet.sid=(bits[4]<<8)|bits[5];
|
||||
uint64_t tmp;
|
||||
tmp=(bits[6]<<(5*8))|(bits[7]<<(4*8))|(bits[8]<<(3*8))|(bits[9]<<(2*8))|(bits[10]<<(1*8))|bits[11];
|
||||
decode_callsign_base40(tmp, packet.src);
|
||||
tmp=(bits[12]<<(5*8))|(bits[13]<<(4*8))|(bits[14]<<(3*8))|(bits[15]<<(2*8))|(bits[16]<<(1*8))|bits[17];
|
||||
decode_callsign_base40(tmp, packet.dst);
|
||||
packet.type=(bits[18]<<8)|bits[19];
|
||||
|
||||
memcpy(packet.nonce, &bits[20], 14);
|
||||
packet.fn=bits[34]<<8|bits[35];
|
||||
memcpy(packet.payload, &bits[36], 16);
|
||||
packet.crc_udp=bits[52]<<8|bits[53];
|
||||
|
||||
//info
|
||||
printf("%s\t\t%s\t\t%04X\t", packet.src, packet.dst, packet.type);
|
||||
for(uint8_t i=0; i<128/8; i++)
|
||||
{
|
||||
printf("%02X", packet.payload[i]);
|
||||
if(i==(128/8-1))
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/*fp=fopen("out.raw", "a");
|
||||
fwrite(speech_buff, 2, 160, fp);
|
||||
fclose(fp);*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue