A律压缩与解压缩算法
实验原理:
在进行A律压缩时,对于采样到的12位数据,默认其最高位为符号位,压缩时要保持最高位即符号位不变,原数据的后11位要压缩成7位。
这7位码由3位段落码和4位段内码组成。
具体的压缩变换后的数据根据后11位数据大小决定。
具体的编译码表如表5.2所示。
压缩后的数据的最高第7位)表示符号,量阶分别为1、1、2、4、8、16、32、64,由压缩后数据的第6位到第4位决定,第3位到第0位是段内码。
压缩后的数据有一定的失真。
有些数据不能表示出,只能取最近该数据的压缩值。
例如,数据125,压缩后的值为00111111,意义如下:
程序如下所示:
#include "stdio.h"
int main() //验证方法
{
int m,n;
int compress(int input);
int decompress(int input);
m=compress(-16); //输出m=129,因为符号位的关系10000001
n=decompress(m); //输出n=-16,解压缩
printf("%d\n",m);
printf("%d\n",n);
return 0;
}
//压缩函数
int compress(int input)
{
int i,inputtemp,seg,flag,offset;
if(input<0) //获取最高位的符号位
{
flag = 1;
inputtemp=-1*(input);
}
else
{
flag = 0;
inputtemp = input;
}
inputtemp=(inputtemp>>4) & 0x7ff; //获取原始数据的除符号外的高位
if(inputtemp < 16)
{
return ((flag<<7) | inputtemp);
}
for(i=0;i<=6;i++)
{
if(inputtemp < (1<<(5+i)))
{
seg=(i+1); //段落码 offset=(inputtemp-(1<<(5+i-1)))/(1<<i); //段内码 return ((flag<<7) | (seg<<4) | offset); //压缩值}
}
return 0;
}
//解压缩函数
int decompress(int input)
{
int i,flag,seg,offset,temp;
flag=input>>7; //获取最高位的符号位
seg=(input>>4) & 0x0007; //段落码
offset=input & 0x000f; //段内码
if(seg == 0)
{
temp=offset;
}
else
{
i=(seg-1);
temp=(offset*(1<<i)+(1<<(5+i-1)));
}
if(flag==0)
return (temp << 4);
else
return ((-1)*(temp << 4)); }。