📄 main.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 + -