📄 5-7.c
字号:
#include <stdio.h>
#include <math.h>
//#include <C55.h>
#define BUFFERSIZEOUT 254
#define BUFFERSIZEIN 4064
#define DeltaMax 1280
#define DeltaMin 6.5
#define Beta 0.99
#define ORD 6
#define MAX_BITS 16
double ValPreCVSD = 0;
double DeltaCVSD = 20;
double Delta0CVSD = 10;
char ThreeJudgeCVSD[3] = {0,1,0};
double ValPreCVSDDE = 0;
double DeltaCVSDDE = 20;
double Delta0CVSDDE = 10;
char ThreeJudgeCVSDDE[3] = {0,1,0};
static double CoefA[ORD] = {1.00000000,-3.88893329, 6.64074495,-6.08600100, 2.98673653,-0.62768820};
static double CoefB[ORD] = {0.03285030,-0.05723916, 0.03681835, 0.03681835,-0.05723916, 0.03285030};
static short filterY[ORD-1];
static short filterX[ORD];
char CVSDCoder(short InData);
short CVSDDecoder(char InData);
char CVSDCoder(short InData)
{
double Diff = 0;
int j = 0;
char OutData;
Diff = InData - ValPreCVSD;
if (Diff > 0)
{
ThreeJudgeCVSD[j] = 1;
OutData = 1;
}
else
{
ThreeJudgeCVSD[j] = 0;
OutData = 0;
} //判断三连码
if (((ThreeJudgeCVSD[0] == 1) & (ThreeJudgeCVSD[1] == 1) & (ThreeJudgeCVSD[2] == 1)) | ((ThreeJudgeCVSD[0] == 0) & (ThreeJudgeCVSD[1] == 0) & (ThreeJudgeCVSD[2] == 0)))
DeltaCVSD = DeltaCVSD + Delta0CVSD;
else DeltaCVSD = Beta*DeltaCVSD;
if (DeltaCVSD > DeltaMax) DeltaCVSD = DeltaMax;
if (DeltaCVSD < DeltaMin) DeltaCVSD = DeltaMin;
if (ThreeJudgeCVSD[j] == 1)
{
ValPreCVSD = ValPreCVSD + DeltaCVSD;
}
if (ThreeJudgeCVSD[j] == 0)
{
ValPreCVSD = ValPreCVSD - DeltaCVSD;
}
j++;
j %= 3;
return OutData;
}
short CVSDDecoder(char InData)
{
double Max;
int j = 0;
int m = 0;
short OutData;
short DataDecode;
if (InData == 0) ThreeJudgeCVSDDE[m] = 0;
if (InData == 1) ThreeJudgeCVSDDE[m] = 1;
if (((ThreeJudgeCVSDDE[0] == 1) & (ThreeJudgeCVSDDE[1] == 1) & (ThreeJudgeCVSDDE[2] == 1)) | ((ThreeJudgeCVSDDE[0] == 0) & (ThreeJudgeCVSDDE[1] == 0) & (ThreeJudgeCVSDDE[2] == 0)))
DeltaCVSDDE = DeltaCVSDDE + Delta0CVSDDE;
else DeltaCVSDDE = Beta*DeltaCVSDDE;
if (DeltaCVSDDE > DeltaMax) DeltaCVSDDE = DeltaMax;
if (DeltaCVSDDE < DeltaMin) DeltaCVSDDE = DeltaMin;
if (ThreeJudgeCVSDDE[m] == 1) ValPreCVSDDE += DeltaCVSDDE;
if (ThreeJudgeCVSDDE[m] == 0) ValPreCVSDDE -= DeltaCVSDDE;
if (ValPreCVSDDE > 32767) ValPreCVSDDE = 32767;
if (ValPreCVSDDE < -32768) ValPreCVSDDE = -32768;
m++;
m %= 3;
OutData = (short)ValPreCVSDDE;
Max = 0;
filterX[0] = OutData;
for (j = 0; j < ORD; j++)
{
Max = Max + CoefB[j]*filterX[j];
}
for (j = 1; j < ORD; j++)
{
Max = Max - CoefA[j]*filterY[j-1];
}
DataDecode = (short)Max;
for (j = ORD-1; j > 0; j--)
{
filterX[j] = filterX[j-1];
}
for (j = ORD-2; j > 0; j--)
{
filterY[j] = filterY[j-1];
}
filterY[0] = (short)Max;
return DataDecode;
}
main()
{
short CVSDinput = 0;
char CVSDoutput;
short CVSDDEoutput;
char CVSDDEinput = 0;
CVSDoutput = CVSDCoder(CVSDinput);
CVSDDEoutput = CVSDDecoder(CVSDDEinput);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -