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

📄 zp_decim.cpp

📁 音频信号降采样程序 支持48k->8k 24k->8k 8k->1k 的降采样.实现方法,先做低通滤波,再做采样点抽取.低通滤波起使用67点FIR,系数由matlab使用窗函数法生成
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	data_remain = nx;	

	ixbgn = 0;//从的0帧的第0个数据开始抽样
	iybgn = 0;//从的0帧的第0个数据开始抽样
	while(data_remain > FRM_LEN )//
	{	fread (aIncx, sizeof(short), FRM_LEN, fpin);
	{deci_num = 2;	
		for(x_num=0;x_num<FRM_LEN;x_num++)
		{	x[x_num+BUF_LEN]=(double)aIncx[x_num];//初始化x后FRM_LEN个数据点
		}
		
		ixDcRn=decimation_buffer_and_frame
			(x,BUF_LEN+FRM_LEN,h_1,H1_Length,BUF_LEN,y_half,deci_num,&ixbgn);
		for(x_num=0;x_num<BUF_LEN;x_num++)
		{	x[x_num]=(double)aIncx[FRM_LEN-BUF_LEN+x_num];//初始化x前BUF_LEN个数据点
		}
	}
//2

	{deci_num = 2;
		for(y_num=0;y_num<ixDcRn;y_num++)//中间
		{	y[y_num+BUF_LEN]=(double)y_half[y_num];//初始化y后ixDcRn个数据点
		}
		
		iyDcRn=decimation_buffer_and_frame
			(y,BUF_LEN+ixDcRn,h_1,H1_Length,BUF_LEN,y_half_third,deci_num,&iybgn);
		for(x_num=0;x_num<BUF_LEN;x_num++)
		{	y[x_num]=(double)y_half[ixDcRn-BUF_LEN+x_num];//初始化y前BUF_LEN个数据点
		}
	}
//4
	{deci_num = 2;
		for(z_num=0;z_num<ixDcRn;z_num++)//中间
		{	z[z_num+BUF_LEN]=(double)y_half_third[z_num];//初始化y后ixDcRn个数据点
		}
		
		izDcRn=decimation_buffer_and_frame
			(z,BUF_LEN+iyDcRn,h_1,H1_Length,BUF_LEN,z_half_third,deci_num,&iybgn);
		for(z_num=0;z_num<BUF_LEN;z_num++)
		{	z[z_num]=(double)y_half_third[iyDcRn-BUF_LEN+z_num];//初始化y前BUF_LEN个数据点
		}
	}

//8

		data_remain=data_remain-FRM_LEN;

/////////写输出wav文件数据
		for(z_num=0;z_num<izDcRn;z_num++)
		{	aOutcx[z_num]=(short) z_half_third[z_num];
		}
		fwrite (aOutcx, sizeof(short), izDcRn, fpout);////写输出wav文件数据
	}
	{//处理不够一zhen的数据 data_remain < FRM_LEN
		fread (aIncx, sizeof(short), data_remain, fpin);
		for(x_num=0;x_num<data_remain;x_num++)
		{	x[x_num+BUF_LEN]=(double)aIncx[x_num];//初始化x后FRM_LEN个数据点
		}
		{deci_num = 2;
		
			ixDcRn=decimation_buffer_and_frame
				(x,BUF_LEN+data_remain,h_1,H1_Length,BUF_LEN,y_half,deci_num,&ixbgn);
			for(x_num=0;x_num<BUF_LEN;x_num++)
			{	x[x_num]=(double)aIncx[FRM_LEN-BUF_LEN+x_num];//初始化x前BUF_LEN个数据点
			}
		}
//2
		{deci_num = 2;

			for(y_num=0;y_num<ixDcRn;y_num++)//中间
			{	y[y_num+BUF_LEN]=(double)y_half[y_num];//初始化y后ixDcRn个数据点
			}
			
			iyDcRn=decimation_buffer_and_frame
				(y,BUF_LEN+ixDcRn,h_1,H1_Length,BUF_LEN,y_half_third,deci_num,&iybgn);
			for(x_num=0;x_num<BUF_LEN;x_num++)
			{	y[x_num]=(double)y_half[ixDcRn-BUF_LEN+x_num];//初始化y前BUF_LEN个数据点
			}

		}
//4
	{deci_num = 2;
		for(z_num=0;z_num<ixDcRn;z_num++)//中间
		{	z[z_num+BUF_LEN]=(double)y_half_third[z_num];//初始化y后ixDcRn个数据点
		}
		
		izDcRn=decimation_buffer_and_frame
			(z,BUF_LEN+iyDcRn,h_1,H1_Length,BUF_LEN,z_half_third,deci_num,&iybgn);
		for(z_num=0;z_num<BUF_LEN;z_num++)
		{	z[z_num]=(double)y_half_third[izDcRn-BUF_LEN+z_num];//初始化y前BUF_LEN个数据点
		}
	}

//8

		data_remain=data_remain-data_remain;


		

/////////写输出wav文件数据
		for(z_num=0;z_num<izDcRn;z_num++)
		{	aOutcx[z_num]=(short) z_half_third[z_num];
		}
		fwrite (aOutcx, sizeof(short), izDcRn, fpout);////写输出wav文件数据
	}
	fclose(fpin);
	fclose(fpout);
}





