Как написать формулу Quaternion DFT? - PullRequest
0 голосов
/ 29 апреля 2019

Зная формулу умножения комплексных чисел и читая раздел «100» * определения DFT в статье Wiki , легко написать dft(x) для некоторого вектора x комплексных чисел.Я буду использовать те же буквы и использовать псевдокод (это все же легко читаемое сочетание C языка и glsl)

Complex 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?

Quaternionic 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) как в примере комплексных чисел?

...