陕ka6283编码app是什么意思思

pcm编码 _百度百科
特色百科用户权威合作手机百科
收藏 查看&pcm编码本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
PCM 是Pulse Code Modulation的缩写。是数字通信的之一。主要过程是将话音、图像等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。
数字化必须经过三个过程,即抽样、量化和编码,以实现话音数字化的(PCM,Pulse Coding Modulation)技术。抽样是把以其信号带宽2倍以上的频率提取样值,变为在时间轴上离散的抽样信号的过程。例如,话音信号带宽被限制在0.3~3.4kHz内,用 8kHz的抽样频率(fs),就可获得能取代原来连续话音信号的抽样信号。对一个正弦信号进行抽样获得的抽样信号是一个脉冲幅度调制(PAM)信号,如下图对模拟正弦信号的抽样所示。对抽样信号进行检波和平滑滤波,即可还原出原来的。抽样信号虽然是时间轴上离散的信号,但仍然是,其样值在一定的取值范围内,可有无限多个值。显然,对无限个样值一一给出数字码组来对应是不可能的。为了实现以数字码表示样值,必须采用“四舍五入”的方法把样值分级“取整”,使一定取值范围内的样值由无限多个值变为有限个值。这一过程称为量化。
量化后的抽样信号与量化前的抽样信号相比较,当然有所失真,且不再是。这种量化失真在接收端还原时表现为噪声,并称为量化噪声。量化噪声的大小取决于把样值分级“取整”的方式,分的级数越多,即量化级差或间隔越小,量化噪声也越小。量化后的抽样信号在一定的取值范围内仅有有限个可取的样值,且信号正、负幅度分布的对称性使正、负样值的个数相等,正、负向的量化级对称分布。若将有限个 量化样值的绝对值从小到大依次排列,并对应地依次赋予一个十进制数字代码(例如,赋予样值0的十进制数字代码为0),在码前以“+”、“-”号为前缀,来 区分样值的正、负,则量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流,即十进制数字信号。简单高效的数据系统是二进制码系统,因此,应将十 进制数字代码变换成。根据十进制数字代码的总个数,可以确定所需的位数,即。这种把量化的抽样信号变换成给定的二进制码流的 过程称为编码。话音PCM的抽样频率为8kHz,每个量化样值对应一个8位二进制码,故话音数字编码信号的速率为8bits×8kHz=64kb/s。量化噪声随量化级数的增多和级差的缩小而减小。量化级数增多即样值个数增多,就要求更长的。因此,量化噪声随的位数增多而减小,即随数字编码信号的速率提高而减小。自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的转换为数字编码。单位:(位/bit)
声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于是 相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复 原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用 40kHz表达,这个40kHz就是采样率。我们常见的CD,采样率为44.1kHz。光有频率信息是不够的,我们还必须获得该频率的能量值并量化,用于表示信号强度。量化电平数为2的整数次幂,我们常见的CD位16bit的采样大小,即2的16次方。采样大小相对采样率更难理解,因为要显得抽象点,举个简单例子:假设对一个波进行8次采样,采样点分别对应的能量值分别为A1-A8,但我们只使用2bit的采样大小,结果我们只能保留A1-A8中4个点的 值而舍弃另外4个。如果我们进行3bit的采样大小,则刚好记录下8个点的所有信息。采样率和采样大小的值越大,记录的波形更接近原始信号。根据采样率和采样大小可以得知,相对自然界的信号,音频编码最多只能做到无限接近,至少目前的技术只能这样了,相对自然界的信号,任何编码方案都 是有损的,因为无法完全还原。在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV 文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM也只能做 到最大程度的无限接近。我们而习惯性的把MP3列入有损音频编码范畴,是相对PCM编码的。强调编码的相对性的有损和无损,是为了告诉大家,要做到真正的无损是困难的,就像用数字去表达圆周率,不管精度多高,也只是无限接近,而不是真正等于圆周率的值。要算一个PCM的是一件很轻松的事情,采样率值×采样大小值×声道数bps。一个采样率为44.1KHz,采样大小为16bit,双声道的 PCM编码的WAV文件,它的数据速率则为44.1K×16×2=1411.2Kb/s。我们常说128K的MP3,对应的WAV的参数,就是这个 1411.2Kb/s,这个参数也被称为数据,它和ADSL中的带宽是一个概念。将除以8,就可以得到这个WAV的数据速率,即176.4KBye/s。这表示存储一秒钟采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的,需要176.4KB的空间,1分钟则约为10.34M,这对大部分用户是不可接受的,尤其是喜欢在电脑上听音乐的朋友,要降低磁盘占用,只有2种方法,降低采样指标或者压缩。降低指标是不可取的,因此专家们研发了各种压缩方案。由于用途和针对的目标市场不一样,各种音频压缩编码所达到的音质和压缩比都不一样,在后面的文章中我们都会一一提到。有一点是可以肯定的,他们都压缩过。采样率表示了每秒对原始的次数,我们常见到的音频文件采样率多为44.1KHz,这意味着什么呢?假设我们有2段正弦波信号,分别为20Hz和 20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行40KHz的采样,我们可以得到一个什么样的结果呢?结果是:20Hz的信号每次振动被采样了40K/20=2000次,而20K的信号每次振动只有2次采样。显然,在相同的采样率下,记录低频的信息远比高频的详细。这也是为什么有些音响发烧友指责CD有数码声不够真实的原因,CD的44.1KHz采样也无法保证高频信号被较好记录。要较好的记录高频信号,看来需要更高的采样率,于是有些朋友在捕捉CD音轨的时候使用48KHz的采样率,这是不可取的!这其实对音质没有任何好处,对软件来说,保持和CD提供的44.1KHz一样的采样率才是最佳音质的保证之一,而不是去提高它。较高的采样率只有相对的时候才有用,如果被采样的信号是数字的,请不要去尝试提高采样率。随着网络的发展,人们对在线收听音乐提出了要求,因此也要求音频文件能够一边读一边播放,而不需要把这个文件全部读出后然后回放,这样就可以做到不用下载 就可以实现收听了。也可以做到一边编码一边播放,正是这种特征,可以实现在线的直播,架设自己的数字广播电台成为了现实。在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的 WAV文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。要算一个PCM音频流的码率是一件很轻松的事情,采样率值×采样大小值×声道数 bps。一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的WAV文件,它的数据速率则为 44.1K×16×2 =1411.2 Kbps。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。
新手上路我有疑问投诉建议参考资料 查看HS编码 _百度百科
特色百科用户权威合作手机百科
收藏 查看&HS编码
即HS编码,为编码的简称。其全称为《》(International Convention for Harmonized Commodity Description and Coding System)简称(Harmonized System,缩写为HS)外文名International Convention for Harmonized Commodity Description and Coding System实施时间日
1983年6月海关合作理事会(现名)主持制定的一部供、统计、进出口管理及与国际贸易有关各方共同使用的商品分类编码体系。HS编码“协调”涵盖了《》(CCCN)和联合国的《》()两大分类编码体系,是系统的、多用途的国际贸易商品分类体系。它除了用于和贸易统计外,对运输商品的计费、统计、计算机数据传递、简化以及普遍优惠制税号的利用等方面,都提供了一套可使用的国际贸易商品分类体系。
从日起,我国进出口税则采用世界海关组织《》(简称HS),该制度是一部科学的、系统的国际贸易商品分类体系,采用六位编码,适用于税则、统计、生产、运输、贸易管制、检验检疫等多方面,目前全球贸易量98%以上使用这一目录,已成为国际贸易的一种标准语言。我国进出口税则采用十位编码,前八位等效采用HS编码,后两位是我国子目,它是在HS分类原则和方法基础上,根据我国进出口商品的实际情况延伸的两位编码。HS于正式实施,每4年修订1次.世界上已有200多个使用HS,全球贸易总量98%以上的货物都是以HS分类的。 HS的总体结构包括三大部分:归类规则;类、章及子目注释;按顺序编排的目与子目编码及条文。这三部分是HS的法律性条文,具有严格的法律效力和严密的逻辑性。HS首先列明6条归类总规则,规定了使用HS对商品进行分类时必须遵守的分类原则和方法。HS的许多类和章在开头均列有注释(类注、章注或子目注释),严格界定了归入该类或该章中的商品范围,阐述HS中专用术语的定义或区分某些商品的技术标准及界限。HS采用六位数编码,把全部国际贸易商品分为22类,98章。章以下再分为目和子目。商品编码第一、二位数码代表“章”,第三、四位数码代表“目”(Heading),第五、六位数码代表“子目”(Subheading)。前6位数是HS国际标准编码,HS有1241个四位数的税目,5113个六位数子目。有的根据本国的实际,已分出第七、八、九位数码。
在HS中,“类”基本上是按经济部门划分的,如食品、饮料和烟酒在第四类,化学工业及其相关工业产品在第六,纺织原料及制品在第十一类,机电设备在第十六类。运输设备在第十七类,武器、弹药在第十九类等。HS“章”分类基本采取两种办法:一是按商品原材料的属性分类,相同原料的产品一般归入同一章。章内按产品的加工程度从原料到成品顺序排列。如52章,按原棉——已梳棉——棉纱——棉布顺序排列。二是按商品的用途或性能分类。制造业的许多产品很难按其原料分类,尤其是可用多种材料制作的产品或由混合材料制成的产品(如第64章鞋、第65章帽、第95章玩具等)及机电仪产品等,HS按其功能或用途分为不同的章,而不考虑其使用何种原料,章内再按原料或加工程序排列出目或子目。HS的各章均列有一个起“兜底”作用,名为“其他”的子目,使任何进出口商品都能在这个分类体系中找到自己适当的位置。
我国目前使用的HS编码,一共10位,其中前面8位称为主码,后两位称为附加码。以中国的海关编码为例:
制造纤维素纸浆的 进口关税最惠国税率8.4%、普通税率30.0%,增值税率17.0%,监管条件O
监管条件O 自动进口许可证
另外,对应税率中,中国与东盟10国有更优惠的税率,与台湾签订有两岸框架合作协议,即ECFA,具体对应的税率可另行查询第一类
活动物;动物产品
肉及食用杂碎
鱼、甲壳动物、软体动物及其他水生无脊椎动物
乳品;蛋品;天然蜂蜜;其他食用动物产品
其他动物产品
活树及其他活植物;鳞茎、根及类似品;插花及装饰用簇叶
食用蔬菜、根及块茎
食用水果及坚果;柑桔属水果或甜瓜的果皮
咖啡、茶、马黛茶及调味香料
制粉工业产品;麦芽;淀粉;菊粉;面筋
含油子仁及果实;杂项子仁及果实;工业用或药用植物;稻草、秸秆及饲料
虫胶;树胶、树脂及其他植物液、汁
编结用植物材料;其他植物产品
动、植物油、脂及其分解产品;精制的食用油脂;动、植物蜡
动、植物油、脂及其分解产品;精制的食用油脂;动、植物蜡
食品;饮料、酒及醋;烟草、烟草及烟草代用品的制品
肉、鱼、甲壳动物、软体动物及其他水生无脊椎动物的制品
可可及可可制品
谷物、粮食粉、淀粉或乳的制品;糕饼点心
蔬菜、水果、坚果或植物其他部分的制品
第二十一章
第二十二章
饮料、酒及醋
第二十三章
食品工业的残渣及废料;配制的动物饲料
第二十四章
烟草、烟草及烟草代用品的制品
第二十五章
盐;硫磺;泥土及石料;石膏料、石灰及水泥
第二十六章
矿砂、矿渣及矿灰
第二十七章
矿物燃料、矿物油及其蒸馏产品;沥青物质;矿物蜡
化学工业及其相关工业的产品
第二十八章
无机化学品;贵金属、稀土金属、放射性元素及其同位素的有机及无机化合物
第二十九章
有机化学品
第三十一章
第三十二章
鞣料浸膏及染料浸膏;鞣酸及其衍生物;染料、颜料及其他着色料;油漆及清漆;油灰及其他胶粘剂;墨水、油墨
第三十三章
精油及香膏;芳香料制品及化妆盥洗品
第三十四章
肥皂、有机表面活性剂、洗涤剂、润滑剂、人造蜡、调制蜡、光洁剂、蜡烛及类似品、塑型用膏、“牙科用蜡”及牙科用熟石膏制剂
第三十五章
蛋白类物质;改性淀粉;胶;酶
第三十六章
炸药;烟火制品;火柴;引火合金;易燃材料制品
第三十七章
照相及电影用品
第三十八章
杂项化学产品
塑料及其制品;橡胶及其制品
第三十九章
塑料及其制品
橡胶及其制品
生皮、皮革、毛皮及其制品;鞍具及挽具;旅行用品、手提包及类似容器;动物肠线(蚕胶丝除外)制品
第四十一章
生皮(毛皮除外)及皮革
第四十二章
皮革制品;鞍具及挽具;旅行用品、手提包及类似容器;动物肠线(蚕胶丝除外)制品
第四十三章
毛皮、人造毛皮及其制品
木及木制品;木炭;软木及软木制品;稻草、秸秆、针茅或其他编结材料制品;篮筐及柳条编结品
第四十四章
木及木制品;木炭
第四十五章
软木及软木制品
第四十六章
稻草、秸秆、针茅或其他编结材料制品;篮筐及柳条编结品
木浆及其他纤维状纤维素浆;纸及纸板的废碎品;纸、纸板及其制品
第四十七章
木浆及其他纤维状纤维素浆;纸及纸板的废碎品
第四十八章
纸及纸板;纸浆、纸或纸板制品
第四十九章
书籍、报纸、印刷图画及其他印刷品;手稿、打字稿及设计图纸
纺织原料及纺织制品
第五十一章
羊毛、动物细毛或粗毛;马毛纱线及其机织物
第五十二章
第五十三章
其他植物纺织纤维;纸纱线及其机织物
第五十四章
化学纤维长丝
第五十五章
化学纤维短纤
第五十六章
絮胎、毡呢及无纺织物;特种纱线;线、绳、索、缆及其制品
第五十七章
地毯及纺织材料的其他铺地制品
第五十八章
特种机织物;簇绒织物;花边;装饰毯;装饰带;刺绣品
第五十九章
浸渍、涂布、包覆或层压的织物;工业用纺织制品
针织物及钩编织物
第六十一章
针织或钩编的服装及衣着附件
第六十二章
非针织或非钩编的服装及衣着附件
第六十三章
其他纺织制成品;成套物品;旧衣着及旧纺织品;碎织物
鞋、帽、伞、杖、鞭及其零件;已加工的羽毛及其制品;人造花;人发制品
第六十四章
鞋靴、护腿和类似品及其零件
第六十五章
帽类及其零件
第六十六章
雨伞、阳伞、手杖、鞭子、马鞭及其零件
第六十七章
已加工羽毛、羽绒及其制品;人造花;人发制品
石料、石膏、水泥、石棉、云母及类似材料的制品;陶瓷产品;玻璃及其制品
第六十八章
石料、石膏、水泥、石棉、云母及类似材料的制品
第六十九章
玻璃及其制品
天然或养殖珍珠、宝石或半宝石、贵金属、包贵金属及其制品;仿首饰;硬币
第七十一章
天然或养殖珍珠、宝石或半宝石、贵金属、包贵金属及其制品;仿首饰;硬币
贱金属及其制品
第七十二章
第七十三章
第七十四章
铜及其制品
第七十五章
镍及其制品
第七十六章
铝及其制品
第七十七章
(保留为税则将来所用)
第七十八章
铅及其制品
第七十九章
锌及其制品
锡及其制品
第八十一章
其他贱金属、金属陶瓷及其制品
第八十二章
贱金属工具、器具、利口器、餐匙、餐叉及其零件
第八十三章
贱金属杂项制品
机器、机械器具、电气设备及其零件;录音机及放声机、电视图像、声音的录制和重放设备及其零件、附件
第八十四章
核反应堆、锅炉、机器、机械器具及其零件
第八十五章
电机、电气设备及其零件;录音机及放声机、电视图像、声音的录制和重放设备及其零件、附件
车辆、航空器、船舶及有关运输设备
第八十六章
铁道及电车道机车、车辆及其零件;铁道及电车道轨道固定装置及其零件、附件;各种机械(包括电动机械)交通信号设备
第八十七章
车辆及其零件、附件,但铁道及电车道车辆除外
第八十八章
航空器、航天器及其零件
第八十九章
船舶及浮动结构体
光学、照相、电影、计量、检验、医疗或外科用仪器及设备、精密仪器及设备;钟表;乐器;上述物品的零件、附件
光学、照相、电影、计量、检验、医疗或外科用仪器及设备、精密仪器及设备;上述物品的零件、附件
第九十一章
钟表及其零件
第九十二章
乐器及其零件、附件
武器、弹药及其零件、附件
第九十三章
武器、弹药及其零件、附件
第九十四章
家具;寝具、褥垫、弹簧床垫、软坐垫及类似的填充制品;未列名灯具及照明装置;发光标志、发光铭牌及类似品;活动房屋
第九十五章
玩具、游戏品、运动用品及其零件、附件
第九十六章
第二十一类
艺术品、收藏品及古物
第九十七章
第九十八章
艺术品、收藏品及古物
特殊交易品及未分类
申报要素可根据hs编码查询得到,它是进出口货物收发货人及其代理人在填报进出口货物报关单的“商品名称、规格型号”栏目时,应按照《规范申报目录》中所列商品相应的申报要素的内容填报。
商品编码:02.02
申报要素:1.品名(中文及英文名称);2.加工方法(整头及半头、带骨或去骨等);3.状态(鲜、冷);4.野生请注明
申报要素描述了货物的外观、成分、级别、用途,在报关时需准确填写,以便顺利完成报关。
新手上路我有疑问投诉建议参考资料 查看哈夫曼编码 _百度百科
特色百科用户权威合作手机百科
收藏 查看&哈夫曼编码
编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。外文名Huffman Coding发表时间1952年类&&&&别程序算法
1951年,哈夫曼和他在的同学需要选择是完成学期报告还是期末。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率编码的想法,并很快证明了这个方法是最有效的。由于这个算法,学生终于青出于蓝,超过了他那曾经和信息论创立者共同研究过类似编码的导师。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法Shannon-Fano编码的最大弊端──自顶向下构建树。
1952年,David A. Huffman在攻读博士时发表了《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文,它一般就叫做Huffman编码。[1]─即最优,带权路径长度最小的二叉树,经常应用于。 在计算机信息处理中,哈弗曼编码在信息论中应用举例“编码”是一种一致性编码法(又称“”),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到数据的目的)。这种方法是由David.A.Huffman发展起来的。 例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用编码对一篇英文进行压缩时,e极有可能用一个位哈弗曼编码在信息论中应用举例[2](bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。若能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高的比例。[1]为了让它(huffman.cpp)快速运行,同时不使用任何动态库,比如STL或者MFC。它压缩1M数据少于100ms(P3处理器,主频1G)。[3]压缩代码非常简单,首先用ASCII值初始化511个节点:
CHuffmanNode nodes[511];
for(int nCount = 0; nCount & 256; nCount++)
nodes[nCount].byAscii = nC
其次,计算在输入数据中,每个ASCII码出现的频率:
for(nCount = 0; nCount & nSrcL nCount++)
nodes[pSrc[nCount]].nFrequency++;
然后,根据频率进行排序:
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
,获取每个ASCII码对应的位序列:
int nNodeCount = GetHuffmanTree(nodes);[3]构造非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。
// parent node
pNode = &nodes[nParentNode++];
// pop first child
pNode-&pLeft = PopNode(pNodes, nBackNode--, false);
// pop second child
pNode-&pRight = PopNode(pNodes, nBackNode--, true);
// adjust parent of the two poped nodes
pNode-&pLeft-&pParent = pNode-&pRight-&pParent = pN
// adjust parent frequency
pNode-&nFrequency = pNode-&pLeft-&nFrequency + pNode-&pRight-&nF[3]有一个好的诀窍来避免使用任何队列组件。ASCII码只有256个,但实际分配了511个(CHuffmanNode nodes[511]),前255个记录ASCII码,而用后255个记录中的父节点。并且在构造树的时候只使用一个(ChuffmanNode *pNodes[256])来指向这些节点。同样使用两个来操作队列索引(int nParentNode = nNodeCnBackNode = nNodeCount –1)。
接着,压缩的最后一步是将每个写入输出中:
int nDesIndex = 0;
// loop to write codes
for(nCount = 0; nCount & nSrcL nCount++)
*(DWORD*)(pDesPtr+(nDesIndex&&3)) |=
nodes[pSrc[nCount]].dwCode && (nDesIndex&7);
nDesIndex += nodes[pSrc[nCount]].nCodeL
(nDesIndex&&3): &&3 以8位为界限右移后到达右边的前面
(nDesIndex&7): &7 得到最高位.
此外,在压缩中,必须保存的节点以及位序列,这样才能在时重新构造哈夫曼树(只需保存ASCII值和对应的位序列)。[3]比构造要简单的多,将输入中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必须用位流搜索,直到发现一个叶节点,然后将它的ASCII值添加到输出中:
int nDesIndex = 0;
while(nDesIndex & nDesLen)
nCode = (*(DWORD*)(pSrc+(nSrcIndex&&3)))&&(nSrcIndex&7);
pNode = pR
while(pNode-&pLeft)
pNode = (nCode&1) ? pNode-&pRight : pNode-&pL
nCode &&= 1;
nSrcIndex++;
pDes[nDesIndex++] = pNode-&byA
}[3]#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#include &math.h&
#define M 100
typedef struct Fano_Node
}FanoNode[M];
typedef struct node
struct node *
}LinkQueueN
typedef struct
LinkQueueNode *
LinkQueueNode *
//建立队列
void EnterQueue(LinkQueue *q,int s,int e)
LinkQueueNode *NewN
//生成新节点
NewNode=(LinkQueueNode*)malloc(sizeof( LinkQueueNode ));
if(NewNode!=NULL)
NewNode-&start=s;
NewNode-&end=e;
NewNode-&next=NULL;
q-&rear-&next=NewN
q-&rear=NewN
printf(&Error!&);
//按权分组
void Divide(FanoNode f,int s,int *m,int e)
float sum,sum1;
for(i=s;i&=e;i++)
sum+=f[i].//
for(i=s;i&e;i++)
sum1+=f[i].
*m=fabs(sum-2*sum1)&fabs(sum-2*sum1-2*f[i+1].weight)?(i+1):*m;
void main()
int i,j,n,max,m,h[M];
char c,fc[M][M];
FanoNode FN;
LinkQueueNode *p;
LinkQueue *Q;
//初始化队Q
Q=(LinkQueue *)malloc(sizeof(LinkQueue));
Q-&front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
Q-&rear=Q-&
Q-&front-&next=NULL;
printf(&\t***FanoCoding***\n&);
printf(&Please input the number of node:&);
//输入信息
scanf(&%d&,&n);
//超过定义M,退出
printf(&&=%d&,M);
i=1; //从第二个元素开始录入
while(i&=n)
printf(&%d weight and node:&,i);
scanf(&%f %c&,&FN[i].weight,&FN[i].ch);
for(j=1;j&i;j++)
if(FN[i].ch==FN[j].ch)//查找重复
printf(&Same node!!!\n&);
//排序(降序)
for(i=1;i&=n;i++)
for(j=j&=n;j++)
max=FN[max].weight&FN[j].weight?j:
if(FN[i].weight&FN[max].weight)
FN[i].weight=FN[max].
FN[max].weight=w;
FN[i].ch=FN[max].
FN[max].ch=c;
for(i=1;i&=n;i++) //初始化h
EnterQueue(Q,1,n); //1和n进队
while(Q-&front-&next!=NULL)
p=Q-&front-& //出队
Q-&front-&next=p-&
if(p==Q-&rear)
Q-&rear=Q-&
Divide(FN,sta,&m,end); /*按权分组*/
for(i=i&=m;i++)
fc[i][h[i]]='0';
if(sta!=m)
EnterQueue(Q,sta,m);
fc[sta][h[sta]]='\0';
for(i=m+1;i&=i++)
fc[i][h[i]]='1';
if(m==sta&&(m+1)==end)
//如果分组后首元素的下标与中间元素的相等,
//并且和最后元素的下标相差为1,则编码码字字符串结束
fc[m][h[m]]='\0';
fc[end][h[end]]='\0';
EnterQueue(Q,m+1,end);
for(i=1;i&=n;i++) /*打印编码信息*/
printf(&%c:&,FN[i].ch);
printf(&%s\n&,fc[i]);
system(&pause&);
}[4]#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#define N 100
#define M 2*N-1
typedef char * HuffmanCode[2*M];//haffman编码
typedef struct
//父节节点
int LC//左子节点
int RC//右子节点
}HTNode,Huffman[M+1];//huffman树
typedef struct Node
//叶子结点的权值
//叶子结点
//叶子结点的二进制码的长度
}WNode,WeightNode[N];
/***产生叶子结点的字符和权值***/
void CreateWeight(char ch[],int *s,WeightNode CW,int *p)
int i,j,k;
*p=0;//个数
//统计字符出现个数,放入CW
for(i=0;ch[i]!='\0';i++)
for(j=0;j&i;j++)
if(ch[j]==ch[i])
CW[++*p].c=ch[i];
CW[*p].weight=1;
for(k=i+1;ch[k]!='\0';k++)
if(ch[i]==ch[k])
CW[*p].weight++;//权值累加
*s=i;//字符串长度
/********创建HuffmanTree********/
void CreateHuffmanTree(Huffman ht,WeightNode w,int n)
int s1,s2;
for(i=1;i&=n;i++)
ht[i].weight =w[i].
ht[i].parent=0;
ht[i].LChild=0;
ht[i].RChild=0;
for(i=n+1;i&=2*n-1;i++)
ht[i].weight=0;
ht[i].parent=0;
ht[i].LChild=0;
ht[i].RChild=0;
for(i=n+1;i&=2*n-1;i++)
for(j=1;j&=i-1;j++)
if(!ht[j].parent)
s1=j; //找到第一个双亲为零的结点
for(;j&=i-1;j++)
if(!ht[j].parent)
s1=ht[s1].weight&ht[j].weight?j:s1;
ht[s1].parent=i;
ht[i].LChild=s1;
for(j=1;j&=i-1;j++)
if(!ht[j].parent)
s2=j; //找到第二个双亲为零的结点
for(;j&=i-1;j++)
if(!ht[j].parent)
s2=ht[s2].weight&ht[j].weight?j:s2;
ht[s2].parent=i;
ht[i].RChild=s2;
ht[i].weight=ht[s1].weight+ht[s2].//权值累加
/***********叶子结点的编码***********/
void CrtHuffmanNodeCode(Huffman ht,char ch[],HuffmanCode h,WeightNode weight,int m,int n)
int i,c,p,
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';//末尾置0
for(i=1;i&=n;i++)
start=n-1; //cd串每次从末尾开始
p=ht[i].//p在n+1至2n-1
while(p) //沿父亲方向遍历,直到为0
start--;//依次向前置值
if(ht[p].LChild==c)//与左子相同,置0
cd[start]='0';
else //否则置1
cd[start]='1';
weight[i].num=n- //二进制码的长度(包含末尾0)
h[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(h[i],&cd[start]);//将二进制字符串拷贝到h中
free(cd);//释放cd内存
system(&pause&);
/*********所有的编码*********/
void CrtHuffmanCode(char ch[],HuffmanCode h,HuffmanCode hc,WeightNode weight,int n,int m)
for(i=0;i&m;i++)
for(k=1;k&=n;k++) /*从weight[k].c中查找与ch[i]相等的下标K*/
if(ch[i]==weight[k].c)
hc[i]=(char *)malloc((weight[k].num)*sizeof(char));
strcpy(hc[i],h[k]); //拷贝
/*****解码*****/
void TrsHuffmanTree(Huffman ht,WeightNode w,HuffmanCode hc,int n,int m)
int i=0,j,p;
printf(&***StringInformation***\n&);
while(i&m)
p=2*n-1;//从父亲节点向下遍历直到
for(j=0;hc[i][j]!='\0';j++)
if(hc[i][j]=='0')
p=ht[p].LC
p=ht[p].RC
printf(&%c&,w[p].c); /*打印原信息*/
/*****释放huffman编码内存*****/
void FreeHuffmanCode(HuffmanCode h,HuffmanCode hc,int n,int m)
for(i=1;i&=n;i++)//释放叶子结点的编码
free(h[i]);
for(i=0;i&m;i++) //释放所有结点的编码
free(hc[i]);
void main()
int i,n=0; /*n为叶子结点的个数*/
int m=0; /*m为字符串ch[]的长度*/
char ch[N]; /*ch[N]存放输入的字符串*/
H /*Huffman*/
HuffmanCode h, /*h存放叶子结点的编码,hc 存放所有结点的编码*/
WeightN /*存放叶子结点的信息*/
printf(&\t***HuffmanCoding***\n&);
printf(&please input information :&);
gets(ch); /*输入字符串*/
CreateWeight(ch,&m,weight,&n); /*产生叶子结点信息,m为字符串ch[]的长度*/
printf(&***WeightInformation***\n Node &);
for(i=1;i&=n;i++) /*输出叶子结点的字符与权值*/
printf(&%c &,weight[i].c);
printf(&\nWeight &);
for(i=1;i&=n;i++)
printf(&%d &,weight[i].weight);
CreateHuffmanTree(ht,weight,n); /*产生Huffman树*/
printf(&\n***HuffamnTreeInformation***\n&);
printf(&\ti\tweight\tparent\tLChild\tRChild\n&);
for(i=1;i&=2*n-1;i++) /*打印Huffman树的信息*/
printf(&\t%d\t%d\t%d\t%d\t%d\n&,i,ht[i].weight,ht[i].parent,ht[i].LChild,ht[i].RChild);
CrtHuffmanNodeCode(ht,ch,h,weight,m,n); /*叶子结点的编码*/
printf(& ***NodeCode***\n&); /*打印叶子结点的编码*/
for(i=1;i&=n;i++)
printf(&\t%c:&,weight[i].c);
printf(&%s\n&,h[i]);
CrtHuffmanCode(ch,h,hc,weight,n,m); /*所有字符的编码*/
printf(&***StringCode***\n&); /*打印字符串的编码*/
for(i=0;i&m;i++)
printf(&%s&,hc[i]);
system(&pause&);
TrsHuffmanTree(ht,weight,hc,n,m); /*解码*/
FreeHuffmanCode(h,hc,n,m);
system(&pause&);
}[5]Matlab 中简易实现Huffman编译码:
n=input('Please input the total number: ');
hf=zeros(2*n-1,5);
for ki=1:n
hf(ki,2)=input('Please input the frequency: ');
hq=[hq,hf(ki,2)];
for ki=n+1:2*n-1
mhq1=min(hq);
m=size(hq);
while k&=m%del min1
if hq(:,k)==mhq1
hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];
while hf(k,2)~=mhq1|hf(k,5)==1%find min1 location
hf(k,5)=1;
mhq2=min(hq);
while k&=m%del min2
if hq(:,k)==mhq2
hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];
while hf(k,2)~=mhq2|hf(k,5)==1%find min2 location
hf(k,5)=1;
hf(ki,2)=mhq1+mhq2;
hf(ki,3)=k1;
hf(ki,4)=k2;
hq=[hq hf(ki,2)];
choose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');
while choose==1|choose==2
if choose==1
a=input('Please input the letter you want to Encoding: ');
while hf(k,2)~=a
display('Error! You did not input this number.');
while hf(k,5)==1
while hf(kc,3)~=k&hf(kc,4)~=k
if hf(kc,3)==k
a=input('Please input the metrix you want to Decoding: ');
sa=size(a);
sa=sa(:,2);
while sa~=0
if a(:,1)==0
k=hf(k,3);
k=hf(k,4);
a=a(:,2:sa);
display('Error! The metrix you entered is a wrong one.');
r=hf(k,2);
choose=input('Choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');
if choose~=1&choose~=2
新手上路我有疑问投诉建议参考资料 查看

我要回帖

更多关于 hr是什么意思 的文章

 

随机推荐