如何编写四元数DFT公式?

时间:2019-04-29 15:45:42

标签: quaternions dft

仅需知道复数乘法公式,并阅读DFT“定义”部分in the Wiki article,就可以为某些复数向量dft(x)编写一些x。我将使用相同的字母,并采用伪编码方式(这是C语言和glsl的易于理解的组合)

复杂的DFT

// 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的相同内容?

四元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),如复数示例吗?

0 个答案:

没有答案