当前位置:首页 > 工业控制 > 电子设计自动化
[导读]以下是C语言实现无损压缩算法的代码:#include <stdio.h> #include <stdlib.h> #include <time.h> #define DNUM 64//define data number 8*8 #define LOOP 10000 //times of compression typedef struct { unsigne

以下是C语言实现无损压缩算法的代码:
#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define DNUM 64//define data number 8*8

#define LOOP 10000 //times of compression

typedef struct

{

unsigned short weight, data;

unsigned short parent, lchild, rchild;

} HuffNode;

typedef struct

{

unsigned char code;

unsigned short codelength;

} HuffCode;

unsigned int fCount[256] = {0};

unsigned int data_num;

unsigned int code_size;

unsigned int last_bit;

void FrequencyCount(unsigned char*);//频率统计

void HuffSelect(HuffNode*, int, int*, int*); //从结点中选出权最小的两个节点

void HuffmanCodeTable(HuffNode*, HuffCode*); //构造huffman树,生成huffman编码表

void HuffmanCompress(unsigned char*, unsigned char *, HuffCode*); //压缩数据

void BitPrint(unsigned char*);//按位打印结果,用于调试

void main()

{

int i, j, loop;//variable for loop

HuffNode hfdata[2*DNUM] = {{0, 0, 0, 0, 0}}; //Huffman node

HuffCode code_table[256] = {{0, 0}};//code table will be searched by subscript

unsigned char hfcode[2*DNUM];//output code

time_t time1, time2;

/* unsigned char pixel[DNUM] = {

1,2,3,4, 1,2,3,4, 1,2,3,4, 1,1,1,1};

*/

/* unsigned char pixel[DNUM] = {

139,144,149,153,155,155,155,155,

144,151,153,156,159,156,156,156,

150,155,160,163,158,156,156,156,

159,161,162,160,160,159,159,159,

159,160,161,162,162,155,155,155,

161,161,161,161,160,157,157,157,

162,162,161,163,162,157,157,157,

162,162,161,161,163,158,158,158};

*/

unsigned char pixel[DNUM] = { //random data

141, 101, 126, 111, 163, 112, 133, 156,

103, 144, 111, 176, 117, 120, 188, 187,

175, 164, 190, 156, 112, 179, 142, 119,

140, 111, 127, 186, 196, 190, 189, 127,

185, 103, 185, 110, 192, 139, 159, 104,

151, 193, 178, 198, 114, 170, 179, 149,

124, 149, 165, 108, 141, 176, 113, 164,

101, 140, 120, 126, 173, 189, 158, 184};

/* unsigned char pixel[DNUM] = {

202, 221, 159, 183, 41, 136, 247, 66,

146, 29, 101, 108, 45, 61, 210, 236,

90, 130, 54, 66, 132, 206, 119, 232,

184, 135, 96, 78, 120, 41, 231, 203,

150, 94, 172, 142, 122, 180, 150, 204,

232, 121, 180, 221, 3, 207, 115, 147,

72, 149, 169, 121, 76, 208, 235, 43,

107, 58, 0, 237, 197, 7, 210, 89};

*/

FrequencyCount(pixel);

time1 = time(NULL);

for (loop=0; loop<LOOP; loop++) {

//set huffman nodes data and weight, i=0:255, j=1:64

for (i=0, j=1, data_num=0; i<256; i++) {

if (fCount[i]) {

hfdata[j].weight = fCount[i];

hfdata[j++].data = i;

data_num ++;

}

}

//build huffman tree and generate huffman code table

HuffmanCodeTable(hfdata, code_table);

//compress source data to huffman code using code table

HuffmanCompress(pixel, hfcode, code_table);

//initial hfdata and code_table

for (j=0; j<2*DNUM; j++) {

hfdata[j].data=0;

hfdata[j].lchild=0;

hfdata[j].parent=0;

hfdata[j].rchild=0;

hfdata[j].weight=0;

}

}

time2 = time(NULL);

//conclude

printf("n哈夫曼编码压缩图块,压缩报告n华中科技大学力学系:李美之n");

printf("n◎源数据(%d字节):n ", DNUM);

for (i=0; i<DNUM; i++) {

printf(i%8==7 ? "%02Xn " : "%02X ", pixel[i]);

}

printf("n◎压缩数据(%d字节):n ", code_size);

for (i=0; i<code_size; i++) {

printf(i%8==7 ? "%02Xn " : "%02X ", hfcode[i]);

}

//打印码表

printf("nn◎码表-编码字典(%d项)n", data_num);

for (i=0; i<256; i++) {

if (code_table[i].codelength) {

printf("%3d|%02X: ", i, i);

for (j=0; j<code_table[i].codelength; j++) {

printf("%d", ((code_table[i].code << j)&0x80)>>7);

}

printf("t");

}

}

printf("nn◎压缩率:%2.0f%% t压缩时间:%.3f毫秒n",(float)code_size/DNUM * 100, 1E3*(time2-time1)/LOOP);

}

