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

📄 cvsd1.c

📁 TMS320C6713的16kCVSD编解码
💻 C
字号:
#include<stdio.h>
#include<math.h>
//#include<c55.h>
#define BUFFERSIZEOUT 254
#define BUFFERSIZEIN  4064

//设置Delta的初始值
#define DeltaMax 1280 //台阶最大值
#define DeltaMin 6.5 //台阶最小值
#define Beta 0.99     //设置Betade的初始值
#define G1 1
#define G2 1
#define G3 1

#define ORD 6         //滤波器阶数,可以改变滤波器的阶数
#define MAX_BITS 16

int j=0;
int m=0;

short CVSDinput[128]={0x08D4,
0x08CF,
0x0920,
0x0978,
0x09C3,
0x09F1,
0x0A28,
0x0A4C,
0x0A4C,
0x0A43,
0x0A46,
0x0A40,
0x0A17,
0x09E0,
0x0989,
0x094B,
0x08ED,
0x0891,
0x0805,
0x0786,
0x0706,
0x0679,
0x05EB,
0x056B,
0x04E5,
0x0443,
0x03E2,
0x0358,
0x02E1,
0x0247,
0x01E4,
0x0179,
0x0115,
0x00B0,
0x0067,
0x003D,
0x0014,
0x0002,
0x0002,
0x0002,
0x0001,
0x0000,
0x0041,
0x006E,
0x00A1,
0x00E5,
0x0144,
0x01BB,
0x0218,
0x028D,
0x0307,
0x039C,
0x043C,
0x04C1,
0x0563,
0x05D5,
0x0651,
0x06D5,
0x0773,
0x07D3,
0x0843,
0x08A9,
0x0919,
0x097D,
0x09BF,
0x0A09,
0x0A2A,
0x0A59,
0x0A6F,
0x0A6C,
0x0A50,
0x0A30,
0x09FF,
0x09C8,
0x0985,
0x0932,
0x08C6,
0x0867,
0x080D,
0x07A7,
0x070A,
0x067D,
0x05EE,
0x0579,
0x04D4,
0x0448,
0x03C9,
0x031A,
0x02B1,
0x0248,
0x01DD,
0x0160,
0x0108,
0x00C6,
0x0096,
0x003A,
0x000B,
0x0003,
0x0001,
0x0003,
0x0003,
0x0004,
0x0034,
0x0064,
0x00B1,
0x010E,
0x0168,
0x01BF,
0x0232,
0x02BC,
0x0331,
0x03A1,
0x0424,
0x04BC,
0x054E,
0x05DF,
0x066F,
0x0701,
0x076F,
0x07FA,
0x087B,
0x08DB,
0x0916,
0x096A,
0x09BF,
0x09FA,
0x0A30,
0x0A49,
};
 char  CVSDoutput[128];
 short CVSDDEoutput[128];
 char  CVSDDEinput[128];

double ValPreCVSD[3]={0,0,0};
double DeltaCVSD[2]={20}; //500//台阶
double Delta0CVSD=10; //500//台阶变化量
char ThreeJudgeCVSD[3]={0,1,0};
double ValPreCVSDDE[3]={0,0,0};
double DeltaCVSDDE[3]={20};//500
double Delta0CVSDDE=10;//500
char ThreeJudgeCVSDDE[3]={0,1,0};

static double CoefA[ORD]={1.0000e+000,1.9652e+004,8.9181e+008,1.2193e+013,1.9200e+017,1.4938e+021};//{1.000000,19652, 891810000,     12193000000000,192000000000000000,1493800000000000000000}; //{1.00000000,-3.88893329,6.64074495,-6.08600100,2.98673653,-0.62768820};
static double CoefB[ORD]={0.0000e+000,2.9369e+003,1.2847e-008,4.3301e+012,1.5947e+001,1.4938e+021};//{0,       2936.9,0.000000012847,4330100000000, 15.947,            1493800000000000000000}; //{0.03285030,-0.05723916,0.03681835,0.03681835,-0.05723916,0.03285030};

static short filterY[ORD];
static short filterX[ORD];
char CVSDCoder(short InData);
short CVSDDecoder(char InData);

