仅需知道复数乘法公式,并阅读DFT“定义”部分in the Wiki article,就可以为某些复数向量dft(x)
编写一些x
。我将使用相同的字母,并采用伪编码方式(这是C
语言和glsl
的易于理解的组合)
// complex numbers multiplication:
vec2 cmul(vec2 a, vec2 b) {
return vec2(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);
}
// seems to be somehow a complex exponential (on a unit circle):
vec2 cexp(float someAngle) {
return vec2( cos(someAngle), -sin(someAngle) );
}
const float pi = 3.14;
// returns complex "cdft(x)" at point "k", where "x" is a vector of length "N":
vec2 cdft(vec2* x, int N, int k) {
vec2 res = vec2(0.0);
for(int n = 0; n < N; n++)
res += cmul( x[n], cexp(2.0*pi*k*n/N) );
return res;
}
但是在哪里可以找到四元数DFT的相同内容?
假设四元数q
的形式为q.w+i*q.x+j*q.y+k*q.z
,我可以轻松地从简单的数学开始:
// hamilton product
vec4 qmul(vec4 a, vec4 b) {
return vec4(
a.w * b.xyz + b.w * a.xyz - cross(a.xyz, b.xyz),
a.w*b.w - dot(a.xyz, b.xyz)
);
}
但是接下来呢?我是否应该像围绕复杂的单位圆那样在整个单位超球面上奔跑?..所以我被困在这里。是的,我知道指数公式e ^ q,可以这样写:
// quaternionic exponential
vec4 qexp(in vec4 q) {
float vl = length(q.xyz);
return exp(q.w) * vec4( sin(vl) * q.xyz / vl, cos(vl));
}
但是我应该经过那里吗?
您能帮我写四元数dft qdft(x)
,如复数示例吗?