【发布时间】:2014-05-09 03:09:32
【问题描述】:
编辑你可以在 Github 上查看我的实现:https://github.com/Sheljohn/WalshHadamard
我正在寻找sequency-ordered快速 Walsh Hadamard 变换的实现或有关如何实现的指示(请参阅 this 和 this)。
我稍微改编了一个很好的实现 online:
// (a,b) -> (a+b,a-b) without overflow
void rotate( long& a, long& b )
{
static long t;
t = a;
a = a + b;
b = t - b;
}
// Integer log2
long ilog2( long x )
{
long l2 = 0;
for (; x; x >>=1) ++l2;
return l2;
}
/**
* Fast Walsh-Hadamard transform
*/
void fwht( std::vector<long>& data )
{
const long l2 = ilog2(data.size()) - 1;
for (long i = 0; i < l2; ++i)
{
for (long j = 0; j < (1 << l2); j += 1 << (i+1))
for (long k = 0; k < (1 << i ); ++k)
rotate( data[j + k], data[j + k + (1<<i)] );
}
}
但它不按顺序计算 WHT(隐式使用自然 Hadamard 矩阵)。请注意,在上面的代码中(如果您尝试的话),数据的大小需要是 2 的幂。
我的问题是:这个实现是否有一个简单的调整来提供按顺序排列的 FWHT?
一个可能的解决方案是编写一个小函数来动态计算 Hn 的元素(n 阶 Hadamard 矩阵),计算零交叉的数量,并创建行的排名,但我想知道是否存在是一种更聪明的方式。提前感谢您的任何意见!干杯
【问题讨论】:
标签: c++ c signal-processing