void CZP_Decim::CZP_Decim_3_File(char *aInFlNm)
{
	short aIncx[FRM_LEN]={0},aOutcx[FRM_LEN]={0};
	double aIndb[FRM_LEN]={0},aOutdb[FRM_LEN]={0};
	double x[FRM_LEN+BUF_LEN]={0},
			y[FRM_LEN+BUF_LEN]={0},
			y_half[FRM_LEN+BUF_LEN]={0},
			y_half_third[FRM_LEN+BUF_LEN]={0};
	int ixbgn=0,
		iybgn=0,
		x_num=0, y_num=0, 
		ixDcRn=0, 
		iyDcRn=0, 
		i =0,deci_num;
	char aOutFlNm[40]="24kTo8k\\";
	strcat(aOutFlNm,aInFlNm);

	int data_remain;//剩下的还未处理的数据长度

	///////////打开输入文件,读文件头
	Load(aInFlNm);
	nx = input_headOfWave.sizeOfData/sizeof(short);//16位,单通道
	ny = nx/3;//Decimation_RATE;

	int Decimation_RATE = 3;
	Write(aOutFlNm,Decimation_RATE);


	//分Frame降采样
	data_remain = nx;		

	ixbgn = 0;//从的0帧的第0个数据开始抽样
	iybgn = 0;//从的0帧的第0个数据开始抽样
	while(data_remain > FRM_LEN )//
	{	fread (aIncx, sizeof(short), FRM_LEN, fpin);
		for(x_num=0;x_num<FRM_LEN;x_num++)
		{	x[x_num+BUF_LEN]=(double)aIncx[x_num];//初始化x后FRM_LEN个数据点
		}

		deci_num = 3;
		iyDcRn=decimation_buffer_and_frame
			(x,BUF_LEN+FRM_LEN,h_2,H2_Length,BUF_LEN,y_half_third,deci_num,&iybgn);

		for(x_num=0;x_num<BUF_LEN;x_num++)
		{	x[x_num]=(double)aIncx[FRM_LEN-BUF_LEN+x_num];//初始化x前BUF_LEN个数据点
		}


		data_remain=data_remain-FRM_LEN;

		/////////写输出wav文件数据
		for(y_num=0;y_num<iyDcRn;y_num++)
		{	aOutcx[y_num]=(short) y_half_third[y_num];
		}
		fwrite (aOutcx, sizeof(short), iyDcRn, fpout);////写输出wav文件数据
	}
	{//处理不够一zhen的数据 data_remain < FRM_LEN
		fread (aIncx, sizeof(short), data_remain, fpin);
		for(x_num=0;x_num<data_remain;x_num++)
		{	x[x_num+BUF_LEN]=(double)aIncx[x_num];//初始化x后FRM_LEN个数据点
		}

		deci_num = 3;
		iyDcRn=decimation_buffer_and_frame
			(x,BUF_LEN+data_remain,h_2,H2_Length,BUF_LEN,y_half_third,deci_num,&iybgn);

		for(x_num=0;x_num<BUF_LEN;x_num++)
		{	x[x_num]=(double)aIncx[FRM_LEN-BUF_LEN+x_num];//初始化x前BUF_LEN个数据点
		}


		data_remain=data_remain-data_remain;

		/////////写输出wav文件数据
		for(y_num=0;y_num<iyDcRn;y_num++)
		{	aOutcx[y_num]=(short) y_half_third[y_num];
		}
		fwrite (aOutcx, sizeof(short), iyDcRn, fpout);////写输出wav文件数据
	}
	fclose(fpin);
	fclose(fpout);
}




void CZP_Decim::Cfix_head( char* aInFlNm )
{	short aIncx[FRM_LEN2] = { 0 };		char aOutFlNm[40]="fix\\";
	strcat(aOutFlNm,aInFlNm);
	fpin = fopen(aInFlNm,"rb");
	fpout = fopen(aOutFlNm,"wb");

	fread (&input_headOfWave, sizeof(WAVEFILEFMT), 1, fpin);

	input_headOfWave.navgBytesPerSec = input_headOfWave.nSamplesPerSec * 2;
	input_headOfWave.nBlockAlign = input_headOfWave.nChannels * input_headOfWave.nBitPerSample / 8 ;//一次采样的块大小 
	input_headOfWave.sizeOfFile = input_headOfWave.sizeOfData + 36;
	fwrite (&input_headOfWave, sizeof(WAVEFILEFMT), 1, fpout);


	//分Frame降采样
	int data_remain = input_headOfWave.sizeOfData/sizeof(short);;
	while(data_remain > FRM_LEN2 )//
	{	fread (aIncx, sizeof(short), FRM_LEN2, fpin);
		data_remain = data_remain-FRM_LEN2;
		fwrite (aIncx, sizeof(short), FRM_LEN2, fpout);////写输出wav文件数据
	}
	{//处理不够一zhen的数据 data_remain < FRM_LEN2
		fread (aIncx, sizeof(short), data_remain, fpin);
		fwrite (aIncx, sizeof(short), data_remain, fpout);////写输出wav文件数据
	}
	fclose(fpin);
	fclose(fpout);
}


void CZP_Decim::C2to187( char *aInFlNm )
{
	char channel_1[40];
	strcpy(channel_1,aInFlNm);
	char channel_2[40];
	aInFlNm[strlen(aInFlNm)-5]='2';
	strcpy(channel_2,aInFlNm);
	char channel_3[40];
	aInFlNm[strlen(aInFlNm)-5]='3';
	strcpy(channel_3,aInFlNm);
	char channel_4[40];
	aInFlNm[strlen(aInFlNm)-5]='4';
	strcpy(channel_4,aInFlNm);
	char channel_5[40];
	aInFlNm[strlen(aInFlNm)-5]='5';
	strcpy(channel_5,aInFlNm);
	char channel_6[40];
	aInFlNm[strlen(aInFlNm)-5]='6';
	strcpy(channel_6,aInFlNm);




}

⌨️ 快捷键说明

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