利用Huffman算法对RINEX格式GPS观测文件进行压缩

合集下载

数据压缩算法在卫星遥感数据处理中的应用技巧(九)

数据压缩算法在卫星遥感数据处理中的应用技巧(九)

数据压缩算法在卫星遥感数据处理中的应用技巧概述:卫星遥感数据处理是现代地质、气象、环境等领域研究的重要手段之一,数据压缩算法在该过程中起着关键作用。

本文将探讨数据压缩算法在卫星遥感数据处理中的应用技巧。

一、压缩算法的意义卫星遥感数据获取的过程中,数据量庞大,给数据传输和存储带来了巨大的困扰。

数据压缩算法可以有效地减小数据量,提高数据传输和存储的效率。

因此,研究和应用数据压缩算法具有重要的意义。

二、无损压缩与有损压缩数据压缩算法可以分为无损压缩和有损压缩,根据需求选择合适的压缩算法非常重要。

1. 无损压缩无损压缩算法通过减小数据的冗余度来实现数据压缩,实现压缩的同时完全保留数据的原始信息。

这种算法适用于对数据的精确保留要求比较高的场景。

例如,卫星遥感图像中的一些重要细节需要完整地保留下来,此时可以选择无损压缩算法。

2. 有损压缩有损压缩算法通过舍弃部分数据的细节信息,实现压缩效果。

虽然会导致数据的一定程度的质量损失,但对于某些应用场景来说,这种信息损失是可以接受的。

例如,对于某些卫星遥感图像中的细节部分,可以采用有损压缩算法,减小数据量的同时满足数据传输和存储的需求。

三、常用的压缩算法在卫星遥感数据处理中,常用的压缩算法有很多,下面我们介绍几种常见的压缩算法。

1. Huffman压缩算法Huffman压缩算法是一种典型的无损压缩算法,通过统计数据中各个符号出现的频率,根据频率来给不同的符号编码。

频率较高的符号用较短的编码表示,频率较低的符号用较长的编码表示。

这种算法适用于对数据中符号的频率分布进行压缩的场景。

2. 等长编码压缩算法等长编码压缩算法是一种无损压缩算法,该算法将数据划分为等长的数据块,然后将每个数据块映射到一个二进制码。

这种算法适用于对数据分段进行压缩的场景。

3. DCT压缩算法离散余弦变换(DCT)是一种常用的有损压缩算法,该算法通过将数据转换为频域,将低频部分保留下来,剔除高频细节以达到压缩的目的。

GPS定位数据压缩算法的设计

GPS定位数据压缩算法的设计

GPS定位数据压缩算法的设计
任华新
【期刊名称】《长春工程学院学报(自然科学版)》
【年(卷),期】2008(009)003
【摘要】为了解决嵌入式GPS车载系统存储空间小、GPS定位数据量大的矛盾,根据GPS定位数据的特点,提出用动态Huffman算法对GPS信号进行压缩.该算法是一种Huffman算法的基础上改进的算法,为车载系统节省了大量的存储资源.除此之外,也缩短了GSM信道的占用时间,缓解了向控制调度中心上传数据的压力.【总页数】3页(P74-76)
【作者】任华新
【作者单位】辽宁对外经贸学院,大连,116052
【正文语种】中文
【中图分类】TP306
【相关文献】
1.数据采集系统中的数据压缩算法设计 [J], 娄华平;孙运强;姚爱琴
2.基于SRWF -1028的GPS定位数据传输系统的设计 [J], 赵敏;李锦明;马游春;王向玲
3.GPS定位数据压缩算法的设计与实现 [J], 杨宏业;张跃
4.GPS定位数据采集器的设计与实现 [J], 吴定雪;范文萍
5.GPS定位数据的提取与存储系统的设计 [J], 鲍萍萍;陈光;王朋;王鹏辉
因版权原因,仅展示原文概要,查看原文内容请购买。

Huffman的应用之文件压缩与解压缩

Huffman的应用之文件压缩与解压缩

