C# 32x32矩阵的BinDCT实现

C# 32x32矩阵的BinDCT实现,c#,algorithm,math,matrix,dct,C#,Algorithm,Math,Matrix,Dct,因此,我对DCT实现进行了一些研究,并注意到由于需要进行乘法器计算,它们(相对)比较慢 在谷歌搜索了一下之后,我发现了BinDCT,它可以很好地近似DCT,并且只使用位移位 在浏览有关它的论文(和)并阅读我在ohlo()上找到的一些代码时,我注意到只有8x8矩阵的实现 我正在寻找一个32x32矩阵的BinDCT实现,这样我就可以在感知散列算法(phash)的更快变化中使用它 我不是数学家,尽管我试图理解论文中的内容和我发现的c代码,但我还是不知道如何将这个实现转换为适用于32x32矩阵 有人写过

因此,我对DCT实现进行了一些研究,并注意到由于需要进行乘法器计算,它们(相对)比较慢

在谷歌搜索了一下之后,我发现了BinDCT,它可以很好地近似DCT,并且只使用位移位

在浏览有关它的论文(和)并阅读我在ohlo()上找到的一些代码时,我注意到只有8x8矩阵的实现

我正在寻找一个32x32矩阵的BinDCT实现,这样我就可以在感知散列算法(phash)的更快变化中使用它

我不是数学家,尽管我试图理解论文中的内容和我发现的c代码,但我还是不知道如何将这个实现转换为适用于32x32矩阵

有人写过吗?有可能吗

我知道扩展实现需要更多的位移位和tmp变量。但是,尽管我可以尝试反复尝试,但我甚至不理解理论,所以我永远不知道我是否得到了正确的结果


我是用C#写这篇文章的,但是任何语言都可以,因为它都是基本的操作,而且很容易翻译。

我对应用矩阵的唯一理解与操作3D向量有关,所以我不知道你的问题的直接答案。但是环顾四周,我确实找到了一个博客的链接,在那里你的具体问题得到了解决。底部的评论来自一群人,他们可能是一个很好的资源库,可以与在这方面有知识的人聊天。此外,如果你按照链接有很多好的图像压缩信息

作者似乎大量参与了照片取证。他解释了pHash如何比平均哈希更健壮,并提到使用32 x 32矩阵

这可能是一个非常好的起点。保重


1.您有固定的输入大小

  • 所以你一直乘以相同的权重
  • 预先计算它们一次,然后只使用它们
  • 这条沟渠是所有罪恶和罪恶的行动
2.2D DCT可以计算为1D DCT(类似于FFT)

  • 首先对行进行DCT
  • 然后讨论了dct行的合谋
  • 乘以归一化常数
  • 所以这将O(N^4)转换为O(N^3)
3.使用FastDCT

  • 这很棘手
  • 快速算法是(I)DST和(I)DCT的融合
  • 关于它的论文很少
  • 但是有模糊的(而且所有的方程式在不同的论文中都是不同的,而不是完整的)
  • 我实际上看到了一个函数方程,也没有它的程序
  • 唯一的几乎是功能性的方法是使用FFT
  • 但对于小N,由于切换到复域,没有增益
  • 这些值不是真正的DCT,而是它的近似值
  • 当然,我在这个领域不是专家,所以我可以忽略一些东西
  • 在那几百页纸上
  • 无论如何,在快速算法实现后,2D(I)DCT和bullet 2
  • 复杂性大约是O((N^2).log(N))
4.放弃FPU乘法

  • 您可以获取所有权重并将其转换为a1=a0*1024
  • 或任何其他面具
  • 因此:

    x*a0 = (x*a1)/1024 = (x*a1)>>10
    
  • 对于输入数据也可以这样做

  • 现在只剩下整数运算了
  • 但在现代机器上,这种方法比FPU的使用慢吗(取决于平台和实现)
4.舍弃整数乘法

  • 您可以通过移位和加法操作放弃所有乘法(查找二进制乘法)
  • 但在现代机器上,这真的会减慢速度吗
  • 当然,如果您在某些逻辑板/IO上布线,那么它有其优点

这篇博客文章实际上是我开始研究感知图像散列的最初出发点。从那里我已经阅读了PHASH的C++代码,并将其转换成C语言。不过,我遇到的主要问题是,他们使用的是DCT算法,由于需要进行乘法运算,因此速度(相对)较慢。因为我需要一个非常高性能的算法,这也是非常准确的。我开始研究DCT算法的近似值,这使我想到了BinDCT。谢谢:)在研究binDCT版本之前,你能制作一个32x32版本的DCT算法吗?此外,我还对C#中的逐位计算进行了广泛的测试,与使用正则表达式运算符相比,性能显著提高的情况确实很少见。这是因为在C#中,我们不是直接使用内存,而是通过IL来使用内存。在编译器优化之后,IL的速度几乎总是相当的。我的观点是,你链接到的binDCT代码中的位运算在C#中没有那么重要,因为你没有做浮点运算。我现在在C#中有一个phash的工作实现,是的。我把它比作调用一个本地C++ DLL,它并没有真正获得任何东西。使用分析器,我发现dct函数中约80%的时间来自所需的for(for)(for())乘法。这是该算法无法避免的一个特性。BinDCT不需要乘法,只需要位移位和加法。我已经优化了dct函数,使其使用锯齿数组。将其转换为IL(或PInvoking一个本地dll)可能甚至不会给我1%的速度增益,所以这就是为什么我要寻找一个完全不同的算法(放弃乘法)是的。还要在你的帖子中添加算法标签。有很多东西可以提供!嘿!谢谢你的回复。1.是的,我正在这样做,我有一个预计算的32x32矩阵。2.尝试了这个,虽然我得到了奇怪的结果,但可能是我的代码中的错误。3.UUUU Rh。4.尝试了,但增加了比使用浮点数更多的开销。5.这是