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

📄 5-7.c

📁 实现语音信号采集、压缩、编码、解码以及播放过程。
💻 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 + -