Зная формулу умножения комплексных чисел и читая раздел «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)
как в примере комплексных чисел?