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

📄 ywavproc_t.h

📁 给语音加噪声的一个程序
💻 H
📖 第 1 页 / 共 2 页
字号:
			i_iTmp=(int)(c_pWaveData[i_I]);
			i_SvFile.write((char*)&i_iTmp,4);
		}
		break;
	default:
		cout<<"err find, unknown type for save."<<endl;
	}
	i_SvFile.close();

/*

*/
}


template <class xType>  void yWavProc_T< xType >::
c_SaveWav(vector<pair<int,int> > & i_nPosVect, //position vector for save
		  string i_sFName)                     //name of save file
{

	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;

	vector<pair<int,int> >::iterator i_cIter = i_nPosVect.begin();
	vector<pair<int,int> >::iterator i_cIterEnd = i_nPosVect.end();
	
	int i_nWaveSize = 0;
	for( ;i_cIter< i_cIterEnd;i_cIter++)
	{
		i_nWaveSize += ((*i_cIter).second-(*i_cIter).first);//computer the wave data number;
	}
	i_cIter = i_nPosVect.begin();

	i_nWaveSize *= i_nFlag;
	int i_nChunkSize = c_pWaveHead->nFmtSize+(i_nWaveSize)+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);

	//write wave data.	
	int i_I;
	unsigned char i_ucTmp;
	short         i_sTmp;
	int           i_iTmp;

	switch(i_nFlag)
	{
	case 1:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( ;i_cIter< i_cIterEnd;i_cIter++)
		{
			for(i_I=(*i_cIter).first;i_I<(*i_cIter).second;i_I++)
			{
				i_ucTmp=(unsigned char)(c_pWaveData[i_I])+128;
				i_SvFile.write((char*)&(i_ucTmp),1);
			}
		}
		break;
	case 2:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( ;i_cIter< i_cIterEnd;i_cIter++)
		{
			for(i_I=(*i_cIter).first;i_I<(*i_cIter).second;i_I++)
			{
				i_sTmp=(short)(c_pWaveData[i_I]);
				i_SvFile.write((char*)&i_sTmp,2);
			}
		}
		break;
	case 4:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( ;i_cIter< i_cIterEnd;i_cIter++)
		{
			for(i_I=(*i_cIter).first;i_I<(*i_cIter).second;i_I++)
			{
				i_iTmp=(int)(c_pWaveData[i_I]);
				i_SvFile.write((char*)&i_iTmp,4);
			}
		}
		break;
	default:
		cout<<"err find, unknown type for save."<<endl;
	}
	i_SvFile.close();


}


template <class xType>  void yWavProc_T< xType >::
c_SaveWav(vector<xType> i_vDataVect, //data vector for save
		  string i_sFName)                     //name of save file
{

	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;//how much bytes
	                                                  //will be use to save a sample.

	vector<xType>::iterator i_cIter = i_vDataVect.begin();
	vector<xType>::iterator i_cIterEnd = i_vDataVect.end();

	int i_nWaveSize = i_vDataVect.size();//count the wave data;
	i_nWaveSize *= i_nFlag;              //count the total bytes;

	//now, below write the wave head information:
	int i_nChunkSize = c_pWaveHead->nFmtSize+(i_nWaveSize)+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);

	//write wave data.	
	//different tmp for different save format.
	// 8 bits ,16 bits, 32 bits;
	unsigned char i_ucTmp;
	short         i_sTmp;
	int           i_iTmp;

//	xType           i_xMax = 0;//for norm
//	xType           i_xTmp;    //for data tmp;
//	i_nWaveSize += 4;//datasize itself occupy 4bytes. but seems error,
	switch(i_nFlag)
	{
	case 1:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( ;i_cIter< i_cIterEnd;i_cIter++)
		{	
			i_ucTmp=(unsigned char) ( (*i_cIter + 128.0) );
			i_SvFile.write((char*)&(i_ucTmp),1);	
		}
		break;
	case 2:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( ;i_cIter< i_cIterEnd;i_cIter++)
		{
			i_sTmp=(short)( *i_cIter );
			i_SvFile.write((char*)&i_sTmp,2);
		}
		break;
	case 4:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( ;i_cIter< i_cIterEnd;i_cIter++)
		{
			i_iTmp=(int)( *i_cIter );
			i_SvFile.write((char*)&i_iTmp,4);
		}
		break;
	default:
		cout<<"err find, unknown type for save."<<endl;
	}
	i_SvFile.close();


}


