CN1658513A - 通过查表实现的算术编解码方法 - Google Patents
通过查表实现的算术编解码方法 Download PDFInfo
- Publication number
- CN1658513A CN1658513A CN 200510024304 CN200510024304A CN1658513A CN 1658513 A CN1658513 A CN 1658513A CN 200510024304 CN200510024304 CN 200510024304 CN 200510024304 A CN200510024304 A CN 200510024304A CN 1658513 A CN1658513 A CN 1658513A
- Authority
- CN
- China
- Prior art keywords
- line segment
- bit
- output
- low
- code word
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明为一种通过查表实现的算术编解码方法。算术编解码是对非等概率的数据进行压缩和解压缩的有效方法。算术编解码过程中都需要将线段不断地细化,由于在有限精度的情况下,无法将线段无限细化,所以实现过程中需要将缩小的线段放大和平移,这称为更新,在编码端还要同时将更新信息作为输出的编码码字,在解码端还要更新Value。本方法通过判断更新前线段两端的位置得到“数据表”中的索引信息,快速高效得更新线段和完成其它操作,从而大大节省编解码时需要的运算量,尤其是避免了大量判断和跳转的次数。试验结果证明,该方法为了存放“数据表”增加了有限内存空间,但是可以大大加快算术编解码的速度,提高硬件实现的效率。
Description
技术领域
本发明属于数据压缩技术领域,具体涉及一种通过查表实现的算术编解码方法。
背景技术
算术编码是一种无失真的编码方法,能有效地压缩信源冗余度,属于熵编码的一种,适用于非等概率的数据的压缩。算术编码的基本原理是:根据编码数据中不同符号的概率,把线段划分为互不重叠的子线段,子线段的宽度恰好是各符号的概率。编码一个符号就是找到对应的子线段,然后再对该线段划分得到下一级的子线段,对下一个符号编码。在最后的子线段中的任意实数都可以用来表示对应的符号序列,这个数就是该符号序列所对应的码字。显然,一串符号序列发生的概率越大,对应的子线段就越宽,要表达它所用的比特数就减少,因而相应的码字就越短。算术解码的过程是算术编码的逆过程,通过码字得到线段中的某一个点,称为Value,判断该点位于哪一个子线段中,从而得到与该子线段相应的符号。
但是在具体实现中往往无法做到线段无限细划的精度。在有限精度的条件下,就需要在编码一些符号后,对线段进行放大和平移,保证下一次线段划分精度。而线段放大和平移的信息就是输出码字。其中需要对线段不同的情况做出不同的操作,所以如何减少运算次数和判断跳转次数成了本领域研究的一个热点。
发明内容
本发明的目的是提出一种通过查表实现的算术编解码方法。在编码过程中可以快速的判断当前线段的情况,并且更新线段得到输出码字,大大减少运算量,同时减少判断和跳转操作次数;在解码中,可以用该方法快速的更新子线段更新Value的值。
本发明提出的通过查表实现算术编解码方法,是根据算术编解码中线段的信息查表,得到线断更新和其他操作的信息,从而高效的实现算术编解码。具体来说,是根据更新前线段两端的位置信息,在预存的“数据表”中得到相应的数据。然后,在编码端根据从“数据表”中查得的数据,其中包括线段放大倍数和平移大小,输出码流的信息。在解码端根据从“数据表”中查得的数据,其中包括线段放大倍数和平移大小,更新Value的信息。本发明可以定义不同长度的“数据表”,“数据表”越长,算术编解码越高效。具体表现在运算数度加快,判断跳转次数减少。
本发明提出的通过查表实现的算术编解码方法,编码的具体步骤如下:
(1)首先对一个符号编码,得到新的线段;
(2)然后根据新的线段两端的位置,得到表格中Index;
(3)读取表中的相应数据,该数据中包含更新线段和输出码字的信息;
(4)最后更新线段和输出码字;
(5)判断新的线段是否可以对下一个符号编码,如为真,从步骤(1)开始,对下一个符号编码,否则从步骤(2)开始,继续查表,更新线段并且输出码字。
本发明提出的通过查表实现的算术编解码方法,解码的具体步骤如下:
(1)根据码字得到线段中一点的位置,称为Value,该点位于某个子线段,解码的符号为该子线段对应的符号;
(2)然后根据子线段两端的位置,得到表格中Index;
(3)读取表中的相应数据,该数据中包含更新线段的信息;
(4)最后更新线段,并且同时更新Value;
(5)判断新的线段是否可以对下一个符号解码,如为真,从步骤(1)开始,对下一个符号解码,否则从步骤(2)开始,继续查表,更新线段和Value。
与通常的算术编解码的过程相比,主要的改进在于引入了“数据表”,通过查表得到线段更新和输出码字的信息。该“数据表”可以设置成不同的大小,“数据表”越长,占用的空间越大,但是编解码的效率也越高。
下面举例为8*8的“数据表”。约定:线段初始化为“1”,线段的两端一次定义为Low和High,并且满足Low≤High。当对一个符号编码后,新的线段是原线段的子线段,此时得到新的Low和High。将单位长度“l”的线段等分为8段,根据Low和High所处的位置会有64种项,其中因为要满足Low≤High的条件所以一共有36种可能,如表一。
用于编码端的“数据表”中每一项都对应于Low和High的位置,其中包括了所有输出码字的信息、Low和High放大倍数和偏移量以及线段更新结束的标志。输出码字的信息包括直接放入输出码字的比特和所谓Bit_to_follow个数,Bit_to_follow个数是指当前不输出,直到得到下一个输出比特后才能确定的输出比特个数。例如,当前累加的Bit_to_follow个数为3,下一次查表,要求输出的比特为“010”,那么,由于第一个确定比特为“0”,所以在这个“0”后面要加上3个“1”得到的输出比特为“011110”;反之,如果当前累加的Bit_to_follow个数为3,下一次查表,要求输出的比特为“110”,那么,由于第一个确定比特为“1”,所以在这个“1”后面要加上3个“0”得到的输出比特为“100010”。Low和High的放大倍数是指Low和High左移的比特数,左移后High的低位“0”要变为“1”。由于左移后Low和High的范围往往会超出原来的范围,所以还要减去相应的偏移量,使得Low和High回到原来的范围内。另外,如果Low和High的差值,也就是线段的长度足够大的话,就不需要更新线段;如果Low和High经过一次查表和更新过程,它们的差值仍然太小,就需要再进行下一次查表操作,这需要一个标志来标示。
用于解码端的“数据表”只需要记录更新Low、High和Value的信息,即Low、High和Value放大倍数和偏移量。Low左移后低位填“0”,High左移后低位填“1”,Value左移后低位填入待解码码字的比特,然后减去偏移量,所以可以保证Low≤Value≤High,并且处于有效范围内。,如果Low和High的差值,也就是线段的长度足够大的话,就不需要更新线段;如果Low和High经过一次查表和更新过程,它们的差值仍然太小,就需要再进行下一次查表操作,这需要一个标志来标示。
要求Low和High的差值足够大是为了保证设下一个符号的概率为p,那么(High-Low)next=[(High-Low)·P]-1≥0,要使上式在P=Pmin时也成立,就要求High-Low足够大,即
表一
本发明提出的通过查表实现算术编解码方法,大大节省了算术编解码的运算量,主要表现在:
(1)通过查表,编码端可以在一次更新线段的时候得到多个输出比特和Bit_to_follow信息,而不是一次更新线段只得到一个输出比特或Bit_to_follow增加1。解码端可以在一次更新线段的时候将多个输入比特放入Value中。
(2)通过查表,可以直接得到线段的信息,而避免了大量的判断和跳转操作。
具体实施方式
本发明的重点在于数据表的设计和查表、更新线段的操作,现分别进一步具体介绍如下:
一、“数据表”的设计
编码端“数据表”的内容有:
(1)单位“1”线段划分段数;
(2)数据表的表长;
(3)线段是否需要更新标志(比特);
(4)线段更新时有无输出比特标志(比特);
(5)线段更新时输出的第一个比特(比特);
(6)线段更新后是否需要再次更新标志(比特);
(7)线段放大后的偏移量(比特);
(8)线段更新时输出的比特(比特);
(9)线段更新时输出比特数(比特);
(10)Bit to follow的比特数(比特);
(11)数据表中每一项合计的比特数(比特)。
随着对单位“1”线段划分的增多,“数据表”长度增长,同时“数据表”中每一项需要的比特数也增多。通常线段划分的段数取为2n,取n为2-16。
表2为n取2、3、4时“数据表”形式。
单位“1”线段划分段数 | 数据表的表长 | 线段是否需要更新标志(比特) | 线段更新时有无输出比特标志(比特) | 线段更新时输出的第一个比特(比特) | 线段更新后是否需要再次更新标志(比特) | 线段放大后的偏移量(比特) | 线段更新时输出的比特(比特) | 线段更新时输出比特数(比特) | Bit tofollow的比特数(比特) | 数据表中每一项合计的比特数(比特) |
4 | 16 | 1 | 1 | 1 | 1 | 3 | 2 | 2 | 1 | 12 |
8 | 64 | 1 | 1 | 1 | 1 | 4 | 3 | 2 | 2 | 15 |
16 | 256 | 1 | 1 | 1 | 1 | 5 | 4 | 3 | 2 | 18 |
表二
解码端“数据表”的内容有:
(1)单位“1”线段划分段数;
(2)数据表的表长;
(3)线段是否需要更新标志(比特);
(4)线段更新后是否需要再次更新标志(比特);
(5)线段放大的左移位数(比特);
(6)线段放大后的偏移量(比特);
(7)数据表中每一项合计的比特数(比特)。
同样的随着对单位“1”线段划分的增多,“数据表”长度增长,同时“数据表”中每一项需要的比特数也增多。表3为n取2、3、4时“数据表”形式。
单位“1”线段划分段数 | 数据表的表长 | 线段是否需要更新标志(比特) | 线段更新后是否需要再次更新标志(比特) | 线段放大的左移位数(比特) | 线段放大后的偏移量(比特) | 数据表中每一项合计的比特数(比特) |
4 | 16 | 1 | 1 | 2 | 3 | 7 |
8 | 64 | 1 | 1 | 2 | 4 | 8 |
16 | 256 | 1 | 1 | 3 | 5 | 10 |
表三
二、查表和更新线段的操作
查表就是根据当前线段Low和High的位置得到相应的Index,然后得到“数据表”的信息。如果Low和High都用16个比特标示,单位“1”线段为0到65535,将线段分为8段,那么将Low和High的最高3比特组成Index,即
Index=Low15Low14Low13High15High14High13。
然后在“数据表”中得到数据。
编码的操作如下:
(1)如果“线段是否需要更新标志”为“非”,那么操作完成;反之,进行下一步操作;
(2)如果“线段更新时有无输出比特标志”为“是”,那么进行步骤(3)操作;反之进行步骤(4)操作;
(3)判断编码器之前累加的Bit_to_follow是否大于0。如果为“是”,则将“线段更新时输出的第一个比特”放入输出码字中,然后将Bit_to_follow个取反的“线段更新时输出的第一个比特”也放入输出码字中,再将剩余的“线段更新时输出的比特”放入输出码字中;如果为“非”,则将“线段更新时输出的比特”直接放入输出码字中;
(4)如果“数据表”中得到的“Bit_to_follow的比特数”不为0,则将其累加到编码器的Bit_to_follow中;
(5)“线段更新时输出的比特数”和“Bit_to_follow的比特数”之和为Low和High左移的位数,左移后将High的低位置为“1”,然后减去偏移量。偏移量是通过“线段放大后的偏移量”得到的,由于不同情况下偏移量的若干低位都是“0”,“线段放大后的偏移量”只记录了偏移量的高位,所以要通过左移得到实际需要的偏移量;
(6)如果“线段更新后是否需要再次更新标志”为“是”,则根据新得到的Low和High重新查表,然后从步骤(1)开始继续操作;反之,则完成当前操作,可以对下一个符号进行编码了。
解码的操作如下:
(1)如果“线段是否需要更新标志”为“非”,那么操作完成;反之,进行下一步操作;
(2)Low、High和Value左移“线段放大的左移位数”,Low左移后低位填“0”,High左移后低位填“1”,Value左移后低位填入待解码码字的比特,然后减去偏移量;和编码端一样,偏移量是通过“线段放大后的偏移量”得到的;
(3)如果“线段更新后是否需要再次更新标志”为“是”,则根据新得到的Low和High重新查表,然后从步骤(1)开始继续操作;反之,则完成当前操作,可以对下一个符号进行编码了。
三、与改进前算术编解码效果的比较
在标准视频流Salesman、Claire、Miss American中各选择一帧,分别进行一下操作。先对其进行梯度自适应预测(GAP),得到非等概率分布的符号集合,符号包括0到255,所以用8比特表示。任意选取64511个预测结果符号,统计预测结果各符号的概率,根据概率可以将线段划分为256个子线段,每个线段对应一个符号。Low和High都用16个比特表示,初始值Low=0,High=65535。
以下比较改进前和改进后算术编码的效率。
单位“1”线段划分段数 | 有输出比特操作的次数 | 将bit tofollow个比特输出次数 | 判断和挑砖的次数 | 查表的次数 | 更新线段的次数 | |
MissAmerican | 改进前 | 206505 | 29436 | 329921 | 0 | 427576 |
4 | 178334 | 29436 | 123383 | 242845 | 178334 | |
8 | 122925 | 29436 | 123383 | 156386 | 122925 | |
16 | 93725 | 29436 | 123383 | 132095 | 93725 | |
Claire | 改进前 | 185057 | 25113 | 300078 | 0 | 375946 |
4 | 157781 | 25113 | 114737 | 222292 | 157781 | |
8 | 111154 | 25113 | 114737 | 148240 | 111154 | |
16 | 90085 | 25113 | 114737 | 114294 | 90085 | |
Salesman | 改进前 | 312863 | 31433 | 440469 | 0 | 594792 |
4 | 235683 | 31433 | 127377 | 300194 | 235683 | |
8 | 160543 | 31433 | 127377 | 197859 | 160543 | |
16 | 130454 | 31433 | 127377 | 149675 | 130454 |
表四
显然,使用查表的方法,可以使得计算的次数大大降低,其中减少判断和跳转的次数还意味着减少流水线排空的次数。这些都将大大提高算术编解码的效率。
Claims (6)
1、一种通过查表实现的算术编解码方法,其特征在于编码的具体步骤如下:
(1)首先对一个符号编码,得到新的线段;
(2)然后根据新的线段两端的位置,得到表格中Index;
(3)读取表中的相应数据,该数据中包含更新线段和输出码字的信息;
(4)最后更新线段和输出码字;
(5)判断新的线段是否可以对下一个符号编码,如为真,从步骤(1)开始,对下一个符号编码,否则从步骤(2)开始,继续查表,更新线段并且输出码字。
2、根据权利要求1所述的算术编解码方法,其特征在于解码
(1)根据码字得到线段中一点的位置,称为Value,该点位于某个子线段,解码的符号为该子线段对应的符号;
(2)然后根据子线段两端的位置,得到表格中Index;
(3)读取表中的相应数据,该数据中包含更新线段的信息;
(4)最后更新线段,并且同时更新Value;
(5)判断新的线段是否可以对下一个符号解码,如为真,从步骤(1)开始,对下一个符号解码,否则从步骤(2)开始,继续查表,更新线段和Value。
3、根据权利要求1所述的算术编解码方法,其特征在于用于编码端的“数据表”中每一项都对应于Low和High的位置,其中包括了所有输出码字的信息、Low和High放大倍数和偏移量以及线段更新结束的标志,输出码字的信息包括直接放入输出码字的比特和所谓Bit_to_follow个数,Bit_to_follow个数是指当前不输出,直到得到下一个输出比特后才能确定的输出比特个数。
4、根据权利要求2所述的算术编解码方法,其特征在于用于解码端的“数据表”只需要记录更新Low、High和Value的信息,即Low、High和Value放大倍数和偏移量。
5、根据权利要求3所述的算术编解码方法,其特征在于编码中更新线段的操作步骤如下:
(1)如果“线段是否需要更新标志”为“非”,那么操作完成;反之,进行下一步操作;
(2)如果“线段更新时有无输出比特标志”为“是”,那么进行步骤(3)操作;反之进行步骤(4)操作;
(3)判断编码器之前累加的Bit_to_follow是否大于0,如果为“是”,则将“线段更新时输出的第一个比特”放入输出码字中,然后将Bit_to_follow个取反的“线段更新时输出的第一个比特”也放入输出码字中,再将剩余的“线段更新时输出的比特”放入输出码字中;如果为“非”,则将“线段更新时输出的比特”直接放入输出码字中;
(4)如果“数据表”中得到的“Bit_fo_follow的比特数”不为0,则将其累加到编码器的Bit_to_follow中;
(5)“线段更新时输出的比特数”和“Bit_to_follow的比特数”之和为Low和High左移的位数,左移后将High的低位置为“1”,然后减去偏移量;
(6)如果“线段更新后是否需要再次更新标志”为“是”,则根据新得到的Low和High重新查表,然后从步骤(1)开始继续操作;反之,则完成当前操作,可以对下一个符号进行编码了。
6、根据权利要求4所述的算术编解码方法,其特征在于在解码中更新线段的操作步骤如下:
(1)如果“线段是否需要更新标志”为“非”,那么操作完成;反之,进行下一步操作;
(2)Low、High和Value左移“线段放大的左移位数”,Low左移后低位填“0”,High左移后低位填“1”,Value左移后低位填入待解码码字的比特,然后减去偏移量;
(3)如果“线段更新后是否需要再次更新标志”为“是”,则根据新得到的Low和High重新查表,然后从步骤(1)开始继续操作;反之,则完成当前操作,可以对下一个符号进行编码了。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2005100243042A CN100423453C (zh) | 2005-03-10 | 2005-03-10 | 通过查表实现的算术编解码方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2005100243042A CN100423453C (zh) | 2005-03-10 | 2005-03-10 | 通过查表实现的算术编解码方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1658513A true CN1658513A (zh) | 2005-08-24 |
CN100423453C CN100423453C (zh) | 2008-10-01 |
Family
ID=35007803
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2005100243042A Expired - Fee Related CN100423453C (zh) | 2005-03-10 | 2005-03-10 | 通过查表实现的算术编解码方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100423453C (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101901588B (zh) * | 2009-05-31 | 2012-07-04 | 比亚迪股份有限公司 | 一种嵌入式系统的图像平滑显示方法 |
CN102664636A (zh) * | 2012-05-16 | 2012-09-12 | 苏州大学 | 一种变长编码、解码方法及装置 |
CN103096062A (zh) * | 2011-11-01 | 2013-05-08 | 珠海扬智电子科技有限公司 | 算术解码方法 |
CN107314780A (zh) * | 2016-04-27 | 2017-11-03 | 财团法人工业技术研究院 | 定位绝对码的解码装置及解码方法 |
CN112636765A (zh) * | 2019-09-24 | 2021-04-09 | 无锡江南计算技术研究所 | 基于数据压缩存储的细粒度并行查表方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6298087B1 (en) * | 1998-08-31 | 2001-10-02 | Sony Corporation | System and method for decoding a variable length code digital signal |
CN1137431C (zh) * | 1999-02-02 | 2004-02-04 | 罗平候 | 一种线符的编码输入方法 |
US6404362B1 (en) * | 1999-09-21 | 2002-06-11 | Unisys Corporation | Method and apparatus for reducing the time required for decompressing compressed data |
JP2002141807A (ja) * | 2000-11-02 | 2002-05-17 | Matsushita Electric Ind Co Ltd | 可変長復号化器 |
CN1281066C (zh) * | 2004-05-27 | 2006-10-18 | 复旦大学 | 一种三维小波等级树集合划分算法的视频压缩编码方法 |
-
2005
- 2005-03-10 CN CNB2005100243042A patent/CN100423453C/zh not_active Expired - Fee Related
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101901588B (zh) * | 2009-05-31 | 2012-07-04 | 比亚迪股份有限公司 | 一种嵌入式系统的图像平滑显示方法 |
CN103096062A (zh) * | 2011-11-01 | 2013-05-08 | 珠海扬智电子科技有限公司 | 算术解码方法 |
CN102664636A (zh) * | 2012-05-16 | 2012-09-12 | 苏州大学 | 一种变长编码、解码方法及装置 |
CN102664636B (zh) * | 2012-05-16 | 2016-03-23 | 苏州大学 | 一种变长编码、解码方法及装置 |
CN107314780A (zh) * | 2016-04-27 | 2017-11-03 | 财团法人工业技术研究院 | 定位绝对码的解码装置及解码方法 |
US10243668B2 (en) | 2016-04-27 | 2019-03-26 | Industrial Technology Research Institute | Positioning measurement device and the method thereof |
CN107314780B (zh) * | 2016-04-27 | 2020-06-12 | 财团法人工业技术研究院 | 定位绝对码的解码装置及解码方法 |
CN112636765A (zh) * | 2019-09-24 | 2021-04-09 | 无锡江南计算技术研究所 | 基于数据压缩存储的细粒度并行查表方法 |
CN112636765B (zh) * | 2019-09-24 | 2022-07-12 | 无锡江南计算技术研究所 | 基于数据压缩存储的细粒度并行查表方法 |
Also Published As
Publication number | Publication date |
---|---|
CN100423453C (zh) | 2008-10-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9851945B2 (en) | Bit remapping mechanism to enhance lossy compression in floating-point applications | |
CN1183683C (zh) | 使用前缀预测的位自适应编码方法 | |
US10528539B2 (en) | Optimized selection of hash collision chains | |
CN1658513A (zh) | 通过查表实现的算术编解码方法 | |
CN101771879B (zh) | 基于cabac的并行归一化编码实现电路及编码方法 | |
US20110154169A1 (en) | System, method, and apparatus for a scalable processor architecture for a variety of string processing applications | |
CN1933334A (zh) | 从比例二进制编码十进制转换到十进制浮点的系统和方法 | |
CN1945981A (zh) | 从十进制浮点转换到比例二进制编码十进制的系统和方法 | |
CN1898874A (zh) | 具有子块处理和基于子块的停止标准的siso解码器 | |
CN1645751A (zh) | 加速译码装置及其方法 | |
US20090201180A1 (en) | Compression for deflate algorithm | |
CN1514548A (zh) | 纠错编码设备及方法 | |
CN101562455A (zh) | 内容可适性二元算数编码的译码装置及其译码方法 | |
CN1868127A (zh) | 数据压缩系统和方法 | |
CN1262816A (zh) | 对信息信号的算术编码与解码 | |
CN116595568B (zh) | 一种基于区块链的隐私数据加密方法 | |
CN1758543A (zh) | 提高Turbo码译码速度的并行译码方法及译码装置 | |
CN1866218A (zh) | 软件系统的资源管理方法 | |
CN102740066A (zh) | Cavlc解码方法和系统 | |
CN1209925C (zh) | 基于信源高阶熵的数据压缩方法 | |
CN116707545A (zh) | 低消耗、高吞吐的5gldpc译码器实现方法及装置 | |
CN105653506A (zh) | 一种基于字符编码转换的gpu内文本处理的方法及装置 | |
CN101079636A (zh) | 将一位热码译码为二进制码的方法及一位热码译码器 | |
US9171032B2 (en) | Radix sort with read-only key | |
CN1645750A (zh) | 一种变长码的编码和解码方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20081001 Termination date: 20150310 |
|
EXPY | Termination of patent right or utility model |