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

📄 ywavproc_t.h

📁 给语音加噪声的一个程序
💻 H
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////
// yWavProc_T.h: interface for the yWavProc_T class.
//            
//////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////
////////// EDITED BY YORK //////////hiding in my body, your blood//////
///////////////////////////////////////////////////////////////////////

#ifndef _Tmpl_WvProc
#define _Tmpl_WvProc

#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>

using namespace std;

typedef struct{
	//WAVE_FROMAT_PCM(=1) WORD
    short  wFormatTag; 
	// 1 OR 2             WORD
	short  nChannels;   
	// 采样率(单位-赫兹)DWORD
	int    nSamplesPerSec; 
	//平均传输率(=nSamplesPerSec*nBlockAlign) DWORD
	int    nAvgBytesPerSec;  
	//每个采样点字节数(nChannels*nBitsPerSample/8) DWORD
	short  nBlockAlign;      
	//每个采样点位数       WORD
	short  wBitsPerSample; 
	//附加信息字节数(通常为零)WORD
	short  cbSize;              
}WAVEFORMATEX_T;



typedef struct {
	char			RIFF_c[4];    //="RIFF";
	int			    nChunkSize;   //文件大小减8(字节);DWORD
	char			WAVE_c[4];    //="WAVE";
	char			fmt_c[4];     //="fmt ";
	int			    nFmtSize;     //格式块的大小;DWORD
	WAVEFORMATEX_T* pWAVEF;
	char			data_c[4];    //="data";
	int			    nWaveSize;    //波形文件大小;DWORD
}WAVEHEAD_T;



template <class xType> class yWavProc_T  
{
	private:
	//save the wave data.
	xType         * c_pWaveData;
	//save the wave head information
	WAVEHEAD_T  * c_pWaveHead; 
	//indicate the number of the data.
	int           c_nDataNum;
public:
	//Function: get the wave data
	//argument: the buffer pointer of the buffer
	//attention: you need not allocate the memory space for the pointer
	//           but you DO NEED DELETE the pointer bcz the function new it;
	int          c_GetData( xType *& );
	//Function: get the wave data
	//argument: the buffer pointer of the buffer
	//attention: you need not allocate the memory space for the pointer
	//           but you DO NEED DELETE the pointer bcz the function new it;
	int          c_GetData( vector<xType> & );
	//Function: overload save data from a buffer to a special file
	//argument: first-> special file name;
	//         second-> begin position of buffer 
	//          third-> end position of buffer
	void		 c_SaveWav(string,int,int);
	//Function: overload save data from a buffer to a special file
	//argument: first-> special segment point pair vector;
	//         second-> special file name 
	void         c_SaveWav(vector<pair<int,int> > &, string);
	//Function: overload save data from a buffer to a special file
	//argument: first-> special data vector for save;
	//         second-> special file name 
	void         c_SaveWav(vector<xType>, string);

	void		 c_SaveWav( xType*& , int, string );
	//Function: not pass test
	//argument:
	bool         c_GetHeadInfo(WAVEHEAD_T* &);
	//Function: not pass test
	//argument:
	bool         c_Get_wave_format(WAVEFORMATEX_T &);

	//Function : open a wave file
	//Argument : a string file name
	//Return   : the number of samples
	int          c_OpenWav(string const);
public:
		//Function:
		//argument:
	yWavProc_T(string const);

	yWavProc_T():c_pWaveHead(0),c_pWaveData(0){	};

	virtual ~yWavProc_T( ){
		if( c_pWaveHead )
			delete c_pWaveHead->pWAVEF;
		delete c_pWaveHead;
			
		delete[] c_pWaveData;
		};

};

template <class xType> 
int yWavProc_T< xType >::c_GetData(xType* &f_pWvData)
{

//		delete[] f_pWvData;

	f_pWvData = new xType[c_nDataNum];
	for(int i_nX=0;i_nX<c_nDataNum;i_nX++)
	{
		f_pWvData[i_nX]=c_pWaveData[i_nX];
	}
	return c_nDataNum;
}

