Alexandre Lision | 8af73cb | 2013-12-10 14:11:20 -0500 | [diff] [blame^] | 1 | #ifdef HAVE_CONFIG_H |
| 2 | #include "config.h" |
| 3 | #endif |
| 4 | |
| 5 | #include <speex/speex.h> |
| 6 | #include <stdio.h> |
| 7 | #include <stdlib.h> |
| 8 | #include <speex/speex_callbacks.h> |
| 9 | |
| 10 | #ifdef FIXED_DEBUG |
| 11 | extern long long spx_mips; |
| 12 | #endif |
| 13 | |
| 14 | #define FRAME_SIZE 320 |
| 15 | #include <math.h> |
| 16 | int main(int argc, char **argv) |
| 17 | { |
| 18 | char *inFile, *outFile, *bitsFile; |
| 19 | FILE *fin, *fout, *fbits=NULL; |
| 20 | short in_short[FRAME_SIZE]; |
| 21 | short out_short[FRAME_SIZE]; |
| 22 | float sigpow,errpow,snr, seg_snr=0; |
| 23 | int snr_frames = 0; |
| 24 | char cbits[200]; |
| 25 | int nbBits; |
| 26 | int i; |
| 27 | void *st; |
| 28 | void *dec; |
| 29 | SpeexBits bits; |
| 30 | spx_int32_t tmp; |
| 31 | int bitCount=0; |
| 32 | spx_int32_t skip_group_delay; |
| 33 | SpeexCallback callback; |
| 34 | |
| 35 | sigpow = 0; |
| 36 | errpow = 0; |
| 37 | |
| 38 | st = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_WB)); |
| 39 | dec = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_WB)); |
| 40 | |
| 41 | callback.callback_id = SPEEX_INBAND_CHAR; |
| 42 | callback.func = speex_std_char_handler; |
| 43 | callback.data = stderr; |
| 44 | speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); |
| 45 | |
| 46 | callback.callback_id = SPEEX_INBAND_MODE_REQUEST; |
| 47 | callback.func = speex_std_mode_request_handler; |
| 48 | callback.data = st; |
| 49 | speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); |
| 50 | |
| 51 | tmp=1; |
| 52 | speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); |
| 53 | tmp=0; |
| 54 | speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); |
| 55 | tmp=8; |
| 56 | speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); |
| 57 | tmp=3; |
| 58 | speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); |
| 59 | /*tmp=3; |
| 60 | speex_encoder_ctl(st, SPEEX_SET_HIGH_MODE, &tmp); |
| 61 | tmp=6; |
| 62 | speex_encoder_ctl(st, SPEEX_SET_LOW_MODE, &tmp); |
| 63 | */ |
| 64 | |
| 65 | speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); |
| 66 | speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); |
| 67 | skip_group_delay += tmp; |
| 68 | |
| 69 | |
| 70 | if (argc != 4 && argc != 3) |
| 71 | { |
| 72 | fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); |
| 73 | exit(1); |
| 74 | } |
| 75 | inFile = argv[1]; |
| 76 | fin = fopen(inFile, "rb"); |
| 77 | outFile = argv[2]; |
| 78 | fout = fopen(outFile, "wb+"); |
| 79 | if (argc==4) |
| 80 | { |
| 81 | bitsFile = argv[3]; |
| 82 | fbits = fopen(bitsFile, "wb"); |
| 83 | } |
| 84 | speex_bits_init(&bits); |
| 85 | while (!feof(fin)) |
| 86 | { |
| 87 | fread(in_short, sizeof(short), FRAME_SIZE, fin); |
| 88 | if (feof(fin)) |
| 89 | break; |
| 90 | speex_bits_reset(&bits); |
| 91 | |
| 92 | speex_encode_int(st, in_short, &bits); |
| 93 | nbBits = speex_bits_write(&bits, cbits, 200); |
| 94 | bitCount+=bits.nbBits; |
| 95 | |
| 96 | if (argc==4) |
| 97 | fwrite(cbits, 1, nbBits, fbits); |
| 98 | speex_bits_rewind(&bits); |
| 99 | |
| 100 | speex_decode_int(dec, &bits, out_short); |
| 101 | speex_bits_reset(&bits); |
| 102 | |
| 103 | fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout); |
| 104 | skip_group_delay = 0; |
| 105 | } |
| 106 | fprintf (stderr, "Total encoded size: %d bits\n", bitCount); |
| 107 | speex_encoder_destroy(st); |
| 108 | speex_decoder_destroy(dec); |
| 109 | speex_bits_destroy(&bits); |
| 110 | |
| 111 | rewind(fin); |
| 112 | rewind(fout); |
| 113 | |
| 114 | while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) |
| 115 | && |
| 116 | FRAME_SIZE == fread(out_short, sizeof(short), FRAME_SIZE,fout) ) |
| 117 | { |
| 118 | float s=0, e=0; |
| 119 | for (i=0;i<FRAME_SIZE;++i) { |
| 120 | s += (float)in_short[i] * in_short[i]; |
| 121 | e += ((float)in_short[i]-out_short[i]) * ((float)in_short[i]-out_short[i]); |
| 122 | } |
| 123 | seg_snr += 10*log10((s+160)/(e+160)); |
| 124 | sigpow += s; |
| 125 | errpow += e; |
| 126 | snr_frames++; |
| 127 | } |
| 128 | fclose(fin); |
| 129 | fclose(fout); |
| 130 | |
| 131 | snr = 10 * log10( sigpow / errpow ); |
| 132 | seg_snr /= snr_frames; |
| 133 | fprintf(stderr,"SNR = %f\nsegmental SNR = %f\n",snr, seg_snr); |
| 134 | |
| 135 | #ifdef FIXED_DEBUG |
| 136 | printf ("Total: %f MIPS\n", (float)(1e-6*50*spx_mips/snr_frames)); |
| 137 | #endif |
| 138 | |
| 139 | return 1; |
| 140 | } |