Skip to main content
欢迎来到PAWPAW技术文档网站,了解更多信息。

Discrete Cosine Transform API

本文档阐述了关于离散余弦变换(DCT)API,此API使得执行多种操作成为可能。涵盖了各种不同点数(如6点、8点、12点等)的DCT以及正反向操作函数。同时,也包含二维DCT的相关操作。值得注意的是,这里提供的正向DCT为Type-II,其逆变换为Type-III,因此同时支持Type-II和Type-III。

DCT API快速访问链接​

注意:正向DCT是Type-II类型。Type-II DCT的逆变换是Type-III DCT,因此这里支持Type-II和Type-III。

说明正向函数逆向函数
6点DCTdct6_forward()dct6_inverse()
8点DCTdct8_forward()dct8_inverse()
12点DCTdct12_forward()dct12_inverse()
16点DCTdct16_forward()dct16_inverse()
24点DCTdct24_forward()dct24_inverse()
32点DCTdct32_forward()dct32_inverse()
48点DCTdct48_forward()dct48_inverse()
64点DCTdct64_forward()dct64_inverse()
8x8 二维DCTdct8x8_forward()dct8x8_inverse()

const exponent_t dct6_exp​

与dct6_forward()相关的比例指数。

设xˉ\bar{x}为dct6_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct6_expy\_exp = x\_exp + dct6\_exp

取值: 4


const exponent_t dct8_exp​

与dct8_forward()相关的比例指数。

设xˉ\bar{x}为dct8_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct8_expy\_exp = x\_exp + dct8\_exp

取值: 4


const exponent_t dct12_exp​

与dct12_forward()相关的比例指数。

设xˉ\bar{x}为dct12_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct12_expy\_exp = x\_exp + dct12\_exp

取值: 7


const exponent_t dct16_exp​

与dct16_forward()相关的比例指数。

设xˉ\bar{x}为dct16_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct16_expy\_exp = x\_exp + dct16\_exp

取值: 7


const exponent_t dct24_exp​

与dct24_forward()相关的比例指数。

设xˉ\bar{x}为dct24_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct24_expy\_exp = x\_exp + dct24\_exp

取值: 10


const exponent_t dct32_exp​

与dct32_forward()相关的比例指数。

设xˉ\bar{x}为dct32_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct32_expy\_exp = x\_exp + dct32\_exp

取值: 10


const exponent_t dct48_exp​

与dct48_forward()相关的比例指数。

设xˉ\bar{x}为dct48_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct48_expy\_exp = x\_exp + dct48\_exp

取值: 13


const exponent_t dct64_exp​

与dct64_forward()相关的比例指数。

设xˉ\bar{x}为dct64_forward()的输入,yˉ\bar{y}为输出。如果x_expx\_exp和y_expy\_exp分别是与xˉ\bar{x}和yˉ\bar{y}相关联的指数,则以下关系成立:y_exp=x_exp+dct64_expy\_exp = x\_exp + dct64\_exp

取值: 13


void dct6_forward()​

6点32位正向DCT。

该函数对输入向量xˉ\bar{x}执行6点正向DCT类型II,并使用结果填充输出向量yˉ\bar{y}。为避免可能的溢出或饱和,输出yˉ\bar{y}按242^4的因子进行缩放(参见@ref dct6_exp)。

如果x和y指向同一个向量,则可以安全地原地执行此操作。

x和y必须指向8字节对齐的地址。

操作:

对于k=0,1,…,(N−1)k = 0,1,\dots,(N-1),其中N=6N = 6:

yk←124(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^4} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

参数:

  • int32_t y[6] – [out] 输出向量yˉ\bar{y}
  • const int32_t x[6] – [in] 输入向量xˉ\bar{x}

void dct8_forward()​

8点32位正向DCT。

该函数对输入向量xˉ\bar{x}执行8点正向DCT类型II,并使用结果填充输出向量yˉ\bar{y}。为避免可能的溢出或饱和,输出yˉ\bar{y}按242^4的因子进行缩放(参见@ref dct8_exp)。

如果x和y指向同一个向量,则可以安全地原地执行此操作。

x和y必须指向8字节对齐的地址。

操作:

对于k=0,1,…,(N−1)k = 0,1,\dots,(N-1),其中N=8N = 8:

yk←124(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^4} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

参数:

  • int32_t y[8] – [out] 输出向量yˉ\bar{y}
  • const int32_t x[8] – [in] 输入向量xˉ\bar{x}

void dct12_forward()​

12点32位正向DCT。