template <class xType> 
int yWavProc_T< xType >::c_GetData(vector<xType> &f_vWvData)
{
	f_vWvData.clear();

	f_vWvData.assign( c_pWaveData, c_pWaveData + c_nDataNum );
	return c_nDataNum;
}


template <class xType> 
int yWavProc_T<xType>::c_OpenWav(const string i_sFileName)
{
	ifstream i_OpFile(i_sFileName.c_str(),ios::binary);
	if(!i_OpFile)
	{
		cout<<"u havent give me a file name, string is empty!"<<endl;
		c_pWaveHead = 0;
		c_pWaveData = 0;
		return 0;
	}

    c_pWaveHead=new WAVEHEAD_T;
	i_OpFile.read((c_pWaveHead->RIFF_c),4);
	i_OpFile.read((char*)&(c_pWaveHead->nChunkSize),4);
	i_OpFile.read((c_pWaveHead->WAVE_c),4);
	i_OpFile.read((c_pWaveHead->fmt_c),4);
	i_OpFile.read((char*)&(c_pWaveHead->nFmtSize),4);

	c_pWaveHead->pWAVEF = new WAVEFORMATEX_T;
	i_OpFile.read((char*)c_pWaveHead->pWAVEF,c_pWaveHead->nFmtSize);
	i_OpFile.read((c_pWaveHead->data_c),4);
	i_OpFile.read((char*)&(c_pWaveHead->nWaveSize),4);
	c_nDataNum = (c_pWaveHead->nWaveSize)/(c_pWaveHead->pWAVEF->wBitsPerSample/8);
	char* i_pWaveData = new char[c_pWaveHead->nWaveSize];
	c_pWaveData       = new xType[c_nDataNum];
	i_OpFile.read(i_pWaveData,c_pWaveHead->nWaveSize);
	i_OpFile.close();

/*

*/
	int i_nFlag = c_pWaveHead->pWAVEF->wBitsPerSample/8;
	int i_J;
	switch (i_nFlag)
	{
	case 1:
		for(i_J=0;i_J<c_nDataNum;i_J++)
		{
			c_pWaveData[i_J]=(xType)(*(unsigned char*)(i_pWaveData+i_J)-128);
		}
		break;
	case 2:
		for(i_J=0;i_J<c_nDataNum;i_J++)
		{
			c_pWaveData[i_J]=(xType)(*(short*)(i_pWaveData+2*i_J));
		}
		break;
	case 4:
		for(i_J=0;i_J<c_nDataNum;i_J++)
		{
			c_pWaveData[i_J]=(xType)(*(int*)(i_pWaveData+4*i_J));
		}
		break;
	default:
		cout<<"err occur, unknown type for open"<<endl;
	}
	delete[] i_pWaveData;

	return c_nDataNum;
}


