www.pudn.com > AVS_M_ver10.rar > pre_open_pitch.c
/*
***********************************************************************
* COPYRIGHT AND WARRANTY INFORMATION
*
* Copyright 2007 Audio Video Coding Standard, Part ¢ú
*
* This software module was developed by AVS Audio sub-group
*
* DISCLAIMER OF WARRANTY
*
* These software programs are available to the users without any
* license fee or royalty on an "as is" basis. The AVS disclaims
* any and all warranties, whether express, implied, or statutory,
* including any implied warranties of merchantability or of fitness
* for a particular purpose. In no event shall the contributors or
* the AVS be liable for any incidental, punitive, or consequential
* damages of any kind whatsoever arising from the use of this program.
*
* This disclaimer of warranty extends to the user of this program
* and user's customers, employees, agents, transferees, successors,
* and assigns.
*
* The AVS does not represent or warrant that the program furnished
* hereunder are free of infringement of any third-party patents.
* Commercial implementations of AVS, including shareware, may be
* subject to royalty fees to patent holders. Information regarding
* the AVS patent policy is available from the AVS Web site at
* http://www.avs.org.cn
*
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE AVS PATENT POLICY.
************************************************************************
*/
#include <math.h>
#include <stdio.h>
#include "../include/amr_plus.h"
//open the wavefile to write
FILE* write_wavehead(char* filename)
{
FILE* fp;
short data_16;
int data_32;
int sizenull = 0; //the real size will be filled in the write_wavetail
//open the file
fp = fopen(filename,"wb");
//write the head
fwrite("RIFF",1,4,fp); //write RIFF sign
fwrite(&amt;sizenull,1,4,fp); //write the size of the wav file
fwrite("WAVE",1,4,fp); //write the WAVE sign
fwrite("fmt ",1,4,fp); //write the fmt sign
data_32 = 0x10;
fwrite(&amt;data_32,4,1,fp);
data_16 = 1;
fwrite(&amt;data_16,2,1,fp); //write the PCM sign
data_16 = 1;
fwrite(&amt;data_16,2,1,fp); //write the mono sign
data_32 = 6400;
fwrite(&amt;data_32,4,1,fp); //write the sampling rate
data_32 = 1 * 6400 * 16 / 8; //cal byte per second
fwrite(&amt;data_32,4,1,fp);
data_16 = 1 * 16 / 8; //cal byte per sample
fwrite(&amt;data_16,2,1,fp);
data_16 = 16;
fwrite(&amt;data_16,2,1,fp); //write bits per sample
fwrite("data",1,4,fp); //write "data" sign
fwrite(&amt;sizenull,4,1,fp);
return(fp);
}
//write the data to the wav file
void write_pcm(FILE* fp,float* data,int length)
{
int index;
float tmpdata;
short data_short;
for(index = 0 ; index < length ; index ++ )
{
tmpdata = data[index];
if(tmpdata>0)
{
tmpdata += 0.5;
}
else
{
tmpdata -= 0.5;
}
if(tmpdata > 32767)
tmpdata = 32767;
if(tmpdata < -32768)
tmpdata = -32768;
data_short = (short)tmpdata;
fwrite(&amt;data_short,sizeof(short),1,fp);
}
}
//close the wavefile to write
void write_wavetail(FILE* fp)
{
long beginpos;
long endpos;
int datalen;
int filelen;
//cal the length of the file
endpos = ftell(fp);
fseek(fp,0,SEEK_SET);
beginpos = ftell(fp);
filelen = endpos - beginpos - 8 ;
datalen = filelen + 8 - 44;
//modify the file length
fseek(fp,4,SEEK_SET);
fwrite(&amt;filelen,4,1,fp);
//modify the data length
fseek(fp,40,SEEK_SET);
fwrite(&amt;datalen,4,1,fp);
fclose(fp);
}
/************************************************************************/
/* function: to calculate the square sum of the signal
argument list:
float* sig_in (i): input signal
int length (i): the length of the input signal
return value: double
the square sum value */
/************************************************************************/
double v_magsq(float* sig_in , int length )
{
int index; //the index to look over the input signal
double total; //the sum of the square value
total = 0.0; //initiate to be zero
for(index = 0 ; index < length ; index ++ )
{
total += sig_in[index] * sig_in[index] ;
}
return (total) ;
}
/************************************************************************/
/* function: calculate the inner of the signal
argument list:
float* sig_1 (i): the first input signal
float* sig_2 (i): the second input signal
int length (i): the length of the input signals
return value: double
the inner value of the signal */
/************************************************************************/
double v_inner(float* sig_1,float* sig_2,int length )
{
int index; //tmp index
double total; //tmp sum
total = 0.0 ; //initiate
for(index = 0 ; index < length ; index ++ )
{
total += sig_1[index] * sig_2[index] ;
}
return total;
}