该函数对输入向量xˉ\bar{x}执行12点正向DCT类型II,并使用结果填充输出向量yˉ\bar{y}。为避免可能的溢出或饱和,输出yˉ\bar{y}按272^7的因子进行缩放(参见@ref dct12_exp)。

如果x和y指向同一个向量,则可以安全地原地执行此操作。

x和y必须指向8字节对齐的地址。

操作:

对于k=0,1,…,(N−1)k = 0,1,\dots,(N-1),其中N=12N = 12:

yk←127(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^7} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

参数:

  • int32_t y[12] – [out] 输出向量yˉ\bar{y}
  • const int32_t x[12] – [in] 输入向量xˉ\bar{x}

void dct16_forward()​

执行16点正向第二型离散余弦变换(DCT)。

该函数对输入向量 xˉ\bar{x} 执行16点正向第二型DCT,并将结果填充到输出向量 yˉ\bar{y} 中。为避免可能的溢出或饱和,输出向量 yˉ\bar{y} 被缩小了 272^7 倍。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yk←127(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^7} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

其中 k=0,1,…,(N−1)k = 0,1,\dots,(N-1),N=16N = 16

参数:

  • int32_t y[16] – [out] 输出向量 yˉ\bar{y}
  • const int32_t x[16] – [in] 输入向量 xˉ\bar{x}

异常:

如果 x 或 y 的地址不是双字对齐的,则引发 ET_LOAD_STORE 异常。


void dct24_forward()​

执行24点正向第二型离散余弦变换(DCT)。

该函数对输入向量 xˉ\bar{x} 执行24点正向第二型DCT,并将结果填充到输出向量 yˉ\bar{y} 中。为避免可能的溢出或饱和,输出向量 yˉ\bar{y} 被缩小了 2102^{10} 倍。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yk←1210(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^{10}} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

其中 k=0,1,…,(N−1)k = 0,1,\dots,(N-1),N=24N = 24

参数:

  • int32_t y[24] – [out] 输出向量 yˉ\bar{y}
  • const int32_t x[24] – [in] 输入向量 xˉ\bar{x}

异常:

如果 x 或 y 的地址不是双字对齐的,则引发 ET_LOAD_STORE 异常。


void dct32_forward()​

执行32点正向第二型离散余弦变换(DCT)。

该函数对输入向量 xˉ\bar{x} 执行32点正向第二型DCT,并将结果填充到输出向量 yˉ\bar{y} 中。为避免可能的溢出或饱和,输出向量 yˉ\bar{y} 被缩小了 2102^{10} 倍。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yk←1210(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^{10}} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

其中 k=0,1,…,(N−1)k = 0,1,\dots,(N-1),N=32N = 32

参数:

  • int32_t y[32] – [out] 输出向量 yˉ\bar{y}
  • const int32_t x[32] – [in] 输入向量 xˉ\bar{x}

异常:

如果 x 或 y 的地址不是双字对齐的,则引发 ET_LOAD_STORE 异常。


void dct48_forward()​

执行48点正向第二型离散余弦变换(DCT)。

该函数对输入向量 xˉ\bar{x} 执行48点正向第二型DCT,并将结果填充到输出向量 yˉ\bar{y} 中。为避免可能的溢出或饱和,输出向量 yˉ\bar{y} 被缩小了 2132^{13} 倍。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yk←1213(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^{13}} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

其中 k=0,1,…,(N−1)k = 0,1,\dots,(N-1),N=48N = 48

参数:

  • int32_t y[48] – [out] 输出向量 yˉ\bar{y}
  • const int32_t x[48] – [in] 输入向量 xˉ\bar{x}

异常:

如果 x 或 y 的地址不是双字对齐的,则引发 ET_LOAD_STORE 异常。


void dct64_forward()​

执行64点正向第二型离散余弦变换(DCT)。

该函数对输入向量 xˉ\bar{x} 执行64点正向第二型DCT,并将结果填充到输出向量 yˉ\bar{y} 中。为避免可能的溢出或饱和,输出向量 yˉ\bar{y} 被缩小了 2132^{13} 倍。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yk←1213(2∑n=0N−1xncos⁡(kπ2n+12N))y_k \leftarrow \frac{1}{2^{13}} \left( 2\sum_{n=0}^{N-1} x_n \cos\left( k\pi \frac{2n+1}{2N} \right) \right)

其中 k=0,1,…,(N−1)k = 0,1,\dots,(N-1),N=64N = 64

参数:

  • int32_t y[64] – [out] 输出向量 yˉ\bar{y}
  • const int32_t x[64] – [in] 输入向量 xˉ\bar{x}

异常:

如果 x 或 y 的地址不是双字对齐的,则引发 ET_LOAD_STORE 异常。


