add feature for bit errors on selected bits

pull/42/head
drowe67 2022-01-01 10:18:33 +10:30 committed by David Rowe
parent d72e424045
commit 5916f9d7af
1 changed files with 19 additions and 6 deletions

View File

@ -62,7 +62,8 @@ int main(int argc, char **argv) {
float *vq = pred_vq; float *vq = pred_vq;
int logmag = 0; int logmag = 0;
int vq_type = LPCNET_PRED; int vq_type = LPCNET_PRED;
int ber_st=0, ber_en=-1;
fin = stdin; fin = stdin;
fout = stdout; fout = stdout;
@ -72,6 +73,8 @@ int main(int argc, char **argv) {
{"infile", required_argument, 0, 'i'}, {"infile", required_argument, 0, 'i'},
{"outfile", required_argument, 0, 'u'}, {"outfile", required_argument, 0, 'u'},
{"ber", required_argument, 0, 'b'}, {"ber", required_argument, 0, 'b'},
{"ber_st", required_argument, 0, 'c'},
{"ber_en", required_argument, 0, 'e'},
{"decimate", required_argument, 0, 'd'}, {"decimate", required_argument, 0, 'd'},
{"nnet", required_argument, 0, 'r'}, {"nnet", required_argument, 0, 'r'},
{"numstages", required_argument, 0, 'n'}, {"numstages", required_argument, 0, 'n'},
@ -86,7 +89,7 @@ int main(int argc, char **argv) {
int c; int c;
int opt_index = 0; int opt_index = 0;
while ((c = getopt_long (argc, argv, "b:d:n:o:p:sxvi:u:r:", long_options, &opt_index)) != -1) { while ((c = getopt_long (argc, argv, "b:c:e:d:n:o:p:sxvi:u:r:", long_options, &opt_index)) != -1) {
switch (c) { switch (c) {
case 'i': case 'i':
if ((fin = fopen(optarg, "rb")) == NULL) { if ((fin = fopen(optarg, "rb")) == NULL) {
@ -104,10 +107,16 @@ int main(int argc, char **argv) {
ber = atof(optarg); ber = atof(optarg);
fprintf(stderr, "BER = %f\n", ber); fprintf(stderr, "BER = %f\n", ber);
break; break;
case 'c':
ber_st = atoi(optarg);
break;
case 'd': case 'd':
dec = atoi(optarg); dec = atoi(optarg);
fprintf(stderr, "dec = %d\n", dec); fprintf(stderr, "dec = %d\n", dec);
break; break;
case 'e':
ber_en = atoi(optarg);
break;
case 'n': case 'n':
num_stages = atoi(optarg); num_stages = atoi(optarg);
fprintf(stderr, "%d VQ stages\n", num_stages); fprintf(stderr, "%d VQ stages\n", num_stages);
@ -140,6 +149,8 @@ int main(int argc, char **argv) {
default: default:
fprintf(stderr,"usage: %s [Options]:\n", argv[0]); fprintf(stderr,"usage: %s [Options]:\n", argv[0]);
fprintf(stderr," [-b --ber BER]\n"); fprintf(stderr," [-b --ber BER]\n");
fprintf(stderr," [--ber_st bit Bit in frame where we start inserting errors (default 0)]\n");
fprintf(stderr," [--ber_en bit Bit in frame just after we stop inserting errors (default 51)]\n");
fprintf(stderr," [-d --decimation 1/2/3...]\n"); fprintf(stderr," [-d --decimation 1/2/3...]\n");
fprintf(stderr," [-n --numstages]\n [-o --pitchbits nBits]\n"); fprintf(stderr," [-n --numstages]\n [-o --pitchbits nBits]\n");
fprintf(stderr," [-p --pred predCoff]\n"); fprintf(stderr," [-p --pred predCoff]\n");
@ -168,14 +179,15 @@ int main(int argc, char **argv) {
char frame[q->bits_per_frame]; char frame[q->bits_per_frame];
int bits_read = 0; int bits_read = 0;
short pcm[lpcnet_samples_per_frame(lf)]; short pcm[lpcnet_samples_per_frame(lf)];
if (ber_en == -1) ber_en = q->bits_per_frame-1;
do { do {
bits_read = fread(frame, sizeof(char), q->bits_per_frame, fin); bits_read = fread(frame, sizeof(char), q->bits_per_frame, fin);
nbits += bits_read; nbits += ber_en - ber_st;
if (ber != 0.0) { if (ber != 0.0) {
int i; int i;
for(i=0; i<q->bits_per_frame; i++) { for(i=ber_st; i<=ber_en; i++) {
float r = (float)rand()/RAND_MAX; float r = (float)rand()/RAND_MAX;
if (r < ber) { if (r < ber) {
frame[i] = (frame[i] ^ 1) & 0x1; frame[i] = (frame[i] ^ 1) & 0x1;
@ -197,6 +209,7 @@ int main(int argc, char **argv) {
lpcnet_freedv_destroy(lf); lpcnet_freedv_destroy(lf);
if (ber != 0.0) if (ber != 0.0)
fprintf(stderr, "nbits: %d nerr: %d BER: %4.3f\n", nbits, nerrs, (float)nerrs/nbits); fprintf(stderr, "ber_st: %d ber_en: %d nbits: %d nerr: %d BER: %4.3f\n", ber_st, ber_en,
nbits, nerrs, (float)nerrs/nbits);
return 0; return 0;
} }