freeswitch/libs/libcodec2/unittest/genphdata.c
2012-12-20 20:17:20 -06:00

94 lines
1.9 KiB
C

/*
genphdata.c
Generates test phase data for vqtrainph testing.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <assert.h>
#include "../src/defines.h"
typedef struct {
float real;
float imag;
} COMP;
#define NVEC 100000
#define D 2
#define E 8
int main(void) {
FILE *f=fopen("testph.flt", "wb");
int i, m, L, index;
float angle, noisey_angle, pitch, Wo;
COMP c;
COMP sparse_pe[MAX_AMP];
#ifdef TEST1
for(i=0; i<D*E; i++) {
c.real = cos(i*TWO_PI/(M*D));
c.imag = sin(i*TWO_PI/(M*D));
fwrite(&c, sizeof(COMP), 1, f);
}
#endif
#ifdef TEST2
/*
Bunch of random phases, should get std dev per element of
pi/(sqrt(3)*pow(2,b/D)), or 0.321 for (b=5, D=2):
./vqtrainph testph.flt 2 32 test.txt
*/
for(i=0; i<NVEC; i++) {
angle = PI*(1.0 - 2.0*rand()/RAND_MAX);
c.real = cos(angle);
c.imag = sin(angle);
fwrite(&c, sizeof(COMP), 1, f);
}
#endif
#define TEST3
#ifdef TEST3
/*
Data for testing training in sparse phases. No correlation, so
should be same performance as TEST2. Attempting to train a
MAX_AMP/4 = 20 (first 1 kHz) phase quantiser.
*/
angle = 0;
for(i=0; i<NVEC; i++) {
pitch = P_MIN + (P_MAX-P_MIN)*((float)rand()/RAND_MAX);
//pitch = 40;
Wo = TWO_PI/pitch;
L = floor(PI/Wo);
//printf("pitch %f Wo %f L %d\n", pitch, Wo, L);
for(m=0; m<MAX_AMP; m++) {
sparse_pe[m].real = 0.0;
sparse_pe[m].imag = 0.0;
}
angle += PI/8;
for(m=1; m<=L; m++) {
noisey_angle = angle + (PI/16)*(1.0 - 2.0*rand()/RAND_MAX);
//angle = (PI/16)*(1.0 - 2.0*rand()/RAND_MAX);
index = MAX_AMP*m*Wo/PI;
assert(index < MAX_AMP);
sparse_pe[index].real = cos(noisey_angle);
sparse_pe[index].imag = sin(noisey_angle);
}
fwrite(&sparse_pe, sizeof(COMP), MAX_AMP/4, f);
}
#endif
return 0;
}