Huffman的应用之文件压缩与解压缩最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,zip压缩的介绍>下面开始介绍自己实现的文件压缩的思路和问题...1).统计>读取一个文件统计这个文件中字符出现的次数.2).建树>以字符出现的次数作为权值使用贪心算法构建Huffman树(根据Huffman树的特性>字符出现次数多的一定靠近根结点,出现次数少的一定远离根结点).3).生成Huffman编码>规则左0右1.4).压缩>再次读取文件,根据生成的Huffman编码压缩文件.5).生成配置文件>将字符以及字符出现的次数写进配置文件中.6).解压缩>利用配置文件还原出Huffman树,根据压缩文件还原出原文件.7).测试>判断解压是否正确需要判断原文件和解压缩之后的文件是否相同,利用Beyond Compare软件进行对比.下面是我举的一个简单的范例,模拟压缩和解压缩的过程,希望有读者有帮助利用Beyond Compare软件进行对比>在实现中出现了很多的问题,下面我提出几个容易犯的问题,仅供参考1).在使用贪心算法构建Huffman树的时候,如果我们以unsigned char一个字节来存储它总共有2^8=256个字符,如果将所有的字符都构建Huffman树,这不仅降低了效率还将分配极大的内存.所以我设立了非法值这个概念,只有当字符出现的次数不为0的时候才将该字符构建到Huffman树中.2).在写压缩文件的时候我们是将字符对应的Huffman编码转化为对应的位,每当填满一个字节(8位)后再写入压缩文件中.如果最后一个字节没有填满我们就将已经填的位移位空出后几个位置,将未满的位置补0补满一个字节再写入压缩文件中.3).如果我们将源文件压缩之后再去解压,因为你的Huffman树和Huffman编码都是在压缩函数中得到的,此时再去解压那仫你的Huffman编码以及不存在了该如何去还原文件呢?这就是为什仫要生成配置文件的原因了,在配置文件中写入了字符以及字符出现的次数.在解压缩中根据配置文件构建新的Huffman树.4).由压缩文件还原文件的时候如何知道压了多少个字符呢?也就是说因为我们在压缩的时候最后一个字节是补了0的在解压缩的时候可能会把这个补的位当成字符的编码来处理.一种想法是在统计字符出现的次数的时候设置一个变量,每读取一个字符该变量就加1,最后将该变量写进配置文件中.另外一种想法就是根据根结点的权值,通过上述简单的实例观察可知根结点权值中的_count就是字符出现的次数.解决了以上几个问题,我的程序已经可以压缩那256个字符并正确的还原了,那仫如果是大文件或者是汉字,图片以及音频视频呢?1).因为有些特殊的字符编码,所以我们统计字符出现的次数的时候应该用的是unsigned char,刚开始我用的文件结束标志是EOF在ASII中它的编码是-1此时已经不可以用EOF来判断是否文件结束了,所以我用了feof这个函数来判断文件是否结束.2).统计字符出现次数应该用的类型是long long,这就解决了大文件的压缩和解压缩的问题了.3).因为汉字,图片,视频这些在内存中是以二进制的形式存在的,所以我们将以文本形式打开读或者写的修改为以二进制的形式读或者写.为了验证大文件的压缩我找了一个8.09M的文件压缩之后是6.50M,并且可以正确还原.1).测试效率>2).利用Beyond Compare软件进行对比,如果一样说明压缩成功>[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片#define _CRT_SECURE_NO_W ARNINGS 1#pragma once#include "Heap.h"template<class T>struct HuffmanTreeNode{T _weight;HuffmanTreeNode<T> *_left;HuffmanTreeNode<T> *_right;HuffmanTreeNode<T> *_parent;HuffmanTreeNode(const T& w=T()):_weight(w),_left(NULL),_right(NULL),_parent(NULL){}};template<class T>class HuffmanTree{typedef HuffmanTreeNode<T> Node;public:HuffmanTree():_root(NULL){}HuffmanTree(const T* a,size_t size):_root(NULL){_root=_CreatHuffmanTree(a,size);}//将未出现的字符过滤出来,不构造堆HuffmanTree(const T* a,size_t size,const T& invalid){_root=_CreatHuffmanTree(a,size,invalid);}Node* GetRoot(){return _root;}~HuffmanTree(){_Destroy(_root);}protected:Node *_CreatHuffmanTree(const T* a,size_t size){struct NodeLess{bool operator()(Node *l,Node *r)const{return l->_weight < r->_weight;}};Heap<Node *,NodeLess> minHeap;//建立结点并放入vector中for (size_t i=0;i<size;++i){Node *tmp=new Node(a[i]);minHeap.Push(tmp);}//取出较小的两个结点作为左右孩子并构建父结点while (minHeap.Size() > 1){Node *left=minHeap.Top();minHeap.Pop();Node *right=minHeap.Top();minHeap.Pop();Node *parent=new Node(left->_weight + right->_weight);parent->_left=left;parent->_right=right;left->_parent=parent;right->_parent=parent;minHeap.Push(parent);}return minHeap.Top();}//思路类似不带过滤功能的Node *_CreatHuffmanTree(const T* a,size_t size,const T& invalid) {struct NodeLess{bool operator()(Node *l,Node *r)const{return l->_weight < r->_weight;}};Heap<Node *,NodeLess> minHeap;//建立结点并放入vector中for (size_t i=0;i<size;++i){if(a[i] != invalid){Node *tmp=new Node(a[i]);minHeap.Push(tmp);}}//取出较小的两个结点作为左右孩子并构建父结点while (minHeap.Size() > 1){Node *left=minHeap.Top();minHeap.Pop();Node *right=minHeap.Top();minHeap.Pop();Node *parent=new Node(left->_weight + right->_weight);parent->_left=left;parent->_right=right;left->_parent=parent;right->_parent=parent;minHeap.Push(parent);}return minHeap.Top();}void _Destroy(Node *&root)if(root == NULL)return ;Node *cur=root;if(cur){_Destroy(cur->_left);_Destroy(cur->_right);delete cur;cur=NULL;return ;}}protected:Node *_root;};void testHuffmanTree(){int a[]={0,1,2,3,4,5,6,7,8,9};int size=sizeof(a)/sizeof(a[0]);HuffmanTree<int> ht(a,size);}[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片#define _CRT_SECURE_NO_W ARNINGS 1#pragma once//利用仿函数的特性实现代码的复用性template<class T>struct Small{bool operator()(const T& l,const T& r){return l < r;}};template<class T>struct Large{bool operator()(const T& l,const T& r)return l > r;}};template<class T,class Compare=Large<T>> //缺省是建小堆class Heap{public:Heap(){}Heap(const T *a,int size){assert(a);_a.reserve(size);for (int i=0;i<size;++i){_a.push_back(a[i]);}//建堆的时候从倒数第一个非叶子结点开始.for (int j=(size-2)/2;j>=0;--j){_AdjustDown(j);}}void Push(const T& x){_a.push_back(x);_AdjustUp(_a.size()-1);}void Pop(){assert(!_a.empty());swap(_a[0],_a[_a.size()-1]);_a.pop_back();_AdjustDown(0);}size_t Size(){return _a.size();}bool Empty(){return _a.empty();const T& Top()const{assert(!_a.empty());return _a[0];}void Display(){for (size_t i=0;i<_a.size();++i){cout<<_a[i]<<" ";}cout<<endl;}protected:void _AdjustDown(int root){int parent=root;size_t child=2*root+1;while (child < _a.size()){Compare com;//child指向左右孩子中较大的那个数//if (child+1 < _a.size()// && _a[child+1] > _a[child])if(child+1 < _a.size()&& com(_a[child+1],_a[child])){child++;}//if (_a[child] > _a[parent])if(com(_a[child],_a[parent])){swap(_a[child],_a[parent]);parent=child;//初始的child默认指向左孩子child=2*parent+1;}elsebreak;}}void _AdjustUp(int child){while (child > 0){int parent=(child-1)/2;Compare com;//if (_a[child] > _a[parent])if(com(_a[child],_a[parent])){swap(_a[child],_a[parent]);child=parent;}else//插入的数据比父节点的数据域小break;}}protected:vector<T> _a;};//利用堆解决优先级队列的问题template<class T,class Compare=Large<T>>class PriorityQueue{public:PriorityQueue(int *a,int size):_pq(a,size){}void Push(const T& x){_pq.Push(x);}void Pop(){_pq.Pop();}const T& Top()const{return _pq.Top();}void Display(){_pq.Display();}protected:Heap<T,Compare> _pq;};[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片#define _CRT_SECURE_NO_W ARNINGS 1#pragma once#include "HuffmanTree.h"typedef long long Type;struct CharInfo{unsigned char _ch; //出现的字符Type _count; //统计次数string _code; //Huffman编码CharInfo(Type count=0):_ch(0),_count(count),_code(""){}//重载对应的操作符CharInfo operator + (const CharInfo& fc)const{return CharInfo(_count + fc._count);}bool operator != (const CharInfo fc)const{return _count != fc._count;}bool operator < (const CharInfo& fc)const{return _count < fc._count;}};class FileCompress{public://默认的构造函数FileCompress(){for(size_t i=0;i<256;++i){_infos[i]._ch=i;}}string Compress(const char *filename){assert(filename);FILE *pf=fopen(filename,"rb");assert(pf);unsigned char ch=fgetc(pf);//统计字符出现的次数while (!feof(pf)){_infos[ch]._count++;ch=fgetc(pf);}//以该字符出现的次数构建一颗HuffmanTree.CharInfo invalid; //非法值HuffmanTree<CharInfo> ht(_infos,256,invalid);//生成Huffman编码string code;_CreatHuffmanCode(ht.GetRoot(),code);//_CreatHuffmanCode(ht.GetRoot());//压缩文件fseek(pf,0,SEEK_SET); //回到文件头string compressfile=filename;compressfile += ".compress"; //压缩后的文件名FILE *fin=fopen(compressfile.c_str(),"wb");assert(fin);size_t pos=0; //记录位数unsigned char value=0;ch=fgetc(pf);while (!feof(pf)){string &code=_infos[ch]._code;for (size_t i=0;i<code.size();++i){value <<= 1;if(code[i] == '1')value |= 1;elsevalue |= 0; //do-nothing++pos;if(pos == 8) //满一个字节{fputc(value,fin);value=0;pos=0;}}ch=fgetc(pf);}if(pos) //解决不足8位的情况.{value <<= (8-pos);fputc(value,fin);}//配置文件--便于重建Huffman树string ename=filename;configfilename += ".config";FILE *finconfig=fopen(configfilename.c_str(),"wb");assert(finconfig);string line;char buff[128];for (size_t i=0;i<256;++i){//一行一行的读if (_infos[i]._count){line += _infos[i]._ch;line += ",";line += _itoa(_infos[i]._count,buff,10);line += "\n";//fputs(line.c_str(),finconfig);fwrite(line.c_str(),1,line.size(),finconfig);line.clear();}}fclose(pf);fclose(fin);fclose(finconfig);return compressfile;}string UnCompress(const char *filename){assert(filename);string configfilename=filename;size_t index=configfilename.rfind(".");configfilename=configfilename.substr(0,index); configfilename += ".config";FILE *foutconfig=fopen(configfilename.c_str(),"rb"); assert(foutconfig);string line;//读取配置文件--获取字符出现的次数unsigned char ch=0;while (ReadLine(foutconfig,line)){if(line.empty()){line += '\n';continue;}//读到空行ch=line[0];_infos[ch]._count = atoi(line.substr(2).c_str());line.clear();}//构建Huffman树CharInfo invalid;HuffmanTree<CharInfo> hft(_infos,256,invalid);//根结点的权值也就是字符出现的次数总和HuffmanTreeNode<CharInfo> *root=hft.GetRoot(); Type charcount=root->_weight._count;//解压缩string uncompressfilename=filename;index=uncompressfilename.rfind("."); uncompressfilename=uncompressfilename.substr(0,index); uncompressfilename += ".uncompress";FILE *fin=fopen(uncompressfilename.c_str(),"wb"); assert(fin);//由压缩文件还原文件string compressfilename=filename;FILE *fout=fopen(compressfilename.c_str(),"rb");assert(fout);HuffmanTreeNode<CharInfo> *cur=root;int pos=7;ch=fgetc(fout);while (charcount > 0){while (cur){if(cur->_left == NULL && cur->_right == NULL){//叶子结点fputc(cur->_weight._ch,fin);cur=root;--charcount;if (charcount == 0) //所有的字符都处理完成break;}if (ch & (1 << pos)) //检查字符的每个位cur=cur->_right; //1向右走elsecur=cur->_left; //0向左走--pos;if(pos < 0) //一个字节解压完成{ch=fgetc(fout);pos=7;}}}fclose(foutconfig);fclose(fin);fclose(fout);return uncompressfilename;}//读取一行字符并放在line中bool ReadLine(FILE *fout,string& line){int ch=fgetc(fout);if(ch == EOF)return false;while (ch != EOF && ch != '\n'){line += ch;ch=fgetc(fout);}return true;}protected://递归的方法求HuffmanTreeCodevoid _CreatHuffmanCode(HuffmanTreeNode<CharInfo> *root,string &code) {if(root == NULL)return ;_CreatHuffmanCode(root->_left,code+'0');_CreatHuffmanCode(root->_right,code+'1');if(root->_left == NULL && root->_right == NULL) //叶子结点{_infos[root->_weight._ch]._code=code;}}//非递归求HuffmanTreeCodevoid _CreatHuffmanCode(HuffmanTreeNode<CharInfo> *root){if(root == NULL)return ;_CreatHuffmanCode(root->_left);_CreatHuffmanCode(root->_right);if(root->_left == NULL && root->_right == NULL) //叶子结点{string& code=_infos[root->_weight._ch]._code;HuffmanTreeNode<CharInfo> *cur=root;HuffmanTreeNode<CharInfo> *parent=root->_parent;while (parent){if(parent->_left == cur)code.push_back('0'); //左0elsecode.push_back('1'); //右1cur=parent;parent=cur->_parent;}//编码是从根到叶子结点的,需要逆置reverse(code.begin(),code.end());}}protected:CharInfo _infos[256];};void testFileCompress(){FileCompress fc;cout<<"开始压缩"<<endl;cout<<"压缩用时:";int start=GetTickCount();press("2.png"); //input input.BIG 3.mp3int end=GetTickCount();cout<<end-start<<endl;cout<<"开始解压"<<endl;cout<<"解缩用时:";start=GetTickCount();fc.UnCompress("press"); //press press 3.mp3end=GetTickCount();cout<<end-start<<endl;}void testFileUncompress(){FileCompress fc;cout<<"开始解压"<<endl;cout<<"解缩用时:";int start=GetTickCount();fc.UnCompress("2.png");int end=GetTickCount();cout<<end-start<<endl;}经过测试这个小项目已经可以压缩并还原一些文件了,目前还没有发现什仫大的Bug,如果有童鞋发现请第一时间告诉我哦...。

GPS数据预处理RINEX格式验证及标准化

GPS数据预处理RINEX格式验证及标准化

&sup2; 执行后,输出验证信息;
命令为:
teqc +v source.**o
teqc +v source1.**o source2.**o source3.**o
验证同类型多个文件的格式时,后面文件的时间标示要在前面文件的后面,否则给出提示:
E:\TEQC>teqc +v test.03o temp.txt
(current epoch preceeds last epoch) ... exiting
2.3文件头的编辑和提取
命令为:
teqc –O.mo monument source.**o >result.**o
将source.**o文件中的点名改为monument,输出文件为result.**o
O文件头部分常用的设置有:
–O.rn: 点名
–O.mn: 测站编号
-O.at: 天线类型
-O.an: 天线编号
-O.rt: 接收机类型
//注意:IGS标准约定:接收机类型共20位,格式为:“仪器公司名+space+模型名”eg:“TPS HIPER-GD”。而TEQC命令行中是不能连续出现非参数选项,则修改接收机类型时要加引号:
teqc –O.rt “TPS HIPER-GD” source.**o > result.**o
-O.int: 采样率间隔
+O.c: 追加注释行记录
3.QC (Quality Check) 质量检核
质量检核有2种模式:lite模式和full模式。
3.1 lite模式需要的文件是:O文件。
**.ion L1-L2电离层延迟;

哈夫曼编码的压缩与解压缩

哈夫曼编码的压缩与解压缩

哈夫曼编码的压缩与解压缩1.引言1.1 概述哈夫曼编码是一种常用的数据压缩算法,它采用了一种变长编码方式,将出现频率高的字符用较短的编码表示,出现频率低的字符用较长的编码表示,以达到压缩数据的目的。

该编码方法由美国数学家大卫·哈夫曼于1952年提出,被广泛应用于各种数据压缩和传输领域。

在传统的固定长度编码中,每个字符都使用相同的位数来表示,因此在表示不同概率出现的字符时,可能会浪费大量的位数。

而哈夫曼编码则是根据字符在文本中出现的频率来确定其对应的编码,使得高频出现的字符用更短的编码表示,低频出现的字符用较长的编码表示。

哈夫曼编码的核心思想是构建一棵哈夫曼树,将出现频率作为权值,频率越高的字符离根节点越近。

通过从叶子节点到根节点的路径确定每个字符的编码,即将左子树标记为0,右子树标记为1。

在对文本进行压缩时,将文本中的字符转换为其对应的哈夫曼编码,即可将原始数据压缩为较短的二进制串。

相比于传统固定长度编码,哈夫曼编码具有显著的优势。

首先,它可以根据文本中字符出现的实际情况进行编码,使得频率高的字符用较短的编码表示,从而大幅度减少了编码后的数据长度。

其次,哈夫曼编码是一种前缀编码,即任何一个字符的编码都不是其他字符编码的前缀,这样在解码时可以直接根据编码找到对应的字符,无需回溯查表,提高了解码效率。

哈夫曼编码的应用广泛,它被用于无损图像压缩、音频压缩、文本压缩等领域。

随着互联网和大数据时代的到来,数据的传输和存储成为重要的问题,如何高效地压缩和解压缩数据成为一个热门的研究方向。

哈夫曼编码作为一种简单而有效的压缩算法,具有广阔的应用前景。

然而,哈夫曼编码也存在一些问题,如编码时需要构建哈夫曼树,需要额外的空间和时间开销,对于小规模数据可能会影响压缩效率。

因此,在实际应用中,需要综合考虑数据规模和应用场景,选择合适的压缩算法。

1.2 文章结构本文主要介绍了哈夫曼编码的压缩与解压缩。

文章分为引言、正文和结论三个部分。

用哈夫曼编码实现文件压缩.doc

用哈夫曼编码实现文件压缩.doc

《用哈夫曼编码实现文件压缩》实验报告课程名称数据结构(B)实验学期2009 至2010 学年第 1 学期学生所在系部计算机系年级2007 专业班级计算机B071学生姓名陆永芳学号200707014105任课教师盛建瓴实验成绩用哈夫曼编码实现文件压缩1、了解文件的概念。

2、掌握线性链表的插入、删除等算法。

3、掌握Huffman树的概念及构造方法。

4、掌握二叉树的存储结构及遍历算法。

5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。

微型计算机、Windows 系列操作系统、Visual C++6.0软件根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。

本次实验采用将字符用长度尽可能短的二进制数位表示方法,即对于文件中出现的字符,无须全部都用8位的ASCII码进行存储,根据他们在文件中出现色频率不同,我们利用Haffman算法使每个字符都能以最短的二进制字符进行存储,以达到节省存储空间,压缩文件的目的。

解决了压缩需采用的算法,程序的思路就清晰了:1.统计需压缩文件中每个字符出现的频率2.将每个字符的出现频率作为叶子结点构建Haffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径得到0、1的序列,这样便能完成了Haffman的编码,将每个字符用最短的二进制字符表示。

3.打开需压缩文件,再将需压缩文件中的每个ascii码对应的Haffman编码按bit单位输出。

4.文件压缩结束。

(1)构造Huffman树的方法——Haffman算法构造Huffman树步骤:I.根据给定的n个权值{w1,w2,……,wn},构造n棵只有根结点的二叉树,令起权值为wj。

II.在森林中选取两棵根结点权值最小的树作为左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。

Huffman的应用之文件压缩与解压缩汇总

Huffman的应用之文件压缩与解压缩汇总
解决了以上几个问题,我的程序已经可以压缩那256个字符并正确的还原了,那仫如果是大文件或者是汉字,图片以及音频视频呢?
1).因为有些特殊的字符编码,所以我们统计字符出现的次数的时候应该用的是unsigned char,刚开始我用的文件结束标志是EOF在ASII中它的编码是-1此时已经不可以用EOF来判断是否文件结束了,所以我用了feof这个函数来判断文件是否结束.
template<class T>
struct HuffmanTreeNode
{
T _weight;
HuffmanTreeNode<T> *_left;
HuffmanTreeNode<T> *_right;
HuffmanTreeNode<T> *_parent;
HuffmanTreeNode(const T& w=T())
Huffman的应用之文件压缩与解压缩
最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,zip压缩的介绍>
{}
HuffmanTree(const T* a,size_t size)
:_root(NULL)
{
_root=_CreatHuffmanTree(a,size);
}
//将未出现的字符过滤出来,不构造堆
HuffmanTree(const T* a,size_t size,const T& invalid)
下面是我举的一个简单的范例,模拟压缩和解压缩的过程,希望有读者有帮助

GPS数据文件通用格式(rinex)转换

GPS数据文件通用格式(rinex)转换

RINEX数据格式(一)文章分类:综合技术由于GPS 接收机类型多种多样, GPS 原始数据的数据处理是非常繁重而复杂的。

RINEX 是英文“Receiver Independent Exchange Format”(接收机通用数据交换格式) 的缩写形式。

为使GPS数据处理软件通用化, 同时验证所用算法的可行性, GPS数据需要首先转换为RINEX标准格式, 然后再设计与编制所需软件。

在这种方式下, 一种软件能处理多种类型的GPS接收机所采集的数据。

美国德克萨斯大学应用研究实验室早期提出了一种标准的FICA文档格式,它的设计原则是尽可能保持接收机所收集数据的原始特征, 只将该数据的二进制码逐个转换为计算机的ASCII 码, 对数据本身不作任何处理。

显然, 这种格式对数据库是理想的, 但对大量信息的存储和调用是繁杂的。

此格式曾经用于CIGNET计划中。

此后, 美国大地测量局开发了ARGO格式。

它将不同型号接收机收集的数据重新进行格式化, 完全符合CIGNET计划的应用。

但这种格式固定不变, 很难插入其它信息。

1989 年, 瑞士伯尔尼大学天文研究所为用于EUREF 计划, 提出了RINEX 格式草案。

1989年3月, 在美国新墨西哥州举行的第五届国际卫星定位大地测量学术讨论会上, 成立了GPS交换格式的专题研究机构, 讨论了各种数据交换格式的差异。

经过讨论决定, 形成了RINEX (版本1.0) 数据交换格式。

1989 年8月在英国爱丁堡举行的国际大地测量协会上, RINEX格式被推荐为通用的测量GPS数据的标准交换格式。

在随后一年半的应用中, RINEX 被证明为GPS数据交换的一种有效途径。

1990年9月5日, 在加拿大渥太华举行的第二届国际GPS精密定位学术讨论会上, 提出了RINEX 格式(版本2.0) 的建议。

最后一次定稿是1993年3月在瑞士伯尔尼举行的IGS地球动力学学术讨论会上通过的。

数据结构实验报告利用Huffman编码对文件进行压缩解压

数据结构实验报告利用Huffman编码对文件进行压缩解压

《数据结构》实验报告利用Huffman编码对文件进行压缩解压学生:XXX学号:XXXXXXXX联系:XXXXXX@(一)基本信息1.实验题目利用Huffman编码对文件进行压缩解压2.完成人(姓名、学号)姓名:XXX 学号:XXXXXXXX3.报告日期2007年12月12日星期二(二)实习内容简要描述1.实习目标学会对树的基本操作学会对文件进行操作利用Huffman编码对文件压缩解压2.实习要求实现最小堆模板类利用最小堆构建Huffman树实现Huffman编码和解码根据用户从键盘输入的报文文本,输出各字符的Huffman编码以及报文的编码根据用户从键盘输入一串报文文本,输出各字符的Huffman编码输出报文的Huffman编码及长度根据输入的Huffman编码,解码输出利用Huffman编码和解码对二进制文件的压缩和解压(三)报告主要内容1.设计思路开发环境:Microsoft Visual C++ 2005设计思路:1.设计Pack类储存字符的权值2.设计MinHeap模板类构建最小堆3.设计ExtBinTree模板类为带权二叉树4.设计Compress模板类以实现文件的压缩解压2.主要数据结构1.MinHeap.h: 头文件,包含MinHeap模板类的类界面以及定义;2.HuffmanTree.h:头文件,包含ExtBinTree模板类以及Compress模板类的类的的类界面以及定义3.main.cpp:调用上述头文件实现相关操作3.主要代码结构主要代码结构为见附件中各文件的代码注释4.主要代码段分析主要代码段分析,见附件中的代码注释(四)实习结果1.基本数据源程序代码行数:约800行完成该实习投入的时间:二十四小时(不包括写实验报告的时间)与其他同学讨论交流情况:感谢刘畅同学对程序的测试2.测试数据设计1.对屏幕输入字符进行Huffman编码2.根据Huffman树非唯一性,虽然和课件上有些许不同,但是还是正确的3.输入字符串:CASTCASTSATATATASA4.输出编码:A:0 C:110 S:111 T:105.输入霍夫曼编码:01110101101106.输出译码:ASATCC7.8.对”实验05.PPT”的压缩操作9.使用0秒(不足一秒按0秒计算),压缩率为56.1755%10.对”实验05.ppt.hfm”(即刚才生成的压缩文件)的解压操作11.使用0秒(不足一秒按0秒计算),解压后文件无异常12.对一个18M的EXE安装包前后进行压缩和解压操作,分别用时10秒和9秒3.测试结果分析A)程序运行的系统资源配置操作系统:Microsoft Windows XP Professional SP2CPU: AMD Athlon 3600+ 2.0GRAM: 1024M DDRII开发环境:Microsoft Visual C++ 2005B)对TXT文档进行压缩和解压后,通过WinMerge检验和原文件无差异C)对MP3和EXE文件压缩和解压后仍能正常使用D)对于中文名字和带有空格的路径均能正确无误识别E)文件名只能小于16个字符(包括后缀名),否则解压会出错(只预留了16个字节用于储存文件名)F)相对于不用文件块读写的程序,效率提高了三倍以上G)具有动态进度条,可以显示当前压缩和解压的进度百分比(当然消耗了一些系统资源)H)出错处理不够充分,特别是cin部分,如果误输入可能会造成死循环(五)实习体会1.实习过程中遇到问题及解决过程A)一开始时候的程序运行很慢,,压缩一个4M左右的文件需要七八秒,后来改用文件块缓存字节来读写后,压缩一个4M的文件只需要两秒左右的时间.本来是只想写一个进度条而已的,后来发现如果只读一个字节就判断一次进度条的话会很消耗系统资源,后来干脆麻烦点用文件块来缓存.不过至于一次缓存多少字节才能达到最好的效果还未知,现在设置的是一次缓存40KB 的数据B)本来一个一个字节读的时候对最后一个字节的操作基本没费什么劲,但是在文件块读写的时候就不是那么清晰明了了,后来经过仔细Debug,才找到错误的所在.许多问题都是这样C)对于中文名和带空格路径,用C++的fstream就不支持,但是C中的FILE*就支持,不知道为什么.还有C++中的fstream的成员函数read返回值很奇怪,不知道如何获取成功读入的项数.改用C中的FILE*文件指针后就解决掉了D)由于这次实验的各个步骤是一环套一环的,在哪里出错很难找得出来,所以这次实验调试消耗的时间特别多.最郁闷的一次错误是发现在取得字符C的第N位函数中,居然把0x40写成了0x30.有时候文件解压出来不对,但是又不清楚是压缩时候错了,还是解压时候错了,然后就要两个函数都要检查一遍.2. 实习体会和收获这次实验最大的特点在于难找错,很锻炼自己的Debug能力(六)自评成绩分数:90 //功能做得较齐全,程序的效率也不错(七)参考文献MSDN还有某网站上树的遍历算法(八)源程序见同一文件夹内.。

