⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 celp_test.c

📁 g729 coding ipaddressing
💻 C
字号:
/*

			CELP Codec test driver
		
		This program uses the CELP encoder to compress a
        speech file recorded in 16 bit two's complement
		signed PCM into sequence of CELP frames in an output
        file named "test,clp", then uses the CELP decoder
        to synthesise an output file "ofile.spd", also in
        16 bit two's complement PCM.  The PCM files are in
		big-endian order; the program will work regardless
		of byte order of the system on which it is run.
		
*/

#include <stdio.h>
#include <stdlib.h>
#include "celp.h"

#define INFILE  "speech.spd"
#define CLPFILE "test.clp"
#define OUTFILE "ofile.spd"

#define CELP_FRAME	240 		/* PCM samples per CELP frame */

/*	READ_PCM  -- Read 16 bit PCM file in byte-order independent manner.  */

static int read_pcm(FILE *f, short pcmframe[CELP_FRAME])
{
	int i, ch, cl;
	
	for (i = 0; i < CELP_FRAME; i++) {
		ch = getc(f);
		if (ch == EOF) {
			return 0;
		}
		cl = getc(f);
		if (cl == EOF) {
			return 0;
		}
		pcmframe[i] = (ch << 8) | cl;
	}
	return 1;
}

/*	WRITE_PCM  -- Write 16 bit PCM file in byte-order independent manner.  */

static void write_pcm(FILE *f, short pcmframe[CELP_FRAME])
{
	int i;
	
	for (i = 0; i < CELP_FRAME; i++) {
		putc((pcmframe[i] >> 8) & 0xFF, f);
		putc(pcmframe[i] & 0xFF, f);
	}
}

int main(void)
{
    FILE *celp = fopen(CLPFILE, "wb"),
         *synth = fopen(OUTFILE, "wb"),
         *in = fopen(INFILE, "rb");
	short pcmframe[CELP_FRAME];
	char celpframe[18];
	
	if (in == NULL) {
        fprintf(stderr, "Cannot open input file: %s\n", INFILE);
		return 2;
	}
	
	if (celp == NULL) {
        fprintf(stderr, "Cannot create CELP-encoded file: %s\n", CLPFILE);
		return 2;
	}
	
	if (synth == NULL) {
        fprintf(stderr, "Cannot create output PCM file: %s\n", OUTFILE);
		return 2;
	}

	celp_init(1);
	while (read_pcm(in, pcmframe)) {
		celp_encode(pcmframe, celpframe);
		fwrite(celpframe, sizeof celpframe, 1, celp);
	}
	fclose(in);
	fclose(celp);

    celp = fopen(CLPFILE, "rb");
	
	if (celp == NULL) {
        fprintf(stderr, "Cannot reopen CELP-encoded file for reading: %s\n", CLPFILE);
		return 2;
	}
	
	while (fread(celpframe, sizeof celpframe, 1, celp) == 1) {
		celp_decode(celpframe, pcmframe);
		write_pcm(synth, pcmframe);
	}
	fclose(celp);
	fclose(synth);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -