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

📄 io.c

📁 高通的cmda语音压缩算法is96a源代码. 针对自己的dsp将最耗时的c改成汇编就几乎是商用代码了.
💻 C
字号:
/**********************************************************************/
/* QCELP Variable Rate Speech Codec - Simulation of TIA IS96-A, service */
/*     option one for TIA IS95, North American Wideband CDMA Digital  */
/*     Cellular Telephony.                                            */
/*                                                                    */
/* (C) Copyright 1993, QUALCOMM Incorporated                          */
/* QUALCOMM Incorporated                                              */
/* 10555 Sorrento Valley Road                                         */
/* San Diego, CA 92121                                                */
/*                                                                    */
/* Note:  Reproduction and use of this software for the design and    */
/*     development of North American Wideband CDMA Digital            */
/*     Cellular Telephony Standards is authorized by                  */
/*     QUALCOMM Incorporated.  QUALCOMM Incorporated does not         */
/*     authorize the use of this software for any other purpose.      */
/*                                                                    */
/*     The availability of this software does not provide any license */
/*     by implication, estoppel, or otherwise under any patent rights */
/*     of QUALCOMM Incorporated or others covering any use of the     */
/*     contents herein.                                               */
/*                                                                    */
/*     Any copies of this software or derivative works must include   */
/*     this and all other proprietary notices.                        */
/**********************************************************************/
/* io.c - basic file IO for raw binary files */
 
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>

#include"struct.h"

open_binary_input_file(fin, filename)
INTTYPE  *fin;
char *filename;
{
   printf("Binary input file  - %s\n",filename);
   if( (*fin=open(filename,0))== -1) {
       printf( "Error opening file - %s\n", filename);
       exit(-1);
   }
   lseek(*fin, 0, 0);
}

open_binary_output_file(fout, filename)
INTTYPE  *fout;
char *filename;
{
   printf( "Binary output file - %s\n",filename);
   if( ( *fout=creat(filename, 0644) )== -1) {
       printf( "Error opening file - %s\n", filename);
       exit(-1);
   }
   lseek(*fout, 0, 0);
}

/* read_samples - reads "insamples" number of samples from 	*/
/*	binary input file "fin" to float array "inbuf"		*/
/* 	The samples range from -2^15 to 2^15 -1.		*/
/*      Shifts them into a 14 bit dynamic range                 */
/* 	Returns the number of samples read.			*/
INTTYPE read_samples(fin,inbuf,insamples)
INTTYPE   fin;
float *inbuf;
INTTYPE   insamples;
{

    INTTYPE   i;
    INTTYPE   bytes;
    INTTYPE   samplesread;
    short swap;
    short *tmpbuf;

    tmpbuf=(short *)(calloc(insamples, sizeof(short)));

    bytes=read(fin, (char *)tmpbuf, insamples*sizeof(short) );

    samplesread=bytes/sizeof(short);
    for(i=0; i<samplesread; i++){
	swap =(tmpbuf[i]<<8)&0xff00;
	swap|=(tmpbuf[i]>>8)&0x00ff;
	*(inbuf+i)=(float)(swap)/4.0;
    }
    free(tmpbuf);

    return(samplesread);
}

/* write_samples - writes "outsamples" number of samples from	*/
/*	float array "outsamples" to binary output file "fout"	*/
/*      Shifts samples up from 14 bits to 16 bits.              */
/*	Saturates the samples to the allowable range.		*/
/*	Returns the number of samples written.			*/
INTTYPE write_samples(fout,outbuf,outsamples)
INTTYPE   fout;
float *outbuf;
INTTYPE   outsamples;
{

    INTTYPE   bytes;
    INTTYPE   i;
    short swap;
    float ftmp;
    short *tmpbuf;

    tmpbuf= (short *)(calloc(outsamples, sizeof(short)));

    for(i=0; i<outsamples; i++ ){
	ftmp=*(outbuf+i)*4.0;
	ftmp=(ftmp<-32768.0)? -32768.0:ftmp;
	ftmp=(ftmp> 32767.0)?  32767.0:ftmp;
	swap=(short)ftmp;
	tmpbuf[i] =(swap<<8)&0xff00;
	tmpbuf[i]|=(swap>>8)&0x00ff;
    }
    if ((bytes=write(fout, (char *)tmpbuf, outsamples*sizeof(short)))
	   != outsamples*sizeof(short)) {
	printf( "Error writing data to output file\n" );
	exit(-1);
    }

    free(tmpbuf);
    return(bytes/sizeof(short));
}