char CVSDCoder(short InData)//编码子程序
{
 double Diff=0;
 char OutData;
 Diff=InData-ValPreCVSD[1];
 
 //将输入信号用一个比特表示
 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[1]=0.992218*DeltaCVSD[0]+G1*Delta0CVSD;//若有三连码提高台阶
 else
    DeltaCVSD[1]=0.992218*DeltaCVSD[0];    //DeltaCVSD[k]=Beta*DeltaCVSD[k];//若没有三连码将台阶变为原来的0.99倍
 if(DeltaCVSD[1]>DeltaMax)  
  DeltaCVSD[1]=DeltaMax;//台阶大于最大值,则将其还原为最大值
 if(DeltaCVSD[1]<DeltaMin)  
  DeltaCVSD[1]=DeltaMin;//台阶小于最小值,则将其还原为最小值
 
  DeltaCVSD[0]=DeltaCVSD[1];
 
 //积分器
 if(ThreeJudgeCVSD[j]==1) 
 {
  ValPreCVSD[2]=1.55001152*ValPreCVSD[1]-0.565857*ValPreCVSD[0]+G2*(DeltaCVSD[1]+7.7)+G2*0.036524*(DeltaCVSD[0]+7.7);
 }
 if(ThreeJudgeCVSD[j]==0) 
 {ValPreCVSD[2]=1.55001152*ValPreCVSD[1]-0.565857*ValPreCVSD[0]-G2*(DeltaCVSD[1]+7.7)-G2*0.036524*(DeltaCVSD[0]+7.7);
 }
 ValPreCVSD[0]=ValPreCVSD[1];
 ValPreCVSD[1]=ValPreCVSD[2];

 j++;
 j%=3;
 return OutData;
}

short CVSDDecoder(char InData)  //解码子程序
{
  double Max;
  int j=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[1]=0.992218*DeltaCVSDDE[0]+G1*Delta0CVSDDE;//DeltaCVSDDE+Delta0CVSDDE;//若有三连码提高台阶
  else
    DeltaCVSDDE[1]=0.992218*DeltaCVSDDE[0];//Beta*DeltaCVSDDE;//若没有三连码将台阶变为原来的0.99倍
  if(DeltaCVSDDE[1]>DeltaMax)  DeltaCVSDDE[1]=DeltaMax;//台阶大于最大值,则将其还原为最大值
  if(DeltaCVSDDE[1]<DeltaMin)  DeltaCVSDDE[1]=DeltaMin;//台阶小于最小值,则将其还原为最小值
   DeltaCVSDDE[0]=DeltaCVSDDE[1];
  //积分器H2d(Z)
  if(ThreeJudgeCVSDDE[m]==1) 
  {
   ValPreCVSDDE[2]=1.55001152*ValPreCVSDDE[1]-0.565857*ValPreCVSDDE[0]+DeltaCVSDDE[1]+7.7;
   }
  if(ThreeJudgeCVSDDE[m]==0) 
  {
   ValPreCVSDDE[2]=1.55001152*ValPreCVSDDE[1]-0.565857*ValPreCVSDDE[0]-DeltaCVSDDE[1]-7.7;
  }
  if(ValPreCVSDDE[2]>2674) ValPreCVSDDE[2]=2674;//32767;
  if(ValPreCVSDDE[2]<0) ValPreCVSDDE[2]=0;//-32768;
  
  ValPreCVSDDE[0]=ValPreCVSDDE[1];
  ValPreCVSDDE[1]=ValPreCVSDDE[2];
  m++;
  m%=3;
  
  //椭圆IIR滤波器
  OutData=(short)ValPreCVSDDE[2];
  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];
  }
  DataDecode=(short)((((float)Max)/(4e24))*32767);
  for(j=ORD-1;j>0;j--)
  {
   filterX[j]=filterX[j-1];
  }
  for(j=ORD-1;j>0;j--)
  {
   filterY[j]=filterY[j-1];
  }
  filterY[0]=(short)Max;
  return DataDecode;  
}
main()//主程序
{int i;
 
 
 for(i=0;i<128;i++)
 {
 CVSDoutput[i]=CVSDCoder(CVSDinput[i]);//调用编码子程序

 }
 for(i=0;i<128;i++)
 {
 
 CVSDDEoutput[i]=CVSDDecoder(CVSDoutput[i]);//调用解码子程序
 }
  
 while(1)
 {}
}

⌨️ 快捷键说明

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