bitperchar option to make feeding ofdm_mod easier
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 19 Apr 2018 03:30:18 +0000 (03:30 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 19 Apr 2018 03:30:18 +0000 (03:30 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3502 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/c2dec.c
codec2-dev/src/c2enc.c

index b80c026a84f7341abbbc73c664b090490d3cce06..cbcd2ee7fb768304caf215887f52d7a8adaefaf2 100644 (file)
@@ -53,12 +53,13 @@ int main(int argc, char *argv[])
     short         *buf;
     unsigned char *bits;
     float         *softdec_bits;
+    char          *bitperchar_bits;
     int            nsam, nbit, nbyte, i, byte, frames, bits_proc, bit_errors, error_mode;
     int            nstart_bit, nend_bit, bit_rate;
     int            state, next_state;
     float          ber, r, burst_length, burst_period, burst_timer, ber_est;
     unsigned char  mask;
-    int            natural, softdec, bit, ret;
+    int            natural, softdec, bit, ret, bitperchar;
 #ifdef DUMP
     int dump;
 #endif
@@ -72,6 +73,7 @@ int main(int argc, char *argv[])
         { "berfile", required_argument, NULL, 0 },
         { "natural", no_argument, &natural, 1 },
         { "softdec", no_argument, &softdec, 1 },
+        { "bitperchar", no_argument, &bitperchar, 1 },
         #ifdef DUMP
         { "dump", required_argument, &dump, 1 },
         #endif
@@ -98,6 +100,8 @@ int main(int argc, char *argv[])
        exit(1);
     }
 
+    mode = -1;
+    
     // Attempt to detect a .c2 file with a header
     struct c2_header in_hdr;
     char *ext = strrchr(argv[2], '.');
@@ -152,19 +156,21 @@ int main(int argc, char *argv[])
     ber = 0.0;
     burst_length = burst_period = 0.0;
     burst_timer = 0.0;
-    natural = softdec = 0;
+    natural = softdec = bitperchar = 0;
     report_energy = 0;
 #ifdef DUMP
     dump = 0;
 #endif
 
     codec2 = codec2_create(mode);
+    assert(codec2 != NULL);
     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));
     softdec_bits = (float*)malloc(nbit*sizeof(float));
+    bitperchar_bits = (char*)malloc(nbit*sizeof(char));
     frames = bit_errors = bits_proc = 0;
     nstart_bit = 0;
     nend_bit = nbit-1;
@@ -218,10 +224,15 @@ int main(int argc, char *argv[])
     //printf("%d %d\n", nstart_bit, nend_bit);
 
     //fprintf(stderr, "softdec: %d natural: %d\n", softdec, natural);
-    if (softdec)
+    if (softdec) {
         ret = (fread(softdec_bits, sizeof(float), nbit, fin) == (size_t)nbit);
-    else
+    }
+    if (bitperchar) {
+        ret = (fread(bitperchar_bits, sizeof(char), nbit, fin) == (size_t)nbit);
+    }
+    if (!softdec && !bitperchar) {
         ret = (fread(bits, sizeof(char), nbyte, fin) == (size_t)nbyte);
+    }
 
     while(ret) {
        frames++;
@@ -310,6 +321,21 @@ int main(int argc, char *argv[])
             codec2_set_softdec(codec2, softdec_bits);
         }
 
+        if (bitperchar) {
+            /* pack bits, MSB received first  */
+
+            bit = 7; byte = 0;
+            memset(bits, 0, nbyte);
+            for(i=0; i<nbit; i++) {
+                bits[byte] |= bitperchar_bits[i] << bit;
+                bit--;
+                if (bit < 0) {
+                    bit = 7;
+                    byte++;
+                }
+            }
+        }
+
         if (report_energy)
            fprintf(stderr, "Energy: %1.3f\n", codec2_get_energy(codec2, bits));
 
@@ -322,10 +348,15 @@ int main(int argc, char *argv[])
         if (fout == stdout) fflush(stdout);
         if (fin == stdin) fflush(stdin);
 
-        if (softdec)
+        if (softdec) {
             ret = (fread(softdec_bits, sizeof(float), nbit, fin) == (size_t)nbit);
-        else
+        }
+        if (bitperchar) {
+            ret = (fread(bitperchar_bits, sizeof(char), nbit, fin) == (size_t)nbit);
+        }
+        if (!softdec && !bitperchar) {
             ret = (fread(bits, sizeof(char), nbyte, fin) == (size_t)nbyte);
+        }
     }
 
     if (error_mode)
@@ -336,6 +367,7 @@ int main(int argc, char *argv[])
     free(buf);
     free(bits);
     free(softdec_bits);