template <class xType>  void yWavProc_T< xType >::
c_SaveWav(xType*& f_pDataVect, //data vector for save
		  int f_nSize,          //data size
		  string f_sFName)     //name of save file
{

	ofstream i_SvFile(f_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;//how much bytes
	                                                  //will be use to save a sample.
	int i_nWaveSize = f_nSize;//count the wave data;;
	i_nWaveSize *= i_nFlag;              //count the total bytes;

	//now, below write the wave head information:
	int i_nChunkSize = c_pWaveHead->nFmtSize+(i_nWaveSize)+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);

	//write wave data.	
	//different tmp for different save format.
	// 8 bits ,16 bits, 32 bits;
	unsigned char i_ucTmp;
	short         i_sTmp;
	int           i_iTmp, i_nX;

//	xType           i_xMax = 0;//for norm
//	xType           i_xTmp;    //for data tmp;
//	i_nWaveSize += 4;//datasize itself occupy 4bytes. but seems error,
	switch(i_nFlag)
	{
	case 1:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( i_nX=0; i_nX<f_nSize; i_nX++ )
		{	
			i_ucTmp=(unsigned char) ( f_pDataVect[i_nX] + 128.0 );
			i_SvFile.write((char*)&(i_ucTmp),1);	
		}
		break;
	case 2:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( i_nX=0; i_nX<f_nSize; i_nX++ )
		{
			i_sTmp=(short)( f_pDataVect[i_nX] );
			i_SvFile.write((char*)&i_sTmp,2);
		}
		break;
	case 4:
		i_SvFile.write((char*)&i_nWaveSize,4);
		for( i_nX=0; i_nX<f_nSize; i_nX++ )
		{
			i_iTmp=(int)( f_pDataVect[i_nX] );
			i_SvFile.write((char*)&i_iTmp,4);
		}
		break;
	default:
		cout<<"err find, unknown type for save."<<endl;
	}
	i_SvFile.close();


}

template <class xType>  
bool yWavProc_T< xType >::c_GetHeadInfo(WAVEHEAD_T* &i_cWvInfo)
{

	i_cWvInfo->nChunkSize = c_pWaveHead->nChunkSize;
	i_cWvInfo->nFmtSize   = c_pWaveHead->nFmtSize;
	i_cWvInfo->nWaveSize  = c_pWaveHead->nWaveSize;

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

	return true;
}



template <class xType> 
bool yWavProc_T<xType>::c_Get_wave_format(WAVEFORMATEX_T& i_WvFormatInfo)
{

    i_WvFormatInfo.wFormatTag
		                 = c_pWaveHead->pWAVEF->wFormatTag; 
	//WAVE_FROMAT_PCM(=1) WORD	
	i_WvFormatInfo.nChannels
		                 = c_pWaveHead->pWAVEF->nChannels;  
	// 1 OR 2             WORD
	i_WvFormatInfo.nSamplesPerSec
		                 = c_pWaveHead->pWAVEF->nSamplesPerSec;
	// 采样率(单位-赫兹)DWORD
	i_WvFormatInfo.nAvgBytesPerSec
		                 = c_pWaveHead->pWAVEF->nAvgBytesPerSec;
	//平均传输率(=nSamplesPerSec*nBlockAlign) DWORD
	i_WvFormatInfo.nBlockAlign
		                 = c_pWaveHead->pWAVEF->nBlockAlign;    
	//每个采样点字节数(nChannels*nBitsPerSample/8) DWORD
	i_WvFormatInfo.wBitsPerSample
		                 = c_pWaveHead->pWAVEF->wBitsPerSample; 
	//每个采样点位数       WORD
	i_WvFormatInfo.cbSize
		                 = c_pWaveHead->pWAVEF->cbSize;         
	//附加信息字节数(通常为零)WORD

	return true;
}




//#endif // !defined(AFX_YWAVPROC_T_H__18BD0ECD_C155_44DA_B3E7_59318EFB969D__INCLUDED_)
#endif

⌨️ 快捷键说明

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