数据压缩算法在卫星遥感数据处理中的应用技巧(七)

数据压缩算法在卫星遥感数据处理中的应用技巧(七)

数据压缩算法在卫星遥感数据处理中的应用技巧引言:卫星遥感数据的处理一直以来都是一个重要的课题。

随着技术的不断进步,数据量的增加以及传输和存储的要求,数据压缩算法在卫星遥感数据处理中的应用变得越来越重要。

本文将探讨几种常见的数据压缩算法,并讨论它们在卫星遥感数据处理中的应用技巧。

一、无损数据压缩算法无损数据压缩算法是指将数据进行压缩,但在解压缩过程中能够完美地恢复原始数据。

这种算法对于遥感数据处理非常重要,因为遥感数据中的每一个像素都承载着宝贵的信息。

对于这类数据,我们不能接受任何的信息损失。

1. Huffman编码Huffman编码是一种经典的无损数据压缩算法。

它利用数据中的统计特性,将出现频率高的字符用较短的编码表示,而出现频率低的字符用较长的编码表示。

这种编码方式能够有效地减小数据的存储和传输体积。

在卫星遥感数据处理中,我们可以利用Huffman编码来对图像中的像素值进行压缩。

通过对像素值进行统计,得到出现频率高的像素值,然后利用Huffman编码进行压缩,可以大大减小数据的体积。

