首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只使用整数的DCT

只使用整数的DCT
EN

Stack Overflow用户
提问于 2013-09-04 18:25:28
回答 1查看 3.3K关注 0票数 2

我需要实现DCT变换,但我不能使用浮点或双类型。互联网上有很多实现,但它们都使用浮点。

有谁知道整数上有DCT的来源吗?

我需要它来实现颜色布局描述符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-24 11:52:45

我发现一篇博客文章描述了基于整数的离散余弦变换和IDCT 这里,并给出了一个在Matlab中的实现。

他使用的代码在GitHub上,可用的这里上。

我使用了bink_dct_B2.m方法。这将计算缩放的1D-DCT变换,因此,如果要使用2D-正交DCT变换,则必须使用以下代码:

代码语言:javascript
复制
A_tranformed = (bink_dct_B2(bink_dct_B2(A)')')/8

这里A是你想要变换的矩阵。这将提供与Matlab内置dct2 2-命令大致相同的输出(此整数实现将引入一些舍入错误)。

代码语言:javascript
复制
function out=bink_dct_B2(in)
  % extract rows
  i0 = in(1,:);
  i1 = in(2,:);
  i2 = in(3,:);
  i3 = in(4,:);
  i4 = in(5,:);
  i5 = in(6,:);
  i6 = in(7,:);
  i7 = in(8,:);

  % stage 1 - 8A
  a0 = i0 + i7;
  a1 = i1 + i6;
  a2 = i2 + i5;
  a3 = i3 + i4;
  a4 = i0 - i7;
  a5 = i1 - i6;
  a6 = i2 - i5;
  a7 = i3 - i4;

  % even stage 2 - 4A
  b0 = a0 + a3;
  b1 = a1 + a2;
  b2 = a0 - a3;
  b3 = a1 - a2;

  % even stage 3 - 6A 4S
  c0 = b0 + b1;
  c1 = b0 - b1;
  c2 = b2 + b2/4 + b3/2;
  c3 = b2/2 - b3 - b3/4;

  % odd stage 2 - 12A 8S
  % NB a4/4 and a7/4 are each used twice, so this really is 8 shifts, not 10.
  b4 = a7/4 + a4 + a4/4 - a4/16;
  b7 = a4/4 - a7 - a7/4 + a7/16;
  b5 = a5 + a6 - a6/4 - a6/16;
  b6 = a6 - a5 + a5/4 + a5/16;

  % odd stage 3 - 4A
  c4 = b4 + b5;
  c5 = b4 - b5;
  c6 = b6 + b7;
  c7 = b6 - b7;

  % odd stage 4 - 2A
  d4 = c4;
  d5 = c5 + c7;
  d6 = c5 - c7;
  d7 = c6;

  % permute/output
  out = [c0; d4; c2; d6; c1; d5; c3; d7];

  % total: 36A 12S
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18621167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档