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

📄 main.cpp

📁 该源码是对 *.wav语音波形文件做去直流电平
💻 CPP
字号:
//#include "ADPCM.H"
#include "wavformat.h"
#include "main.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



void main(int argc, char* argv[])
{
	//输入目录参数检查段
    if(argv[1]==NULL)
	{
		printf("请按以下格式输入目录参数:\n(1).ADPCM.exe  (2).要编码的.wav语音文件和.txt列表文件所在的目录  (3).去直流DC和峰值归一化后的写入目录 (4).ADPCM编码文件目录  (5).ADPCM解码文件目录\n");
		printf("---现缺(2)要编码的.wav语音文件和.txt列表文件所在的目录---");//该目录下包含xxx.wav和dir.txt
        getchar();                                                        //说明 xxx 表示数字
		exit(1);
	}
	if(argv[2]==NULL)
	{
		printf("请按以下格式输入目录参数:\n(1).ADPCM.exe  (2).要编码的.wav语音文件和.txt列表文件所在的目录  (3).去直流DC和峰值归一化后的写入目录 (4).ADPCM编码文件目录  (5).ADPCM解码文件目录\n");
		printf("---现缺(3)去直流DC和峰值归一化后的写入目录---");//该目录下包含DC_xxx.wav和Normalize_xxx.wav
		getchar();
		exit(1);
	}
	if(argv[3]==NULL)
	{
		printf("请按以下格式输入目录参数:\n(1).ADPCM.exe  (2).要编码的.wav语音文件和.txt列表文件所在的目录  (3).去直流DC和峰值归一化后的写入目录 (4).ADPCM编码文件目录  (5).ADPCM解码文件目录\n");
		printf("---现缺(4)ADPCM编码文件目录---");//该目录下包含Enc_xxx.bin和Enc_flash.bin
		getchar();
		exit(1);
	}
	if(argv[4]==NULL)
	{
		printf("请按以下格式输入目录参数:\n(1).ADPCM.exe  (2).要编码的.wav语音文件和.txt列表文件所在的目录  (3).去直流DC和峰值归一化后的写入目录 (4).ADPCM编码文件目录  (5).ADPCM解码文件目录\n");
		printf("---现缺(5)ADPCM解码文件目录---");//该目录下包含Dec_xxx.bin和Dec_xxx.wav
		getchar();
		exit(1);
	}
	//-----------------------------------------------------------------------------------------------
	//变量声明段
     FILE *f_dc_xxx_wav, *f_normalize_xxx_wav,      //文件指针
		  *f_enc_xxx_bin, *f_enc_flash_bin, 
		  *f_dec_xxx_bin, *f_dec_xxx_wav_16,*f_dec_xxx_wav_8,
		  *f_dir_txt, *f_wav;

     char SourceWavAndListDirectory[_MAX_DIR],      //输入目录
		  DcAndNormalizeDirectory[_MAX_DIR],
		  EncDirectory[_MAX_DIR],
		  DecDirectory[_MAX_DIR];
	 
	 char SourceWavFileName[_MAX_FNAME],            //输入文件名
		  SourceListFileName[_MAX_FNAME]="dir.txt",
          
		  DcFileName[_MAX_FNAME],
		  Dc_[_MAX_FNAME]="DC_",
		  NormalizeFileName[_MAX_FNAME],
		  Normalize_[_MAX_FNAME]="Normalize_",
		  EncFileName[_MAX_FNAME],
		  Enc_[_MAX_FNAME]="Enc_",
		  EncFlashFileName[_MAX_FNAME]="EncFlash.bin",

		  DecBinFileName[_MAX_FNAME],
		  Dec_[_MAX_FNAME]="Dec_",
		  Dec16_[_MAX_FNAME]="Dec16_",
		  Dec8_[_MAX_FNAME]="Dec8_",
		  DecWavFileName_16[_MAX_FNAME],
	      DecWavFileName_8[_MAX_FNAME];
	 
	 char SourceWavPath[_MAX_PATH],                  //输入路径全称
		  SourceListPath[_MAX_PATH],
          DcFilePath[_MAX_PATH],
		  NormalizeFilePath[_MAX_PATH],
		  EncFilePath[_MAX_PATH],
		  EncFlashFilePath[_MAX_PATH],
		  DecBinFilePath[_MAX_PATH],
		  DecWavFilePath_16[_MAX_PATH],
          DecWavFilePath_8[_MAX_PATH];
	 char WavFileTypeFlag;
	 int  FileCount,
		  StringLength,
		  StartAddress,
		  DataLength,
		  i;
	int   DC_Value;
//	short AdpcmInitValue;
//   struct tagWaveHead0 NEWHEAD;                //定义了两种.wav文件头
   struct tagWaveHead1 OLDHEAD,TempHead; 
   struct  adpcm_state state;
    short *PSourceVoiceSec,
		  *PDcVoiceSec,
		  *PNormalizeVoiceSec,
//		  *PDecXxxBinSec,
		  *PDecXxxWavSec;
	char  *PEncXxxSec;
		  //*PEncFlashSec;
	 //----------------------------------------------------------------------------------------------
	 //读取输入参数
	 strcpy(SourceWavAndListDirectory,argv[1]);
	 strcpy(DcAndNormalizeDirectory,argv[2]);
	 strcpy(EncDirectory,argv[3]);
	 strcpy(DecDirectory,argv[4]);
	 sprintf(SourceListPath,"%s\\%s",SourceWavAndListDirectory,SourceListFileName);
     //----------------------------------------------------------------------------------------------
	 //打开列表文件
	 if( ( f_dir_txt=fopen(SourceListPath,"r") )==NULL)
	 {
		 printf("无法打开语音列表文件dir.txt,请重新输入正确的路径!");
		 getchar();
		 exit(1);
	 }
     fscanf(f_dir_txt,"%d", &FileCount);  //读取列表文件的第一行
	 StartAddress=FileCount*6;        //计算出519平台上的flash语音数据的开始地址
	 //----------------------------------------------------------------------------------------------
	 //创建EncFlash.bin
		sprintf(EncFlashFilePath,"%s\\%s",EncDirectory,EncFlashFileName);
        if((f_enc_flash_bin=fopen(EncFlashFilePath,"wb+"))==NULL)
		{
			printf("无法创建%s文件",EncFlashFileName);
			getchar();
			exit(1);
		}
     //----------------------------------------------------------------------------------------------
	
     //依次打开列表文件中的所有.wav文件进行处理
     for(i=0; i<FileCount; i++)
	 { 
		fscanf(f_dir_txt,"%s",SourceWavFileName);
		sprintf(SourceWavPath,"%s\\%s",SourceWavAndListDirectory,SourceWavFileName);
	    //打开xxx.wav文件
		if(( f_wav=fopen(SourceWavPath,"rb") )==NULL)
		{
			printf("无法打开.wav语音文件,请检查该文件是否存在!");
			getchar();
			exit(1);
		}
		//创建DC_xxx.wav文件
		sprintf(DcFileName,"%s%s",Dc_,SourceWavFileName);
		sprintf(DcFilePath,"%s\\%s",DcAndNormalizeDirectory,DcFileName);
		if( ( f_dc_xxx_wav=fopen(DcFilePath,"wb+") )==NULL)
		{
            printf("无法创建%s文件",DcFileName);
			getchar();
			exit(1);
		}
		//创建Normalize_xxx.wav文件
        sprintf(NormalizeFileName,"%s%s",Normalize_,SourceWavFileName);
		sprintf(NormalizeFilePath,"%s\\%s",DcAndNormalizeDirectory,NormalizeFileName);
		if( ( f_normalize_xxx_wav=fopen(NormalizeFilePath,"wb+") )==NULL)
		{
			printf("无法创建%s文件",NormalizeFileName);
			getchar();
			exit(1);
		}
		//创建Enc_xxx.bin
		sprintf(EncFileName,"%s%s",Enc_,SourceWavFileName);
	    StringLength = strlen(EncFileName)-4;
        EncFileName[StringLength]='\0';
        strcat(EncFileName,".bin");
	    sprintf(EncFilePath,"%s\\%s",EncDirectory,EncFileName);
		if((f_enc_xxx_bin=fopen(EncFilePath,"wb+"))==NULL)
		{
			printf("无法创建%s文件",EncFileName);
			getchar();
			exit(1);
		}
	
		//创建Dec_xxx.bin
		sprintf(DecBinFileName,"%s%s",Dec_,SourceWavFileName);
	    StringLength = strlen(DecBinFileName)-4;
        DecBinFileName[StringLength]='\0';
        strcat(DecBinFileName,".bin");
	    sprintf(DecBinFilePath,"%s\\%s",DecDirectory,DecBinFileName);
		if((f_dec_xxx_bin=fopen(DecBinFilePath,"wb+"))==NULL)
		{
			printf("无法创建%s文件",DecBinFileName);
			getchar();
			exit(1);
		}
        //创建Dec16_xxx.wav
		sprintf(DecWavFileName_16,"%s%s",Dec16_,SourceWavFileName);
		sprintf(DecWavFilePath_16,"%s\\%s",DecDirectory,DecWavFileName_16);
		if((f_dec_xxx_wav_16=fopen(DecWavFilePath_16,"wb+"))==NULL)
		{
			printf("无法创建%s文件",DecWavFileName_16);
			getchar();
			exit(1);
		}
        //创建Dec8_xxx.wav
		sprintf(DecWavFileName_8,"%s%s",Dec8_,SourceWavFileName);
		sprintf(DecWavFilePath_8,"%s\\%s",DecDirectory,DecWavFileName_8);
		if((f_dec_xxx_wav_8=fopen(DecWavFilePath_8,"wb+"))==NULL)
		{
			printf("无法创建%s文件",DecWavFileName_8);
			getchar();
			exit(1);
		}
        //-----------------------------------------------------------------------------
        //判断.wav文件的新旧格式
	
		fseek(f_wav,16,SEEK_SET);
		fread(&WavFileTypeFlag, sizeof(char),1,f_wav);
		fseek(f_wav,0,SEEK_SET);
        if(WavFileTypeFlag==0x10) //如果.wav文件为OLD的格式
		{
            fread(&OLDHEAD, sizeof(tagWaveHead1), 1, f_wav);
			TempHead = OLDHEAD;

			//读出语音文件中的语音数据
			PSourceVoiceSec = ( short*)malloc(OLDHEAD.nBytes);
			fread(PSourceVoiceSec, sizeof(char),OLDHEAD.nBytes,f_wav );
            
/**/ 		//求语音数据的均值
		    DC_Value=fun_SampleAverage(  PSourceVoiceSec );
            
			//去直流电平
            PDcVoiceSec=(short*)malloc(OLDHEAD.nBytes);
			
			for(int SampleCount=0;SampleCount <= OLDHEAD.nBytes/2-1;SampleCount++)
				PDcVoiceSec[SampleCount]=PSourceVoiceSec[SampleCount]-DC_Value;
			
			//写DC_xxx.wav文件
			fwrite(&OLDHEAD,sizeof(tagWaveHead1),1,f_dc_xxx_wav);
			fwrite(PDcVoiceSec,sizeof(short),OLDHEAD.nBytes/2,f_dc_xxx_wav);
			fclose(f_dc_xxx_wav);
			
			//峰值归一化
            PNormalizeVoiceSec=(short*)malloc(OLDHEAD.nBytes);
            fun_Normalize( PDcVoiceSec,PNormalizeVoiceSec,OLDHEAD.nBytes/2);
            
			//写Normalize_xxx.wav文件
			fwrite(&OLDHEAD,sizeof(tagWaveHead1),1,f_normalize_xxx_wav);
			fwrite(PNormalizeVoiceSec,sizeof(short),OLDHEAD.nBytes/2,f_normalize_xxx_wav);
			fclose(f_normalize_xxx_wav);
         
			//adpcm编码  
		    PEncXxxSec=(char *)malloc(OLDHEAD.nBytes/4+1);  //注意区域开辟加了1个字节,为了防止区域溢出
            //AdpcmInitValue=*PNormalizeVoiceSec;
			//state.valprev=AdpcmInitValue;
			state.valprev=0;
			adpcm_coder(PNormalizeVoiceSec,PEncXxxSec,OLDHEAD.nBytes/2,adpcm_state);
            
			//adpcm解码
            PDecXxxWavSec=(short*)malloc(OLDHEAD.nBytes);
			//state.valprev=AdpcmInitValue;
            state.valprev=0;
			adpcm_decoder(PEncXxxSec, PDecXxxWavSec, OLDHEAD.nBytes/2,  adpcm_state );
			
			//写Dec_xxx.bin
			fwrite(PDecXxxWavSec,sizeof(short),OLDHEAD.nBytes/2,f_dec_xxx_bin);
			fclose(f_dec_xxx_bin);
            
			//写Dec_xxx.wav---8k-16bit文件
		    fwrite(&OLDHEAD,sizeof(tagWaveHead1),1,f_dec_xxx_wav_16);
			fwrite(PDecXxxWavSec,sizeof(short),OLDHEAD.nBytes/2,f_dec_xxx_wav_16);
			fclose(f_dec_xxx_wav_16);

			//写Dec_xxx.wav---8k-8bit文件
			//修改文件头  
	 
	        TempHead.SampleRate /= 1;
            TempHead.nBytes /=2 ;
            TempHead.FileLength = TempHead.nBytes + 36;
            TempHead.TransRate /= 2; 
            TempHead.Adjust = 1;
	        TempHead.nBitsPerSample = 8;

            fwrite(&TempHead,sizeof(tagWaveHead1),1,f_dec_xxx_wav_8);
            char tempS;
	        int j;
            for(j=0; j<(TempHead.nBytes); j++)
			{
				 tempS =(char) ((PDecXxxWavSec[j]+0x8000) >>8) ;
       			 fwrite(&tempS, sizeof(char),1,f_dec_xxx_wav_8);
			}
   
			fclose(f_dec_xxx_wav_8);
            
			//写Enc_xxx.bin文件
			fwrite(PEncXxxSec,sizeof(char),OLDHEAD.nBytes/4,f_enc_xxx_bin);
			fclose(f_enc_xxx_bin);
            
			//写EncFlash.bin文件
		static	int IndexPointer=0;
            DataLength=OLDHEAD.nBytes/4;
			fseek(f_enc_flash_bin,IndexPointer,SEEK_SET);
            fwrite(&StartAddress,sizeof(char),3,f_enc_flash_bin);
            fwrite(&DataLength,sizeof(char),3,f_enc_flash_bin); 
            IndexPointer+=6;
			fseek(f_enc_flash_bin,StartAddress,SEEK_SET);
			fwrite(PEncXxxSec,sizeof(char),DataLength,f_enc_flash_bin);
            StartAddress=StartAddress+DataLength;
			
        



       



		}
        if(WavFileTypeFlag==0x12) //如果.wav文件为new的格式
		{
          printf("该程序无法识别要编码的.wav文件格式,请转成windows pcm格式");  
		}
        free(PSourceVoiceSec);
		free(PDcVoiceSec);
		free(PNormalizeVoiceSec);
		free(PEncXxxSec);
		free(PDecXxxWavSec);
        fclose(f_wav);
        printf("已完成第%d文件\r",i);
	  
	 }
     printf("\n\a成功完成---ok---请按回车键:");
	 getchar();
     return;
}

⌨️ 快捷键说明

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