void BitPrint(unsigned char *hfcode)

{

int i, j;

int endbit = last_bit;

unsigned char thebyte;

for (i=0; i < code_size-1; i++) {

thebyte = hfcode[i];

for (j=0; j<8; j++) {

printf("%d", ((thebyte<<j)&0x80)>>7);

}

}

if (last_bit == 7) {

endbit = -1;

}

thebyte = hfcode[i];

for (j=7; j>endbit; j--) {

printf("%d", ((thebyte<<(7-j))&0x80)>>7);

}

}

void HuffmanCompress(unsigned char *pixel, unsigned char *hfcode, HuffCode * code_table)

{

int i, j;

int curbit=7; //current bit in _thebyte_

unsigned int bytenum=0; //number of destination code can also be position of byte processed in destination

unsigned int ptbyte=0; //position of byte processed in destination

unsigned int curlength; //code's length of _curcode_

unsigned char curcode; //current byte's huffman code

unsigned char thebyte=0; //destination byte write

unsigned char value; //current byte's value (pixel[])

//process every byte

for (i=0; i<DNUM; i++) {

value = pixel[i];

curcode = (code_table[value]).code;

curlength = (code_table[value]).codelength;

//move out every bit from curcode to destination

for (j=0;j<=curlength;j++) {

if ((curcode<<j)&0x80) {

thebyte |= (unsigned char)(0x01<<curbit);

}

curbit --;

if (curbit < 0) {

hfcode[ptbyte++] = thebyte;

thebyte = 0;

curbit = 7;

bytenum ++;

}

}

}

//think about which bit is the end

if (curbit != 7) {

hfcode[ptbyte] = thebyte;

bytenum ++;

}

code_size = bytenum;

last_bit = curbit;

}

void HuffmanCodeTable(HuffNode *hfdata, HuffCode *code_table)

{

int i, j; //variable for loop

int tree_num = 2*data_num - 1; //node of huffman tree

int min1, min2; //two minimum weight

int p; //the id of parent node

unsigned char curcode; //current code being processing

int curlength; //current code's length

//build huffman tree

for (i=data_num; i<tree_num; i++) {

HuffSelect(hfdata, i, &min1, &min2);

hfdata[min1].parent = i+1;

hfdata[min2].parent = i+1;

hfdata[i+1].lchild = min1;

hfdata[i+1].rchild = min2;

hfdata[i+1].weight = hfdata[min1].weight + hfdata[min2].weight;

}

//generate huffman code

//i present the i th code, j present from leaf to root in huffman tree

//hfdata[i].data (0:255) is a byte number

//编码从叶读到根,按位从高往低压入一个字节,读编码从左向右

for (i=1; i<=data_num; i++) {

curcode = 0;

curlength = 0;

for (j=i, p=hfdata[j].parent; p!=0; j=p, p=hfdata[j].parent) {

curlength ++;

if (j==hfdata[p].lchild) curcode >>= 1;

else curcode = (curcode >> 1) | 0x80; //0x80 = 128 = B1000 0000

}

code_table[hfdata[i].data].code = curcode;

code_table[hfdata[i].data].codelength = curlength;

}

}

