FreeCalypso > hg > efr-experiments
comparison src/coder.c @ 0:56410792419a
src: original EFR source from ETSI
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Wed, 03 Apr 2024 05:31:37 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:56410792419a |
|---|---|
| 1 /*************************************************************************** | |
| 2 * | |
| 3 * FILE NAME: CODER.C | |
| 4 * | |
| 5 * Main program of the EFR coder at 12.2 kbit/s. | |
| 6 * | |
| 7 * Usage : coder speech_file bitstream_file | |
| 8 * | |
| 9 * Format for speech_file: | |
| 10 * Speech is read from a binary file of 16 bits data. | |
| 11 * | |
| 12 * Format for bitstream_file: | |
| 13 * 244 words (2-byte) containing 244 bits. | |
| 14 * Bit 0 = 0x0000 and Bit 1 = 0x0001 | |
| 15 * One word (2-byte) for voice activity decision (VAD) flag bit | |
| 16 * 0x0000 -> inactive (no detected speech activity); | |
| 17 * 0x0001 -> active | |
| 18 * One word (2-byte) for speech (SP) flag bit | |
| 19 * 0x0000 -> inactive (no transmission of speech frames); | |
| 20 * 0x0001 -> active | |
| 21 * | |
| 22 ***************************************************************************/ | |
| 23 | |
| 24 #include <stdio.h> | |
| 25 #include <stdlib.h> | |
| 26 #include <string.h> | |
| 27 #include "typedef.h" | |
| 28 #include "basic_op.h" | |
| 29 #include "sig_proc.h" | |
| 30 #include "count.h" | |
| 31 #include "codec.h" | |
| 32 #include "cnst.h" | |
| 33 #include "n_stack.h" | |
| 34 #include "e_homing.h" | |
| 35 | |
| 36 #include "dtx.h" | |
| 37 | |
| 38 Word16 dtx_mode; | |
| 39 extern Word16 txdtx_ctrl; | |
| 40 | |
| 41 /* L_FRAME, M, PRM_SIZE, AZ_SIZE, SERIAL_SIZE: defined in "cnst.h" */ | |
| 42 | |
| 43 int main (int argc, char *argv[]) | |
| 44 { | |
| 45 FILE *f_speech; /* File of speech data */ | |
| 46 FILE *f_serial; /* File of serial bits for transmission */ | |
| 47 | |
| 48 extern Word16 *new_speech; /* Pointer to new speech data */ | |
| 49 | |
| 50 Word16 prm[PRM_SIZE]; /* Analysis parameters. */ | |
| 51 Word16 serial[SERIAL_SIZE-1];/* Output bitstream buffer */ | |
| 52 Word16 syn[L_FRAME]; /* Buffer for synthesis speech */ | |
| 53 | |
| 54 Word16 frame; | |
| 55 | |
| 56 Word16 vad, sp; | |
| 57 | |
| 58 Word16 reset_flag; | |
| 59 Word16 i; | |
| 60 | |
| 61 proc_head ("Encoder"); | |
| 62 | |
| 63 /*----------------------------------------------------------------------* | |
| 64 * Open speech file and result file (output serial bit stream) * | |
| 65 *----------------------------------------------------------------------*/ | |
| 66 | |
| 67 if ((argc < 3) || (argc > 4)) | |
| 68 { | |
| 69 fprintf (stderr, | |
| 70 " Usage:\n\n coder speech_file bitstream_file <dtx|nodtx>\n"); | |
| 71 fprintf (stderr, "\n"); | |
| 72 exit (1); | |
| 73 } | |
| 74 if ((f_speech = fopen (argv[1], "rb")) == NULL) | |
| 75 { | |
| 76 fprintf (stderr, "Error opening input file %s !!\n", argv[1]); | |
| 77 exit (0); | |
| 78 } | |
| 79 fprintf (stderr, " Input speech file: %s\n", argv[1]); | |
| 80 | |
| 81 if ((f_serial = fopen (argv[2], "wb")) == NULL) | |
| 82 { | |
| 83 fprintf (stderr,"Error opening output bitstream file %s !!\n",argv[2]); | |
| 84 exit (0); | |
| 85 } | |
| 86 fprintf (stderr, " Output bitstream file: %s\n", argv[2]); | |
| 87 | |
| 88 dtx_mode = 0; /* DTX disabled by default */ | |
| 89 | |
| 90 if (argc == 4) | |
| 91 { | |
| 92 if (strcmp (argv[3], "nodtx") == 0) | |
| 93 { | |
| 94 dtx_mode = 0; | |
| 95 } | |
| 96 else if (strcmp (argv[3], "dtx") == 0) | |
| 97 { | |
| 98 dtx_mode = 1; | |
| 99 } | |
| 100 else | |
| 101 { | |
| 102 fprintf (stderr, "\nWrong DTX switch: %s !!\n", argv[3]); | |
| 103 exit (1); | |
| 104 } | |
| 105 } | |
| 106 if (dtx_mode == 1) | |
| 107 { | |
| 108 fprintf (stderr, " DTX: enabled\n"); | |
| 109 } | |
| 110 else | |
| 111 { | |
| 112 fprintf (stderr, " DTX: disabled\n"); | |
| 113 } | |
| 114 | |
| 115 /*-----------------------------------------------------------------------* | |
| 116 * Initialisation of the coder. * | |
| 117 *-----------------------------------------------------------------------*/ | |
| 118 | |
| 119 reset_enc (); /* Bring the encoder, VAD and DTX to the initial state */ | |
| 120 | |
| 121 Init_WMOPS_counter (); | |
| 122 | |
| 123 /* Loop for each "L_FRAME" speech data. */ | |
| 124 | |
| 125 frame = 0; | |
| 126 while (fread (new_speech, sizeof (Word16), L_FRAME, f_speech) == L_FRAME) | |
| 127 { | |
| 128 #if(WMOPS) | |
| 129 fprintf (stderr, "frame=%d ", ++frame); | |
| 130 #else | |
| 131 fprintf (stderr, "\nframe=%d ", ++frame); | |
| 132 #endif | |
| 133 | |
| 134 /* Check whether this frame is an encoder homing frame */ | |
| 135 reset_flag = encoder_homing_frame_test (new_speech); | |
| 136 | |
| 137 #if (WMOPS) | |
| 138 Reset_WMOPS_counter (); /* reset WMOPS counter for the new frame */ | |
| 139 #endif | |
| 140 | |
| 141 for (i = 0; i < L_FRAME; i++) /* Delete the 3 LSBs (13-bit input) */ | |
| 142 { | |
| 143 new_speech[i] = new_speech[i] & 0xfff8; logic16 (); move16 (); | |
| 144 } | |
| 145 | |
| 146 Pre_Process (new_speech, L_FRAME); /* filter + downscaling */ | |
| 147 | |
| 148 #if (WMOPS) | |
| 149 fwc (); /* function worst case */ | |
| 150 #endif | |
| 151 | |
| 152 Coder_12k2 (prm, syn); /* Find speech parameters */ | |
| 153 | |
| 154 test (); logic16 (); | |
| 155 if ((txdtx_ctrl & TX_SP_FLAG) == 0) | |
| 156 { | |
| 157 /* Write comfort noise parameters into the parameter frame. | |
| 158 Use old parameters in case SID frame is not to be updated */ | |
| 159 CN_encoding (prm, txdtx_ctrl); | |
| 160 } | |
| 161 Prm2bits_12k2 (prm, &serial[0]); /* Parameters to serial bits */ | |
| 162 | |
| 163 #if (WMOPS) | |
| 164 fwc (); /* function worst case */ | |
| 165 #endif | |
| 166 | |
| 167 test (); logic16 (); | |
| 168 if ((txdtx_ctrl & TX_SP_FLAG) == 0) | |
| 169 { | |
| 170 /* Insert SID codeword into the serial parameter frame */ | |
| 171 sid_codeword_encoding (&serial[0]); | |
| 172 } | |
| 173 | |
| 174 #if (WMOPS) | |
| 175 fwc (); /* function worst case */ | |
| 176 #endif | |
| 177 | |
| 178 #if (WMOPS) | |
| 179 WMOPS_output (dtx_mode);/* output speech encoder WMOPS values | |
| 180 for current frame */ | |
| 181 #endif | |
| 182 | |
| 183 /* Write the bit stream to file */ | |
| 184 fwrite (serial, sizeof (Word16), (SERIAL_SIZE-1), f_serial); | |
| 185 | |
| 186 /* Write the VAD- and SP-flags to file after the speech | |
| 187 parameter bit stream */ | |
| 188 vad = 0; | |
| 189 sp = 0; | |
| 190 | |
| 191 if ((txdtx_ctrl & TX_VAD_FLAG) != 0) | |
| 192 { | |
| 193 vad = 1; | |
| 194 } | |
| 195 if ((txdtx_ctrl & TX_SP_FLAG) != 0) | |
| 196 { | |
| 197 sp = 1; | |
| 198 } | |
| 199 fwrite (&vad, sizeof (Word16), 1, f_serial); | |
| 200 fwrite (&sp, sizeof (Word16), 1, f_serial); | |
| 201 | |
| 202 if (reset_flag != 0) | |
| 203 { | |
| 204 reset_enc (); /*Bring the encoder, VAD and DTX to the home state */ | |
| 205 } | |
| 206 } | |
| 207 | |
| 208 return (0); | |
| 209 } |
