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

📄 adpcm8.cpp

📁 8位无符号4-BIT ADPCM编码和解码程序
💻 CPP
字号:

#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
	FILE *rfp,*wfp,*fpa,*fpb;
	unsigned char Xn,Dn,Sn=0,Yn,Dqn,Xen=0x80;
	bool flags;
	unsigned char Two_Yn;
	void Encode();
	void Decode();
void main()
	{
	//	if ((rfp = fopen("f:\\project\\vb\\ad\\123.pcm","rb")) == NULL)
		if ((rfp = fopen("f:\\project\\vb\\ad\\monkey.pcm","rb")) == NULL)
		{
			printf("Cannot open file 123.pcm\n");
			exit(-1);
		}
		if ((wfp = fopen("f:\\project\\vb\\ad\\123.dat","w")) == NULL)
		{
			printf("Cannot open file 123.dat\n");
			exit(-1);
		}
		if ((fpa = fopen("f:\\project\\vb\\ad\\monkey.dat","wb")) == NULL)
		{
			printf("Cannot open file monkey.dat\n");
			exit(-1);
		}
		if ((fpb = fopen("f:\\project\\vb\\ad\\monkey.yn","wb")) == NULL)
		{
			printf("Cannot open file monkey.yn\n");
			exit(-1);
		}
		long i=1;
		fprintf(wfp,"   ID   Xn   Xen   Yn   Dn   Sn   Dqn  \n");
		Xn=fgetc(rfp);
		flags = true;
		while(!feof(rfp))
		{
			Encode();
			printf("%5x",Xen);
			fprintf(wfp,"%5x%5x%5x%5x%5x%5x%5x\n",i,Xn,Xen,Yn,Dn,Sn,Dqn);
			fputc(Yn,fpb);
			if (flags)
			{
				Two_Yn = Yn << 4;
				flags = false;
			}
			else
			{
				Two_Yn=(Two_Yn & 0xf0) + (Yn & 0x0f);
				flags= true;
				fputc(Two_Yn,fpa);
			}
			
			Xn=fgetc(rfp);
			i++;
		}
		if (!flags)
		{
			Two_Yn=Two_Yn & 0xf0;
			fputc(Two_Yn,fpa);
		}
		fclose(rfp);
		fclose(wfp);
		fclose(fpa);
		fclose(fpb);
		if ((rfp = fopen("f:\\project\\vb\\ad\\monkey.dat","rb")) == NULL)
		{
			printf("Cannot open file monkey.dat\n");
			exit(-1);
		}
		if ((wfp = fopen("f:\\project\\vb\\ad\\monkey.dec","wb")) == NULL)
		{
			printf("Cannot open file monkey.dec\n");
			exit(-1);
		}
		Sn=0;
		Xen=0x80;
		Yn=fgetc(rfp);
		while(!feof(rfp))
		{
			Two_Yn = Yn;
			Yn = (Yn & 0xf0) >> 4;
			Decode();
			fputc(Xen,wfp);
			
			Yn = Two_Yn & 0x0f;
			Decode();
			fputc(Xen,wfp);
			Yn=fgetc(rfp);
		}

		fclose(rfp);
		fclose(wfp);


	}
void Encode()
{
	Dn=Xn-Xen;
	
	bool fDs = (Dn & 0x80 ) ? 1:0;
	unsigned char Dmag=(fDs) ? 0x100-Dn : Dn;
	unsigned char nY;
	if(Sn>0)
	{
	//	nY=Dmag >>(Sn-1);
	//	unsigned char nLsb = nY & 1;
	//	nY =(nY >>1) +nLsb;
		nY=Dmag >> Sn;
	}
	else
		nY=Dmag;
	if(nY>7)nY = 7;
	Yn=nY+(fDs << 3);
	
	Decode();

}

void Decode()
{
	bool fYs = (Yn & 0x08) ? 1:0;
	unsigned char nYmag = Yn & 0x07;
	unsigned char nDmag = nYmag << Sn;

	Dqn =(fYs) ? 0x100-nDmag : nDmag;

	if(nYmag ==7)
	{
		if(Sn != 5) Sn += 1;
	}
	else if(nYmag == 0)
	{
		if(Sn != 0) Sn -= 1;
	}

	Xen += Dqn;
}

⌨️ 快捷键说明

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