2. Lempel-Ziv-Welch (LZW) 算法LZW算法是一种逐步建立字典的无损数据压缩算法。

其核心思想是将连续出现的字符序列进行编码,这样可以大大减小数据的存储和传输体积。

在卫星遥感数据处理中,我们可以将图像中的连续像素序列进行LZW压缩,从而减小数据的体积。

二、有损数据压缩算法有损数据压缩算法是指在压缩和解压缩的过程中会有一定程度的信息损失。

在卫星遥感数据处理中,我们可以接受一定的信息损失,以换取更小的数据体积。

1. 离散余弦变换(DCT)离散余弦变换是一种常用的有损数据压缩算法。

它将输入信号转换成一组频率分量,然后通过对这些分量进行削弱或省略,从而实现数据压缩。

在卫星遥感数据处理中,我们可以利用DCT算法对图像进行压缩。

通过将图像转换为频域表示,然后删除部分高频分量,可以大大减小数据的体积。

2. 小波变换(Wavelet Transform)小波变换是一种基于频域的有损数据压缩算法。

用赫夫曼编码完成文件压缩欧阳文创编

用赫夫曼编码完成文件压缩欧阳文创编

实验报告题目:用赫夫曼编码实现文件压缩班级:理科实验四班姓名:王渭森学号:2015201992 完成日期:2016.6.10一、需求分析1.现实需求:1)通信线路中实现信息的最大传送,利用变长编码的方式,可以有效充分利用带宽,实现信息传送前的压缩。

