int main(int argc, char *argv[]) { struct CODEC2 *codec2; FILE *fin; FILE *fout; short *buf; unsigned char *bits; int nsam, nbit, i, r; for(i=0; i<10; i++) { r = codec2_rand(); printf("[%d] r = %d\n", i, r); } if (argc != 3) { printf("usage: %s InputRawSpeechFile OutputRawSpeechFile\n", argv[0]); exit(1); } if ( (fin = fopen(argv[1],"rb")) == NULL ) { fprintf(stderr, "Error opening input speech file: %s: %s.\n", argv[1], strerror(errno)); exit(1); } if ( (fout = fopen(argv[2],"wb")) == NULL ) { fprintf(stderr, "Error opening output speech file: %s: %s.\n", argv[2], strerror(errno)); exit(1); } #ifdef DUMP dump_on("c2demo"); #endif /* Note only one set of Codec 2 states is required for an encoder and decoder pair. */ codec2 = codec2_create(CODEC2_MODE_1300); nsam = codec2_samples_per_frame(codec2); buf = (short*)malloc(nsam*sizeof(short)); nbit = codec2_bits_per_frame(codec2); bits = (unsigned char*)malloc(nbit*sizeof(char)); while(fread(buf, sizeof(short), nsam, fin) == (size_t)nsam) { codec2_encode(codec2, bits, buf); codec2_decode(codec2, buf, bits); fwrite(buf, sizeof(short), nsam, fout); } free(buf); free(bits); codec2_destroy(codec2); fclose(fin); fclose(fout); return 0; }
void postfilter( MODEL *model, float *bg_est ) { int m, uv; float e, thresh; /* determine average energy across spectrum */ e = 1E-12; for(m=1; m<=model->L; m++) e += model->A[m]*model->A[m]; assert(e > 0.0); e = 10.0*log10f(e/model->L); /* If beneath threhold, update bg estimate. The idea of the threshold is to prevent updating during high level speech. */ if ((e < BG_THRESH) && !model->voiced) *bg_est = *bg_est*(1.0 - BG_BETA) + e*BG_BETA; /* now mess with phases during voiced frames to make any harmonics less then our background estimate unvoiced. */ uv = 0; thresh = powf(10.0, (*bg_est + BG_MARGIN)/20.0); if (model->voiced) for(m=1; m<=model->L; m++) if (model->A[m] < thresh) { model->phi[m] = TWO_PI*(float)codec2_rand()/CODEC2_RAND_MAX; uv++; } #ifdef DUMP dump_bg(e, *bg_est, 100.0*uv/model->L); #endif }