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