void dct6_inverse()​

执行6点逆DCT。

该函数对输入向量 xˉ\bar{x} 执行6点逆DCT(与第三型DCT相同),并将结果填充到输出向量 yˉ\bar{y} 中。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yk←1N(x02+∑n=1N−1xncos⁡(nπ2k+12N))y_k \leftarrow \frac{1}{N} \left( \frac{x_0}{2} + \sum_{n=1}^{N-1} x_n \cos\left( n\pi \frac{2k+1}{2N} \right) \right)

其中 k=0,1,…,(N−1)k = 0,1,\dots,(N-1),N=6N = 6

参数:

  • int32_t y[6] – [out] 输出向量 yˉ\bar{y}
  • const int32_t x[6] – [in] 输入向量 xˉ\bar{x}

异常:

如果 x 或 y 的地址不是双字对齐的,则引发 ET_LOAD_STORE 异常。


headroom_t dct8x8_forward()​

对8位输入张量 xˉ\bar{x}(元素为 xrcx_{rc})执行二维8x8类型-II DCT。输出张量 yˉ\bar{y}(元素为 yrcy_{rc})将被填充为结果。

这个二维DCT的计算是通过首先在 xˉ\bar{x} 的每一行上应用一维8点DCT,然后对该中间张量的每一列应用一维8点DCT来完成的。

输出结果将被缩放因子 2−sat−82^{-\mathtt{sat}-8} 缩放。当 sat=0\mathtt{sat}=0 时,此缩放足够避免任何可能的饱和。如果饱和被认为是可接受的,或者事先已知不可能发生饱和,则可以使用负值的 sat\mathtt{sat} 来增加输出的精度。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yrc←4∑m=0N−1∑n=0N−1( xmncos⁡(cπ2n+12N)cos⁡(rπ2m+12N))2sat+8y_{rc} \leftarrow \frac{4 \sum_{m=0}^{N-1} \sum_{n=0}^{N-1} \left( \ x_{mn} \cos\left( c\pi\frac{2n+1}{2N} \right) \cos\left(r\pi\frac{2m+1}{2N} \right)\right)}{2^{\mathtt{sat}+8}}\\

其中 r,c∈{0,1,…,(N−1)}r,c \in \{0,1,\dots,(N-1)\},N=8N = 8。

参数:

  • int8_t y[8][8] – [out] 输出向量 yˉ\bar{y}

  • const int8_t x[8][8] – [out] 输入向量 xˉ\bar{x}

  • const right_shift_t sat – [out] 附加的输出缩放指数。

异常:

  • ET_LOAD_STORE 如果 x 或 y 不是双字对齐(参见 @ref note_vector_alignment)

headroom_t dct8x8_inverse()​

对8位输入张量 xˉ\bar{x}(元素为 xrcx_{rc})执行二维8x8类型-III(逆)DCT。输出张量 yˉ\bar{y}(元素为 yrcy_{rc})将被填充为结果。

这个二维DCT的计算是通过首先在 xˉ\bar{x} 的每一行上应用一维8点DCT,然后对该中间张量的每一列应用一维8点DCT来完成的。

输出结果将被缩放因子 2−sat2^{-\mathtt{sat}} 缩放。当 sat=0\mathtt{sat}=0 时,此缩放足够避免任何可能的饱和。如果饱和被认为是可接受的,或者事先已知不可能发生饱和,则可以使用负值的 sat\mathtt{sat} 来增加输出的精度。

如果 x 和 y 指向同一个向量,则可以安全地原地执行此操作。

x 和 y 必须指向8字节对齐的地址。

操作:

yrc←1N2∑m=0N−1∑n=0N−1( xmncos⁡(nπ2c+12N)cos⁡(mπ2r+12N))2saty_{rc} \leftarrow \frac{ \frac{1}{N^2} \sum_{m=0}^{N-1} \sum_{n=0}^{N-1} \left( \ x_{mn} \cos\left( n\pi\frac{2c+1}{2N} \right) \cos\left(m\pi\frac{2r+1}{2N} \right)\right)}{2^{\mathtt{sat}}}\\

其中 r,c∈{0,1,…,(N−1)}r,c \in \{0,1,\dots,(N-1)\},N=8N = 8。

参数:

  • int8_t y[8][8] – [out] 输出向量 yˉ\bar{y}

  • const int8_t x[8][8] – [out] 输入向量 xˉ\bar{x}

  • const right_shift_t sat – [out] 附加的输出缩放指数。

异常:

  • 如果 x 或 y 不是双字对齐的(参见 @ref note_vector_alignment),则触发ET_LOAD_STORE 异常