2).在文件保存时,利用哈夫曼编码的方式,压缩文件,可以实现硬盘存储最大的信息量。

2.程序执行的命令包括:1)读取文件。

2)新建并写入文件。

3)将文件中的字符转换为哈夫曼编码。

4)将哈夫曼编码八位一组专户为十进制,在通过十进制的ASCII码转换为字符。

5)翻译过程现将字符转为01串,再将01串翻译为原来的文件。

3.测试数据1)2)3)4)5)新建一个文件并压缩。

二、概要设计1.串的抽象数据类型定义为:ADT String{数据对象:D={ai|ai∈CharacterSet,i=1,2,...,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=1,2,...,n}基本操作:strcpy(String &S1,String S2)初始条件:串S2存在。

操作结果:由串S2复制得串S1.strlen(SString S)初始条件:串S存在。

操作结果:返回S的元素个数,称为串的长度。

}//ADT String2.二叉树的抽象数据类型定义为:ADT BinaryTree{数据对象D:是具有相同特性的元素的集合。

数据关系R:若D为空集,则称为空二叉树;若D仅含一个数据元素,则R为空集,否则R = {H}, H是如下二元关系:1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;2)若 D –{root} ≠Φ,则存在D –{root} 的一个划分Dl Dr ,Dl∩Dr=Φ;3)若Dl≠Φ,则Dl 中存在惟一的数据元素x,<root, xl> ∈H,且存在Dl 上的关系Hl < H;若Dr ≠Φ,则Dr 中存在惟一的数据元素xr ,<root, xr> ∈H,且存在Dr 上的关系Hr < H;4)(Dl,{ Hl、})是一棵符合本定义的二叉树,称为根root的左子树,(Dr,{ Hr、})是一棵符合本定义的二叉树,称为根root的右子树。

使用Huffman编码对动作数据进行压缩

使用Huffman编码对动作数据进行压缩

目录1文档概述 (3)1.1文档的目的和范围 (3)1.2术语/缩略语 (3)2 算法概览 (3)3 Bezier拟合(压缩) (5)4 四元数插值(压缩) (6)5预测算法(编码部分)FPC16 (7)6Huffman+RLE编码算法部分 (7)7 Huffman+RLE解码算法部分 (8)8 预测算法(解码部分)FPC16Decode (9)9 四元数插值(解压) (9)10 Bezier拟合(解压) (10)11 总结 (103)1文档概述1.1文档的目的和范围本文档只对项目的核心算法进行描述,本文档未对下面两类信息进行描述:1)未对所采用的已有技术(如数据预测、Huffman编码、RLE编码等)进行介绍,本文档假定读者有一定的数据压缩技术基础。

2)未对非核心的算法如对Animation和Action头部的数据处理算法进行描述,本文档算法处理的对象是各Animation的帧数据。

Animation与Action的定义参见系统需求及接口文档。

