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\_expy_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\_expy_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\_expy_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\_expy_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\_expy_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\_expy_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\_expy_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\_expy_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)。

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

xy必须指向8字节对齐的地址。

操作:

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

yk124(2n=0N1xncos(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)。

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

xy必须指向8字节对齐的地址。

操作:

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

yk124(2n=0N1xncos(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)。

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

xy必须指向8字节对齐的地址。

操作:

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

yk127(2n=0N1xncos(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 倍。

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

xy 必须指向8字节对齐的地址。

操作:

yk127(2n=0N1xncos(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,,(N1)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}

异常:

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


void dct24_forward()

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

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

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

xy 必须指向8字节对齐的地址。

操作:

yk1210(2n=0N1xncos(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,,(N1)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}

异常:

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


void dct32_forward()

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

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

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

xy 必须指向8字节对齐的地址。

操作:

yk1210(2n=0N1xncos(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,,(N1)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}

异常:

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


void dct48_forward()

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

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

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

xy 必须指向8字节对齐的地址。

操作:

yk1213(2n=0N1xncos(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,,(N1)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}

异常:

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


void dct64_forward()

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

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

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

xy 必须指向8字节对齐的地址。

操作:

yk1213(2n=0N1xncos(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,,(N1)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}

异常:

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


void dct6_inverse()

执行6点逆DCT。

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

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

xy 必须指向8字节对齐的地址。

操作:

yk1N(x02+n=1N1xncos(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,,(N1)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}

异常:

如果 xy 的地址不是双字对齐的,则引发 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来完成的。

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

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

xy 必须指向8字节对齐的地址。

操作:

yrc4m=0N1n=0N1( 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,,(N1)}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 如果 xy 不是双字对齐(参见 @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来完成的。

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

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

xy 必须指向8字节对齐的地址。

操作:

yrc1N2m=0N1n=0N1( 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,,(N1)}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] 附加的输出缩放指数。

异常:

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