void HuffSelect(HuffNode *hfdata, int end, int *min1, int *min2)

{

int i; //variable for loop

int s1, s2;

HuffNode wath[30];

for (i=0; i<30; i++) {

wath[i] = hfdata[i];

}

s1 = s2 = 1;

while (hfdata[s1].parent) {

s1++;

}

for (i=2; i<=end; i++) {

if (hfdata[i].parent == 0 && hfdata[i].weight < hfdata[s1].weight) {

s1 = i;

}

}

while (hfdata[s2].parent || s1 == s2) {

s2++;

}

for (i=1; i<=end; i++) {

if (hfdata[i].parent ==0 && hfdata[i].weight < hfdata[s2].weight && (i - s1)) {

s2 = i;

}

}

*min1 = s1;

*min2 = s2;

}

void FrequencyCount(unsigned char *chs)

{

int i;

for (i=0; i<DNUM; i++) {

fCount[*(chs+i)] ++;

}

}



来源:向明天进军0次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在工业控制系统中,Modbus RTU协议的CRC校验如同通信网络的"免疫系统",某石化厂DCS系统曾因CRC计算错误导致0.3%的数据包丢失,引发连锁控制故障。本文将深入解析CRC-16/MODBUS算法原理,对比软件...

关键字: Modbus RTU CRC 算法

加密算法分对称加密和非对称算法,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外,还有一类不需要密钥的散列算法。

关键字: 算法 嵌入式

在现代数字系统设计中,将算法高效地转化为 RTL(寄存器传输级)实现是 FPGA 工程师的核心任务之一。这一过程不仅需要对算法有深入理解,还需掌握 FPGA 的硬件特性和设计技巧。本文将详细介绍从算法到 RTL 实现的关...

关键字: 算法 寄存器传输级 数字系统

从本质上讲,算法是一种有条不紊、分步骤解决问题或完成任务的方法。无论是简单的数字相加公式,还是复杂的机器学习协议,算法都是软件应用的基础,确保任务能够高效有效地执行。

关键字: 算法 嵌入式

在自动驾驶技术的发展历程中,激光雷达(LiDAR)宛如一颗备受瞩目的新星,其独特的技术特性使其成为追求高安全性、高可靠性自动驾驶方案的首选。然而,这颗新星并非毫无争议,“价格昂贵、结构复杂、算法难度高” 等标签,也让一些...

关键字: 自动驾驶 激光雷达 算法

4月2日消息,近日,有关智能驾驶而引发的交通事故在网络上引起了大家的热烈讨论,对此,央视网评指出,“智能驾驶”,也请握紧方向盘。

关键字: 算法 智能驾驶

所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。对于排序,我们首先要求其具有一定的稳定性,...

关键字: 排序算法 算法

快速排序通过一趟排序将待排序列分割成独立的两部分,其中一部分序列的关键字均比另一部分序列的关键字小,则可分别对这两部分序列继续进行排序,以达到整个序列有序的目的。

关键字: 快速排序 算法

算法,作为解决问题的精确描述,是描述策略机制的系统方法。让我们在周末轻松探讨五个具有深远影响的算法:Metropolis-Hastings算法、单纯形法、快速傅立叶变换、快速排序算法,以及计算特征值的QR算法。这些算法在...

关键字: 算法 快速排序算法

服务需要保护自己,以免被太多的请求淹没(无论是恶意或无意的),从而保持可用性。举个生活中的例子,某个景区,平时可能根本没什么人前往,但是一旦到了国庆假日就人满为患,这时景区管理人员就会实施一系列的限流举措,来限制进入的人...

关键字: 限流 算法
关闭