1.2术语/缩略语序号术语/缩略语说明1 位移数据也称平移,运动数据中的位移帧数据,图1中的PosX、PosY、PosZ等。

2 角度数据也称旋转数据,图1中RotX、RotY等数据。

3 Huffman编码也称哈夫曼编码,是一种非等长编码算法。

4 Bezier拟合也称贝塞尔曲线拟合,指对数据进行误差阈值控制范围内的关键点提取,在还原时进行三维空间内的连续插值拟合。

5 四元数插值指对旋转数据间隔提取的方法,在还原时进行连续四元超平面空间上的插值平顺。

6 Run Length Encoding 也称行程长度编码,是利用数据中某个值重复出现的情况,编码该值的个数及值本身的编码技术。

7 数据预测压缩中一种将数据从一种概率分布情况调整到另外一种概率分布情况的方法,调整后的数据更利于采用编码算法进行编码。

8 量化在损失精度的情况下,将数据的位数减少的方法。

9 编码也称为熵编码,过程通常为根据数据的概率分布对数据重新编新的码,新编的码更节省存储空间。

利用哈夫曼编码实现文件压缩

利用哈夫曼编码实现文件压缩

用哈夫曼压缩文件(C语言)2007-12-29 21:09利用哈夫曼编码制作压缩软件,内容如下:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <conio.h>struct head{unsigned char b; //记录字符在数组中的位置long count; //字符出现频率(权值)long parent,lch,rch; //定义哈夫曼树指针变量char bits[256]; //定义存储哈夫曼编码的数组}header[512],tmp;/*压缩*/void compress(){char filename[255],outputfile[255],buf[512];unsigned char c;long i,j,m,n,f;long min1,pt1,flength,length1,length2;double div;FILE *ifp,*ofp;printf("\t请您输入需要压缩的文件:");gets(filename);ifp=fopen(filename,"rb");if(ifp==NULL){printf("\n\t文件打开失败!\n\n");return;}printf("\t请您输入压缩后的文件名:");gets(outputfile);ofp=fopen(strcat(outputfile,".hub"),"wb");if(ofp==NULL){printf("\n\t压缩文件失败!\n\n");return;}flength=0;while(!feof(ifp)){fread(&c,1,1,ifp);header[c].count++; //字符重复出现频率+1flength++; //字符出现原文件长度+1}flength--;length1=flength; //原文件长度用作求压缩率的分母header[c].count--;for(i=0;i<512;i++){if(header[i].count!=0) header[i].b=(unsigned char)i;/*将每个哈夫曼码值及其对应的ASCII码存放在一维数组header[i]中,且编码表中的下标和ASCII码满足顺序存放关系*/else header[i].b=0;header[i].parent=-1;header[i].lch=header[i].rch=-1; //对结点进行初始化}for(i=0;i<256;i++) //根据频率(权值)大小,对结点进行排序,选择较小的结点进树{for(j=i+1;j<256;j++){if(header[i].count<header[j].count){tmp=header[i];header[i]=header[j];header[j]=tmp;}}}for(i=0;i<256;i++) if(header[i].count==0) break;n=i; //外部叶子结点数为n个时,内部结点数为n-1,整个哈夫曼树的需要的结点数为2*n-1.m=2*n-1;for(i=n;i<m;i++) //构建哈夫曼树{min1=999999999; //预设的最大权值,即结点出现的最大次数for(j=0;j<i;j++){if(header[j].parent!=-1) continue;//parent!=-1说明该结点已存在哈夫曼树中,跳出循环重新选择新结点*/if(min1>header[j].count){pt1=j;min1=header[j].count;continue;}}header[i].count=header[pt1].count;header[pt1].parent=i; //依据parent域值(结点层数)确定树中结点之间的关系header[i].lch=pt1; //计算左分支权值大小min1=999999999;for(j=0;j<i;j++){if(header[j].parent!=-1) continue;if(min1>header[j].count){pt1=j;min1=header[j].count;continue;}}header[i].count+=header[pt1].count;header[i].rch=pt1; //计算右分支权值大小header[pt1].parent=i;}for(i=0;i<n;i++) //哈夫曼无重复前缀编码{f=i;header[i].bits[0]=0; //根结点编码0while(header[f].parent!=-1){j=f;f=header[f].parent;if(header[f].lch==j) //置左分支编码0{j=strlen(header[i].bits);memmove(header[i].bits+1,header[i].bits,j+1);//依次存储连接“0”“1”编码header[i].bits[0]='0';}else //置右分支编码1{j=strlen(header[i].bits);memmove(header[i].bits+1,header[i].bits,j+1);header[i].bits[0]='1';}}}fseek(ifp,0,SEEK_SET); //从文件开始位置向前移动0字节,即定位到文件开始位置fwrite(&flength,sizeof(int),1,ofp);/*用来将数据写入文件流中,参数flength指向欲写入的数据地址,总共写入的字符数以参数size*int来决定,返回实际写入的int数目1*/ fseek(ofp,8,SEEK_SET);buf[0]=0; //定义缓冲区,它的二进制表示00000000f=0;pt1=8;/*假设原文件第一个字符是"A",8位2进制为01000001,编码后为0110识别编码第一个'0',那么我们就可以将其左移一位,看起来没什么变化。

文件的压缩与解压huffman算法功能实现

文件的压缩与解压huffman算法功能实现

文件的压缩与解压──huffman算法功能实现摘要:压缩的实质是数字变换,在多媒体信息中包含大量冗余的信息,把这些余冗的信息去掉,就是实现了压缩;解压是由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。

关键词:压缩;解压缩;需求分析;概要设计;详细设计;测试Abstract:Compression is the essence of digital transformation, contains a large amount of redundant information in the multimedia information, the residual redundancy information, is to implement the compression; Decompression is due to the computer processing of information in the form of a binary number, so the compression software is binary information in the same string tag as special characters to achieve the purpose of compression.Key words:Compression; The decompression; Demand analysis; The profile design; The detailed design; Test;1 需求分析解决整个项目系统的“做什么”的问题。

在这里,对于开发技术并没有涉及,而主要是通过建立模型的方式来描述用户的需求,为客户、用户、开发方等不同参与方提供一个交流的渠道。

随着科学技术的进步,信息技术越来越广泛地应用到社会的各个行业和领域,互联网深刻地改变着人们的生活方式,推动着人类文明的进步。

第二版Rinex格式简要说明

第二版Rinex格式简要说明

观测到的卫星数量
*PRN / # OF OBS END OF HEADER
不同的观测类型中,观测到 的卫星数量,如果超过 9 种 类型下行继续 文件头结束标志
F10.3
5I6,F13.7, 5X,A3
5I6,F13.7, 5X,A3 I6
伪距单位为米,多普 勒单位为赫兹
单位秒
I6 I6 3X,A1,I2,9I6
观测值超过 5 换行;如果观测 缺失则为空;观 测值类型见头 文件说明# / TYPES OF OBSERV
3. RINEX 导航(navigation)文件格式
2.1 导航文件的文件头
表 3 导航文件头说明
标签
描述
格式
RINEX VERSION / TYPE - 版本 (2.10)
F9.2,11X,
格式
备注 Toc 为卫星钟的 参考时间,其中 年为两位表示, 不足则补 0 例如 2015 年则 为 15; 2005 年则为 05
BROADCAST ORBIT 1
BROADCAST ORBIT 2
BROADCAST ORBIT 3
BROADCAST ORBIT 4
BROADCAST ORBIT 5
I6,
9(4X,A2) 6X,9(4X,A2)
# / TYPES OF OBSERV
备注 导航类型表示可为 G, R,C 分别表示: G:GPS R:GLONASS C:BDS
此列不必须
此列不必须
单位:米
1: 整波 2: 半波 0 :单频接收机
不必须
如果观测值类型 的数量超过 9 则换 行。观测类型说明如 下: L1, L2: L1、L2 载波 相位测量 C1: L1 载波 C/A 码伪 距测量 P1, P2: L1,L2 载波 P 码伪距测量 D1, D2: L1、L2 载波 多普勒频率测量 其中载波单位为周,

GPS 观测O文件头部分 rinex格式-详细说明

GPS 观测O文件头部分 rinex格式-详细说明

RINEX VERSION 2.11 FORMAT DEFINITIONS AND EXAMPLES+----------------------------------------------------------------------------+ | TABLE A1 | | GNSS OBSERVATION DATA FILE - HEADER SECTION DESCRIPTION | +--------------------+------------------------------------------+------------+ | HEADER LABEL | DESCRIPTION | FORMAT | | (Columns 61-80) | | | +--------------------+------------------------------------------+------------+ |RINEX VERSION / TYPE| - Format version (2.11) | F9.2,11X, | | | - File type ('O' for Observation Data) | A1,19X, | | | - Satellite System: blank or 'G': GPS | A1,19X | | | 'R': GLONASS | | | | 'S': Geostationary | | | | signal payload | | | | 'E': Galileo | | | | 'M': Mixed | | +--------------------+------------------------------------------+------------+ |PGM / RUN BY / DATE | - Name of program creating current file | A20, | | | - Name of agency creating current file | A20, | | | - Date of file creation | A20 | +--------------------+------------------------------------------+------------+ *|COMMENT | Comment line(s) | A60 |* +--------------------+------------------------------------------+------------+ |MARKER NAME | Name of antenna marker | A60 | +--------------------+------------------------------------------+------------+ *|MARKER NUMBER | Number of antenna marker | A20 |* +--------------------+------------------------------------------+------------+ |OBSERVER / AGENCY | Name of observer / agency | A20,A40 | +--------------------+------------------------------------------+------------+ |REC # / TYPE / VERS | Receiver number, type, and version | 3A20 | | | (Version: e.g. Internal Software Version)| | +--------------------+------------------------------------------+------------+ |ANT # / TYPE | Antenna number and type | 2A20 | +--------------------+------------------------------------------+------------+ |APPROX POSITION XYZ | Approximate marker position (WGS84) | 3F14.4 | +--------------------+------------------------------------------+------------+ |ANTENNA: DELTA H/E/N| - Antenna height: Height of bottom | 3F14.4 | | | surface of antenna above marker | | | | - Eccentricities of antenna center | | | | relative to marker to the east | | | | and north (all units in meters) | | +--------------------+------------------------------------------+------------+ *|WAVELENGTH FACT L1/2| - Default wavelength factors for | |* | | L1 and L2 (GPS only) | 2I6, || | 1: Full cycle ambiguities | | | | 2: Half cycle ambiguities (squaring) | | | | 0 (in L2): Single frequency instrument | | | | - zero or blank | I6 | | | | | | | The wavelength factor record is optional | | | | for GPS and obsolete for other systems. | | | | Wavelength factors default to 1. | | | | If the record exists it must precede any | | | | satellite-specific records (see below). | | +--------------------+------------------------------------------+------------+ *|WAVELENGTH FACT L1/2| - Wavelength factors for L1 and L2 (GPS) | 2I6, |* | | 1: Full cycle ambiguities | | | | 2: Half cycle ambiguities (squaring) | | | | 0 (in L2): Single frequency instrument | | | | - Number of satellites to follow in list | I6, | | | for which these factors are valid. | | | | - List of PRNs (satellite numbers with | 7(3X,A1,I2)| | | system identifier) | | | | | | | | These optional satellite specific lines | | | | may follow, if they identify a state | | | | different from the default values. | | | | | | | | Repeat record if necessary. | | +--------------------+------------------------------------------+------------+ |# / TYPES OF OBSERV | - Number of different observation types | I6, | | | stored in the file | | | | - Observation types | | | | - Observation code | 9(4X,A1, | | | - Frequency code | A1)| | | If more than 9 observation types: | | | | Use continuation line(s) (including |6X,9(4X,2A1)| | | the header label in cols. 61-80!) | | | | | | | | The following observation types are | | | | defined in RINEX Version 2.11: | | | | | | | | Observation code (use uppercase only): | | | | C: Pseudorange GPS: C/A, L2C | | | | Glonass: C/A | | | | Galileo: All | | | | P: Pseudorange GPS and Glonass: P code| | | | L: Carrier phase | || | D: Doppler frequency | | | | S: Raw signal strengths or SNR values | | | | as given by the receiver for the | | | | respective phase observations | | | | | | | | Frequency code | | | | GPS Glonass Galileo SBAS | | | | 1: L1 G1 E2-L1-E1 L1 | | | | 2: L2 G2 -- -- | | | | 5: L5 -- E5a L5 | | | | 6: -- -- E6 -- | | | | 7: -- -- E5b -- | | | | 8: -- -- E5a+b -- | | | | | | | | Observations collected under Antispoofing| | | | are converted to "L2" or "P2" and flagged| | | | with bit 2 of loss of lock indicator | | | | (see Table A2). | | | | | | | | Units : Phase : full cycles | | | | Pseudorange : meters | | | | Doppler : Hz | | | | SNR etc : receiver-dependent | | | | | | | | The sequence of the types in this record | | | | has to correspond to the sequence of the | | | | observations in the observation records | | +--------------------+------------------------------------------+------------+ *|INTERVAL | Observation interval in seconds | F10.3 |* +--------------------+------------------------------------------+------------+ |TIME OF FIRST OBS | - Time of first observation record | 5I6,F13.7, | | | (4-digit-year, month,day,hour,min,sec) | | | | - Time system: GPS (=GPS time system) | 5X,A3 | | | GLO (=UTC time system) | | | | GAL (=Galileo System Time)| | | | Compulsory in mixed GPS/GLONASS files | | | | Defaults: GPS for pure GPS files | | | | GLO for pure GLONASS files | | | | GAL for pure Galileo files | | +--------------------+------------------------------------------+------------+ *|TIME OF LAST OBS | - Time of last observation record | 5I6,F13.7, |* | | (4-digit-year, month,day,hour,min,sec) | | | | - Time system: Same value as in | 5X,A3 | | | TIME OF FIRST OBS record | |+--------------------+------------------------------------------+------------+*|RCV CLOCK OFFS APPL | Epoch, code, and phase are corrected by | I6 |*| | applying the realtime-derived receiver | || | clock offset: 1=yes, 0=no; default: 0=no | || | Record required if clock offsets are | || | reported in the EPOCH/SAT records | |+--------------------+------------------------------------------+------------+*|LEAP SECONDS | Number of leap seconds since 6-Jan-1980 | I6 |*| | Recommended for mixed files | |+--------------------+------------------------------------------+------------+*|# OF SATELLITES | Number of satellites, for which | I6 |*| | observations are stored in the file | |+--------------------+------------------------------------------+------------+*|PRN / # OF OBS | PRN (sat.number), number of observations |3X,A1,I2,9I6|*| | for each observation type indicated | || | in the "# / TYPES OF OBSERV" - record. | || | | || | If more than 9 observation types: | || | Use continuation line(s) including | 6X,9I6 || | the header label in cols. 61-80! | || | | || | This record is (these records are) | || | repeated for each satellite present in | || | the data file | |+--------------------+------------------------------------------+------------+|END OF HEADER | Last record in the header section. | 60X |/igscb/data/format/rinex211.txt+--------------------+------------------------------------------+------------+ GPR Rinex文件之o文件说明标签:GPR Rinex o说明分类:我的测绘2009-02-09 19:452.10 OBSERVATION DATA G (GPS) RINEX VERSION /TYPE RINEX版本/观测数据类型DAT2RINW 3.10 001 WuXuepeng 01APR06 9:47:37 PGM / RUN BY / DATE 项目/执行者/日期WuXuepeng GCEDD OBSERVER / AGENCY 观测者/公司20253469 TRIMBLE 4600LS Nav 2.50 Sig 0.11 REC # / TYPE / VERS 接收机编号/接收机类型/接收机版本20253469 4600LS INTERNAL ANT # / TYPE 天线编号/天线类型----------------------------------------------------------- COMMENT 注释Offset from BOTTOM OF ANTENNA to PHASE CENTER is 107.0 mm COMMENT 补偿从天线底部到相位中心107.0毫米注释----------------------------------------------------------- COMMENT 注释I1234 MARKER NAME 标识点名称I1234 MARKER NUMBER 标识点数量-2666295.7398 4700154.0487 3376886.4779 APPROX POSITION XYZ 标识点概略坐标XYZ(WGS-84)1.4065 0.0000 0.0000 ANTENNA: DELTA H/E/N 改正到相位中心的天线高度H高程/E东坐标/N北坐标*** Above antenna height is from mark to PHASE CENTER. COMMENT 上面的天线高是从测量标志到天线相位中心注释----------------------------------------------------------- COMMENT 注释Note: The above height is to the antenna phase center. COMMENT 注释:上面的天线高是到天线相位中心注释The RINEX specification calls for this to be the COMMENT RINEX 规格要求注释height from the bottom surface of the antenna mount COMMENT 天线高是从天线座底部注释to the survey mark. COMMENT 到测量标志。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘 要 针 对 RI NEX 格 式 的 GP S观 测 数 据 文 件 , 现 了利 用 Hu f n 算 法 进 行 数 据 压 缩 的 软 件 编 制 并 进 行 了 成 实 f ma 功 的 试 验 , 据 压 缩 的 比 率 在 4 ~ 5 之 间 . 于 一 般 压 缩 工 具 如 W iz 、 o rs 数 4 O 优 n i C mp e s等 。 p 关键 词 Huf n算 法 ;R NE ;数 据 压 缩 f ma I X
中图 分类 号 : 2 2. P 08 4
文 献 标 识 码 :B
利 用 Hu f n算 法 对 RI X 格 式 GP fma NE S观 测 文 件 进 行 压 缩
徐 晓 华 熊 剑 罗 佳
( 汉 大 学 测 绘 学 院 ,武 i. 珞 喻 路 1 9号 ,4 0 7 ) 武 x市 2 3 0 9
RI X 格 式 文 件 是 GP NE S通 用 数 据 交 换 格 式 文 件 , 含 包
观 测 数 据 文 件 、 历 文 件 、 象 数 据 文 件 等 。 储 观 测 数 据 是 星 气 存 在 野 外 作 业 中 的 问 题 对 数 据 文 件 进 行 无 损 压 缩 , 高 有 效 提 储 存 空 间 是 解 决 的 办 法 之 一 。 NEX 格 式 采 用 AS I 码 , RI CI 存
点 又形 成 新 的节 点 , 后 直 到所 有 节 点 形 成 惟 一 一 个 节点 , 最
称 为根节 点 ;
程 序 的 实 现 由 Hu f n树 的 建 立 、 缩 部 分 、 出部 分 、 fma 压 输 主 程 序 和 解 压 缩 部 分 组 成 。在 用 Huf n 编 码 压 缩 的 时 候 , fma
关 键 是 如 何 根 据 被 压 缩 文 件 建 立 Hu f n树 。 先 定 义 一 个 f ma 首
数 据 结 构 , 包 括 ~ 符 号 的 使 用 频 率 、 节 点 名 和 两 个 子 节 它 父
3 )沿 着 根 向 着 树 叶 前 进 , 遇 到 一 个 节 点 如 果 向 左 边 每 就 记 为 0 向 右 边 则 记 1 最 后 将 所 有 0和 1串 起 来 , 得 到 , , 就
了这 个 树 叶 的 Hu f n编 码 。 fma
点 名 由 于 RI X 文 件 格 式 中 使 用 的 符 号 比 较 固 定 , 般 为 NE 一
英 文 大 小 写 、 字 字 符 和 几 个 常 用 符 号 , 本 上 没 有 超 过 数 基 1¨, 上 形 成 的 父 节 点 最 多 为 子 节 点 数 的 2倍 减 1 所 以 将 O 加 0 , 上 述 数 据 结 构 定 义 为 ( 0 × 2 1 个 , 整 个 Huf n树 则 10 — ) 而 f ma 由这种 结 构 串接 而成 。 建 立 Hu f n树 后 , 缩 部 分 则 按 照 编 好 的 父 节 点 、 f ma 压 左 右 子 节 点 , 位 分 配 0和 1 即 得 到 新 的 编 码 。首 先 按 照 树 的 按 , 结 构 从 树 根 出 发 , 着 节 点 的 标 注 向 树 叶 前 进 , 果 遇 到 向 沿 如 右则 产 生 一个 0 向左 则 产 生 1 最后 按 顺 序 将 这 些 产生 的 0 . , 和 1按 位 储 存 进 压 缩 文 件 。 压 缩 部 分 中 所 产 生 的 位 是 一 个 个 的 , 实 际 操 作 中 使 用 在
维普资讯
涮蛤 信 息与 工 程
J u n l fGe ma is 2 0 Oc ;2 5 o r a o tc 0 2 o t 7( )
2l
文 章 编 号 :1 0 — 8 7 2 0 ) 5 0 2 — 2 0 7 3 1 ( 0 2 0 — 0 10
了缓 冲 区 。 将 得 到 的 位 存 进 缓 冲 区 , 到 缓 冲 区 写 满 了 后 , 先 等 再一 次性 向硬盘 写入 。
下 面用 实 例说 明 该思 想 。例 如 一组 需 要 编码 的信 息 为 :
c b e c c dd 口 6 口 口 口 口 6 c 6 c口 口 c d a a de a 口 盘 6 6 口 6 口 口 口。 出 现 a、 、 、 b c
新 的 编 码 长 度 为 1 ×1 7 3 6 3 6 3 5 3 8 6 + × + × + × + × — 8


在 压 缩 余 地 , 其 自身 的 特 点 , 一 般 的 压 缩 软 件 很 难 达 到 但 用
理 想 效 果 , 为 进 行 RI X 格 式 的 文 件 压 缩 提 供 了舞 台 。 这 NE 1 Hu f a 压 缩 算 法 原 理 fm n Hu f n算 法 是 无 损 压 缩 算 法 , 以 用 于 对 GP 数 据 fma 可 S 文 件 的 压 缩 其 原 理 主 要 是 利 用 Huf n -y 树 , 造 方 法 fma - . 构 是从 树 叶到树 根生 成二 叉 树 , 步骤 如 下 : 其 1 )将 压 缩 的 符 号 按 其 频 率 进 行 排 列 ;
2 程 序 实现
口 6 c d e
图 2
最 终 的二 叉树
位 , 用 AS I 而 C I码 储 存 , 需 要 4 × 8 3 0 bt 可 见 采 用 则 O — 2 i。 Huf n编 码 , 得 了 数 据 压 缩 的 效 果 。 f ma 获
2 )依 次 将 出 现 频 率 最 低 的 符 号 结 合 形 成 新 符 号 , 个 这 新 的 符 号 可 以 称 为 节 点 , 后 节 点 和 节 点 或 和 另 外 未 结 合 的 然
相关文档
最新文档