/* read_data - reads "insamples" number of words from   	*/
/*	binary input file "fin" to int array "inbuf"		*/
/* 	Returns the number of words read.			*/
INTTYPE read_data(fin,inbuf,insamples)
INTTYPE   fin;
INTTYPE   *inbuf;
INTTYPE   insamples;
{

    INTTYPE   i;
    INTTYPE   bytes;
    INTTYPE   samplesread;
    short swap;
    short *tmpbuf;

    tmpbuf=(short *)(calloc(insamples, sizeof(short)));

    bytes=read(fin, (char *)tmpbuf, insamples*sizeof(short) );

    samplesread=bytes/sizeof(short);
    for(i=0; i<samplesread; i++){
	swap =(tmpbuf[i]<<8)&0xff00;
	swap|=(tmpbuf[i]>>8)&0x00ff;
	*(inbuf+i)=(INTTYPE)(swap)&0xffff;
    }
    free(tmpbuf);

    return(samplesread);
}

/* write_data - writes "outsamples" number of words from	*/
/*	int array "outsamples" to binary output file "fout"	*/
/*	Returns the number of words written.			*/
INTTYPE write_data(fout,outbuf,outsamples)
INTTYPE   fout;
INTTYPE   *outbuf;
INTTYPE   outsamples;
{

    INTTYPE   bytes;
    INTTYPE   i;
    short swap;
    float ftmp;
    short *tmpbuf;

    tmpbuf= (short *)(calloc(outsamples, sizeof(short)));

    for(i=0; i<outsamples; i++ ){
	swap=(short)(*(outbuf+i));
	tmpbuf[i] =(swap<<8)&0xff00;
	tmpbuf[i]|=(swap>>8)&0x00ff;
    }
    if ((bytes=write(fout, (char *)tmpbuf, outsamples*sizeof(short)))
	   != outsamples*sizeof(short)) {
	printf( "Error writing data to output file\n" );
	exit(-1);
    }

    free(tmpbuf);
    return(bytes/sizeof(short));
}

get_signaling_data(fn_sig, sig_ptr)
char   *fn_sig;
struct SIGNAL_DATA **sig_ptr;
{
    FILE   *fsig;
    INTTYPE    frame_num, max_rate, min_rate;
    struct SIGNAL_DATA *dum_sig, *dum_sig2;
    INTTYPE    sig_num;

    if ((fsig=fopen(fn_sig, "r"))==NULL) {
	printf("Error opening signaling data file\n");
	exit(-1);
    }
    
    sig_num=0;
    /* create a linked list of signaling commands */
    while (fscanf(fsig, "%d%d%d", &frame_num, &max_rate, &min_rate)!=EOF) {
	dum_sig=(struct SIGNAL_DATA *)(calloc(1, sizeof(struct SIGNAL_DATA)));
	dum_sig->frame_num=frame_num;
	dum_sig->max_rate =max_rate;
	dum_sig->min_rate =min_rate;
	if (sig_num==0) {
	    *sig_ptr=dum_sig;
	}
	else {
	    dum_sig2->next_sig=dum_sig;
	}
	dum_sig2=dum_sig;
	sig_num+=1;
    }
    dum_sig=(struct SIGNAL_DATA *)(calloc(1, sizeof(struct SIGNAL_DATA)));
    dum_sig->frame_num= -1;
    dum_sig2->next_sig=dum_sig;
}


⌨️ 快捷键说明

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