+    free(bitperchar_bits);
     fclose(fin);
     fclose(fout);
 
@@ -347,7 +379,7 @@ void print_help(const struct option* long_options, int num_opts, char* argv[])
        int i;
        char *option_parameters;
        fprintf(stderr, "\nc2dec - Codec 2 decoder and bit error simulation program\n"
-               "usage: %s 3200|2400|1600|1400|1300|1200|700|700B|WB InputFile OutputRawFile [OPTIONS]\n\n"
+               "usage: %s 3200|2400|1600|1400|1300|1200|700|700B|700C InputFile OutputRawFile [OPTIONS]\n\n"
                 "Options:\n", argv[0]);
         for(i=0; i<num_opts-1; i++) {
                if(long_options[i].has_arg == no_argument) {
index c33c2108f7d5c3d9be156ce3e4371d526f5e6ebe..ba23ca026e19af26c6af3e78f7c8bc3110a5c7ac 100644 (file)
@@ -42,12 +42,13 @@ int main(int argc, char *argv[])
     FILE          *fout;
     short         *buf;
     unsigned char *bits;
-    int            nsam, nbit, nbyte, gray, softdec;
-    float         *unpacked_bits;
+    int            nsam, nbit, nbyte, gray, softdec, bitperchar;
+    float         *unpacked_bits_float;
+    char          *unpacked_bits_char;
     int            bit, byte,i;
 
     if (argc < 4) {
-       printf("usage: c2enc 3200|2400|1600|1400|1300|1200|700|700B|700C|WB InputRawspeechFile OutputBitFile [--natural] [--softdec]\n");
+       printf("usage: c2enc 3200|2400|1600|1400|1300|1200|700|700B|700C|WB InputRawspeechFile OutputBitFile [--natural] [--softdec] [--bitperchar]\n");
        printf("e.g    c2enc 1400 ../raw/hts1a.raw hts1a.c2\n");
        printf("e.g    c2enc 1300 ../raw/hts1a.raw hts1a.c2 --natural\n");
        exit(1);
@@ -114,10 +115,10 @@ int main(int argc, char *argv[])
     nbyte = (nbit + 7) / 8;
 
     bits = (unsigned char*)malloc(nbyte*sizeof(char));
-    unpacked_bits = (float*)malloc(nbit*sizeof(float));
+    unpacked_bits_float = (float*)malloc(nbit*sizeof(float));
+    unpacked_bits_char = (char*)malloc(nbit*sizeof(char));
 
-    gray = 1;
-    softdec = 0;
+    gray = 1; softdec = 0; bitperchar = 0;
     for (i=4; i<argc; i++) {
         if (strcmp(argv[i], "--natural") == 0) {
             gray = 0;
@@ -125,6 +126,9 @@ int main(int argc, char *argv[])
         if (strcmp(argv[i], "--softdec") == 0) {
             softdec = 1;
         }
+        if (strcmp(argv[i], "--bitperchar") == 0) {
+            bitperchar = 1;
+        }
     }
     codec2_set_natural_or_gray(codec2, gray);
     //fprintf(stderr,"gray: %d softdec: %d\n", gray, softdec);
@@ -133,19 +137,25 @@ int main(int argc, char *argv[])
 
        codec2_encode(codec2, bits, buf);
 
-       if (softdec) {
+       if (softdec || bitperchar) {
             /* unpack bits, MSB first, send as soft decision float */
 
             bit = 7; byte = 0;
             for(i=0; i<nbit; i++) {
-                unpacked_bits[i] = 1.0 - 2.0*((bits[byte] >> bit) & 0x1);
+                unpacked_bits_float[i] = 1.0 - 2.0*((bits[byte] >> bit) & 0x1);
+                unpacked_bits_char[i] = (bits[byte] >> bit) & 0x1;
                 bit--;
                 if (bit < 0) {
                     bit = 7;
                     byte++;
                 }
             }
-            fwrite(unpacked_bits, sizeof(float), nbit, fout);
+            if (softdec) {
+                fwrite(unpacked_bits_float, sizeof(float), nbit, fout);
+            }
+            if (bitperchar) {
+                fwrite(unpacked_bits_char, sizeof(char), nbit, fout);
+            }
         }
         else
             fwrite(bits, sizeof(char), nbyte, fout);
@@ -161,7 +171,8 @@ int main(int argc, char *argv[])
 
     free(buf);
     free(bits);
-    free(unpacked_bits);
+    free(unpacked_bits_float);
+    free(unpacked_bits_char);
     fclose(fin);
     fclose(fout);