template <class xType> 
yWavProc_T<xType>::yWavProc_T(const string f_sFileName):c_pWaveHead(0),c_pWaveData(0)
{
	c_OpenWav( f_sFileName );
	/*
	ifstream i_OpFile(i_sFileName.c_str(),ios::binary);
	if(!i_OpFile)
	{
		cout<<"u havent give me a file name, string is empty!"<<endl;
		exit(0);
	}

    c_pWaveHead=new WAVEHEAD_T;
	i_OpFile.read((c_pWaveHead->RIFF_c),4);
	i_OpFile.read((char*)&(c_pWaveHead->nChunkSize),4);
//	c_pWaveHead->nChunkSize -= 4;   ///bcz itself occupy 4 bytes
	i_OpFile.read((c_pWaveHead->WAVE_c),4);
	i_OpFile.read((c_pWaveHead->fmt_c),4);
	i_OpFile.read((char*)&(c_pWaveHead->nFmtSize),4);

	c_pWaveHead->pWAVEF = new WAVEFORMATEX_T;
	i_OpFile.read((char*)c_pWaveHead->pWAVEF,c_pWaveHead->nFmtSize);
	i_OpFile.read((c_pWaveHead->data_c),4);
	i_OpFile.read((char*)&(c_pWaveHead->nWaveSize),4);
	c_nDataNum = (c_pWaveHead->nWaveSize)/(c_pWaveHead->pWAVEF->wBitsPerSample/8);
	char* i_pWaveData = new char[c_pWaveHead->nWaveSize];
	c_pWaveData       = new xType[c_nDataNum];
	i_OpFile.read(i_pWaveData,c_pWaveHead->nWaveSize);
	i_OpFile.close();


	int i_nFlag = c_pWaveHead->pWAVEF->wBitsPerSample/8;
	int i_J;
	switch (i_nFlag)
	{
	case 1:
		for(i_J=0;i_J<c_nDataNum;i_J++)
		{
			c_pWaveData[i_J]=(xType)(*(unsigned char*)(i_pWaveData+i_J)-128);
		}
		break;
	case 2:
		for(i_J=0;i_J<c_nDataNum;i_J++)
		{
			c_pWaveData[i_J]=(xType)(*(short*)(i_pWaveData+2*i_J));
		}
		break;
	case 4:
		for(i_J=0;i_J<c_nDataNum;i_J++)
		{
			c_pWaveData[i_J]=(xType)(*(int*)(i_pWaveData+4*i_J));
		}
		break;
	default:
		cout<<"err occur, unknown type for open"<<endl;
	}
	delete[] i_pWaveData;
	*/
	
}


template <class xType>  
void yWavProc_T< xType >::c_SaveWav(string i_sFName,int i_nHead=0,int i_nEnd=0)
{
	if(i_nEnd==0||i_nEnd<=i_nHead)
		i_nEnd=c_nDataNum;
	ofstream i_SvFile(i_sFName.c_str(),ios::out|ios::binary);
	if(! i_SvFile)
	{
		cerr<<"cant open "<<endl;
		exit(-1);
	}
	//write wave head infomation.
	i_SvFile.write("RIFF",4);

	int i_nFlag=c_pWaveHead->pWAVEF->wBitsPerSample/8;

	int i_nChunkSize = c_pWaveHead->nFmtSize+(i_nEnd-i_nHead)*i_nFlag+20;
	i_SvFile.write((char*)&i_nChunkSize,4);
	i_SvFile.write("WAVE",4);
	i_SvFile.write("fmt ",4);
	i_SvFile.write((char*)&(c_pWaveHead->nFmtSize),4);
	i_SvFile.write((char*)c_pWaveHead->pWAVEF,c_pWaveHead->nFmtSize);
	i_SvFile.write("data",4);

	int i_nWaveSize; 
	//write wave data.	
	int i_I;
	unsigned char i_ucTmp;
	short         i_sTmp;
	int           i_iTmp;
	switch(i_nFlag)
	{
	case 1:
		i_nWaveSize = (i_nEnd-i_nHead);//wave data size in byte;
		i_SvFile.write((char*)&i_nWaveSize,4);
		for(i_I=i_nHead;i_I<i_nEnd;i_I++)
		{
			i_ucTmp=(unsigned char)(c_pWaveData[i_I])+128;
			i_SvFile.write((char*)&(i_ucTmp),1);
		}
		break;
	case 2:
		i_nWaveSize = (i_nEnd-i_nHead)*2;//wave data size in byte;
		i_SvFile.write((char*)&i_nWaveSize,4);
		for(i_I=i_nHead; i_I<i_nEnd; i_I++)
		{
			i_sTmp=(short)(c_pWaveData[i_I]);
			i_SvFile.write((char*)&i_sTmp,2);
		}
		break;
	case 4:
		i_nWaveSize = (i_nEnd-i_nHead)*4;//wave data size in byte;
		i_SvFile.write((char*)&i_nWaveSize,4);
		for(i_I=i_nHead; i_I<i_nEnd; i_I++)
		{

⌨️ 快捷键说明

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