From: drowe67 Date: Mon, 18 Feb 2013 01:22:30 +0000 (+0000) Subject: errors to range of bits in codec frame, new burst error model X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=1cdf34692eb402f33cabde5cf669dda275cd4304;p=freetel-svn-tracking.git errors to range of bits in codec frame, new burst error model git-svn-id: https://svn.code.sf.net/p/freetel/code@1160 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/src/c2dec.c b/codec2-dev/src/c2dec.c index fd4a04d3..8b2f2eb6 100644 --- a/codec2-dev/src/c2dec.c +++ b/codec2-dev/src/c2dec.c @@ -27,14 +27,16 @@ #include "codec2.h" +#include #include #include #include #include -#define NONE 0 /* no bit errors */ -#define UNIFORM 1 /* random bit errors */ -#define TWO_STATE 2 /* Two state error model */ +#define NONE 0 /* no bit errors */ +#define UNIFORM 1 /* random bit errors */ +#define TWO_STATE 2 /* Two state error model */ +#define UNIFORM_RANGE 3 /* random bit errors over a certain range */ int main(int argc, char *argv[]) { @@ -45,13 +47,15 @@ int main(int argc, char *argv[]) short *buf; unsigned char *bits; int nsam, nbit, nbyte, i, byte, frames, bit_errors, error_mode; + int nstart_bit, nend_bit, bit_rate; int state, next_state; - float ber, r, pstate0, pstate1; + float ber, r, burst_length, burst_period, burst_timer; if (argc < 4) { - printf("basic usage...............: c2dec 3200|2400|1400|1200 InputBitFile OutputRawSpeechFile\n"); - printf("uniform errors usage.......: c2dec 3200|2400|1400|1200 InputBitFile OutputRawSpeechFile uniformBER\n"); - printf("two state fading usage....: c2dec 3200|2400|1400|1200 InputBitFile OutputRawSpeechFile probGood probBad\n"); + printf("basic usage.................: c2dec 3200|2400|1400|1200 InputBitFile OutputRawSpeechFile\n"); + printf("uniform errors usage........: c2dec 3200|2400|1400|1200 InputBitFile OutputRawSpeechFile uniformBER startBit endBit\n"); + printf("uniform error on range usage: c2dec 3200|2400|1400|1200 InputBitFile OutputRawSpeechFile uniformBER\n"); + printf("two state fading usage......: c2dec 3200|2400|1400|1200 InputBitFile OutputRawSpeechFile burstLength burstPeriod\n"); printf("e.g c2dec 1400 hts1a.c2 hts1a_1400.raw\n"); printf("e.g c2dec 1400 hts1a.c2 hts1a_1400.raw 0.9\n"); printf("e.g c2dec 1400 hts1a.c2 hts1a_1400.raw 0.99 0.9\n"); @@ -70,7 +74,8 @@ int main(int argc, char *argv[]) fprintf(stderr, "Error in mode: %s. Must be 4800, 3200, 2400, 1400 or 1200\n", argv[1]); exit(1); } - + bit_rate = atoi(argv[1]); + if (strcmp(argv[2], "-") == 0) fin = stdin; else if ( (fin = fopen(argv[2],"rb")) == NULL ) { fprintf(stderr, "Error opening input bit file: %s: %s.\n", @@ -87,7 +92,18 @@ int main(int argc, char *argv[]) error_mode = NONE; ber = 0.0; - pstate0 = pstate1 = 0.0; + burst_length = burst_period = 0.0; + burst_timer = 0.0; + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + nbit = codec2_bits_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbyte = (nbit + 7) / 8; + bits = (unsigned char*)malloc(nbyte*sizeof(char)); + frames = bit_errors = 0; + nstart_bit = 0; + nend_bit = nbit-1; if (argc == 5) { error_mode = UNIFORM; @@ -96,42 +112,52 @@ int main(int argc, char *argv[]) if (argc == 6) { error_mode = TWO_STATE; - pstate0 = atof(argv[4]); - pstate1 = atof(argv[5]); + burst_length = atof(argv[4]); + burst_period = atof(argv[5]); + nstart_bit = 0; + nend_bit = 2; state = 0; } - codec2 = codec2_create(mode); - nsam = codec2_samples_per_frame(codec2); - nbit = codec2_bits_per_frame(codec2); - buf = (short*)malloc(nsam*sizeof(short)); - nbyte = (nbit + 7) / 8; - bits = (unsigned char*)malloc(nbyte*sizeof(char)); - frames = bit_errors = 0; + if (argc == 7) { + error_mode = UNIFORM_RANGE; + ber = atof(argv[4]); + nstart_bit = atoi(argv[5]); + nend_bit = atoi(argv[6]); + fprintf(stderr, "ber: %f nstart_bit: %d nend_bit: %d\n", ber, nstart_bit, nend_bit); + state = 0; + } + + assert(nend_bit <= nbit); while(fread(bits, sizeof(char), nbyte, fin) == (size_t)nbyte) { frames++; - if (error_mode == UNIFORM) { - for(i=0; i pstate0) + if (burst_timer > (burst_period - burst_length)) next_state = 1; break; @@ -139,18 +165,19 @@ int main(int argc, char *argv[]) /* burst error state - 50% bit error rate */ - for(i=0; i pstate1) + if (burst_timer > burst_period) { + burst_timer = 0.0; next_state = 0; + } break; } @@ -166,7 +193,7 @@ int main(int argc, char *argv[]) if (fin == stdin) fflush(stdin); } - if (ber != 0.0) + if (error_mode) fprintf(stderr, "actual BER: %1.3f\n", (float)bit_errors/(frames*nbit)); codec2_destroy(codec2);