Also take a look at the page ODF Shapes.
An SO(3) kernel is a radially symmetric function
\[\tilde\psi\colon\mathcal{SO}(3)\to\mathbb R.\]
This means that the kernel depends only on the rotation angle \(\omega({\bf R})\in[0,\pi]\) of a rotation \({\bf R}\). Using \(t=\cos\frac{\omega({\bf R})}{2},\) we write
\[\tilde\psi({\bf R})=\psi(t).\]
In Fourier space, an SO3Kernel is described by one coefficient \(\hat\psi_n\) for each degree \(n\). These are the same coefficients that are used for representing SO3FunHarmonic's and they are called Fourier coefficients, Wigner-D coefficients, or C-coefficients. Note, that for general SO3FunHarmonic's we have \((2n+1)^2\) Fourier coefficients for degree \(n\). Here we have only one coefficient, due to the radial symmetry of the SO3Kernel.
In MTEX an SO3Kernel is represented in the (Chebyshev series) expansion
\[\psi(t)=\sum_{n=0}^{\infty}(2n+1)\,\hat\psi_n\, \mathcal U_{2n}(t),\]
where \(\mathcal U_{2n}\) denotes the Chebyshev polynomial of the second kind and degree \(2n\).
Exactly, as for SO3FunHarmonic's, the Fourier coefficients of a SO3Kernel can be displayed using plotSpektra.
The class SO3Kernel is needed in MTEX to define the specific form of unimodal ODFs. It has to be passed as an argument when calling the methods uniformODF or unimodalODF. Furthermore SO3Kernel's are also used for computing an ODF from EBSD data.
Within the class SO3Kernel, kernel functions are represented by their Chebyshev coefficients \(a_n=(2n+1)\,\hat\psi_n\), which are stored in the field fun.A. As an example lets define an SO3Kernel with Chebyshev coefficients \(a_0 = 1\), \(a_1 = 0\), \(a_2 = 3\) and \(a_3 = 1\)
psi = SO3Kernel([1;0;3;1])psi = SO3Kernel
bandwidth: 3
halfwidth: 40°We plot this function by evaluation of its Chebyshev series in \(\cos(\frac{\omega}{2})\) for \(\omega \in [-\pi,\pi]\).
plot(psi)
We can define an SO3Fun from a kernel function \(\psi\) at a specific orientation \(\bf R\) by using the class SO3FunRBF, i.e.
psi = SO3DeLaValleePoussinKernel('halfwidth',20*degree)
SO3F = SO3FunRBF(orientation.rand,psi)
plot(SO3F)psi = SO3DeLaValleePoussinKernel
bandwidth: 13
halfwidth: 20°
SO3F = SO3FunRBF (1 → y↓→x)
unimodal component
kernel: de la Vallee Poussin, halfwidth 20°
center: 1 orientations
Bunge Euler angles in degree
phi1 Phi phi2 weight
156.958 161.468 197.878 1
The following kernel function are predefined in MTEX
- de la Vallee Poussin kernel (used for ODF, MODF, Pole figures, etc)
- Dirichlet kernel (used for physical properties)
- Abel Poisson kernel
- von Mises Fisher kernel
- Gauss Weierstrass kernel
- Sobolev kernel
- Laplace kernel
- Square Singularity kernel
- Bump kernel
A specific SO3Kernel like the de la Vallee Poussin kernel is specified by a half-width angle in orientation space (\(\mathcal{SO}(3)\)) or bandwidth in Fourier space, which is the maximum development in Fourier coefficients.
psi = SO3DeLaValleePoussinKernel('halfwidth',30*degree)
close all
plot(psi)psi = SO3DeLaValleePoussinKernel
bandwidth: 9
halfwidth: 30°
In the following we want to look at the different types of SO3Kernels defined in MTEX.
The de La Vallee Poussin Kernel
The de la Vallee Poussin kernel on \(\mathcal{SO}(3)\) is defined by
\[ K(t) = \frac{B(\frac32,\frac12)}{B(\frac32,\kappa+\frac12)}\,t^{2\kappa}\]
for \(t\in[0,1]\), where \(B\) denotes the Beta function. The de la Vallee Poussin kernel additionally has the unique property that for a given halfwidth it can be described exactly by a finite number of Fourier coefficients. This kernel is recommended for Texture analysis as it is always positive in orientation space and there is no truncation error in Fourier space. Hence we can define the de la Vallee Poussin kernel \(\psi_{\kappa}\) depending on a parameter \(\kappa \in \mathbb N \setminus \{0\}\) by its finite Chebyshev expansion
\[ \psi_{\kappa}(t) = \frac{(\kappa+1)\,2^{2\kappa-1}}{\binom{2\kappa-1}{\kappa}} \, t^{2\kappa} = \binom{2\kappa+1}{\kappa}^{-1} \, \sum\limits_{n=0}^{\kappa} (2n+1)\,\binom{2\kappa+1}{\kappa-n} \, \mathcal U_{2n}(t).\]
Lets construct two of them.
psi1 = SO3DeLaValleePoussinKernel('halfwidth',15*degree)
psi2 = SO3DeLaValleePoussinKernel('halfwidth',20*degree)
plot(psi1)
hold on
plot(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')psi1 = SO3DeLaValleePoussinKernel
bandwidth: 17
halfwidth: 15°
psi2 = SO3DeLaValleePoussinKernel
bandwidth: 13
halfwidth: 20°
Here the parameter \(\kappa\) is \(40.34\) for function \(\psi_1\) and \(22.64\) in function \(\psi_2\).
We also take a look at the Fourier coefficients
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')
The Dirichlet Kernel
The Dirichlet kernel has the unique property of being a convergent finite series in Fourier coefficients with an integral of one. This kernel is recommended for calculating physical properties as the Fourier coefficients always have a value of one for a given bandwidth.
On the rotation group \(\mathcal{SO}(3)\) the Dirichlet kernel \(\psi_N \in L^2(\mathcal{SO}(3))\) is defined by its Chebyshev series
\[ \psi_N(t) = \sum\limits_{n=0}^N (2n+1) \, \mathcal U_{2n}(t).\]
Lets construct two of them.
psi1 = SO3DirichletKernel(10)
psi2 = SO3DirichletKernel(5)
plot(psi1)
hold on
plot(psi2)
hold off
legend('bandwidth = 10','bandwidth = 5')psi1 = SO3DirichletKernel
bandwidth: 10
halfwidth: 13°
psi2 = SO3DirichletKernel
bandwidth: 5
halfwidth: 24°
By looking at the fourier coefficients we see, that they are exactly 1.
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('bandwidth = 10','bandwidth = 5')
The Abel Poisson Kernel
The Abel Poisson kernel \(\psi_{\kappa}\in L^2(\mathcal{SO}(3))\) is a nonnegative function depending on a parameter \(\kappa \in (0,1)\) and is defined by its Chebyshev series
\[ \psi_{\kappa}(t) = \sum\limits_{n=0}^{\infty} (2n+1) \, \kappa^{2n} \, \mathcal U_{2n}(t).\]
Lets construct two of them.
psi1 = SO3AbelPoissonKernel('halfwidth',15*degree)
psi2 = SO3AbelPoissonKernel('halfwidth',20*degree)
plot(psi1)
hold on
plot(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')psi1 = SO3AbelPoissonKernel
bandwidth: 19
halfwidth: 15°
psi2 = SO3AbelPoissonKernel
bandwidth: 15
halfwidth: 20°
Here the parameter \(\kappa\) is \(0.82\) for function \(\psi_1\) and \(0.76\) in function \(\psi_2\).
We also take a look at the Fourier coefficients
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')
The von Mises Fisher Kernel
The von Mises Fisher kernel \(\psi_{\kappa}\in L^2(\mathcal{SO}(3))\) is a nonnegative function depending on a parameter \(\kappa>0\) and is defined by its Chebyshev series
\[ \psi_{\kappa}(t) = \sum_{n=0}^{\infty} \frac{\mathcal{I}_n(\kappa)-\mathcal{I}_{n+1}(\kappa)}{\mathcal{I}_0(\kappa)-\mathcal{I}_1(\kappa)} \, \mathcal U_{2n}(t)\]
or directly by
\[ \psi_{\kappa}(\cos\frac{\omega({\bf R})}2) = \frac1{\mathcal{I}_0(\kappa)-\mathcal{I}_1(\kappa)} \, \mathrm{e}^{\kappa \cos\omega({\bf R})}\]
while \(\mathcal I_n,\,n \in \mathbb N_0\) denotes the the modified Bessel functions of first kind
\[ \mathcal I_n (\kappa) = \frac1{\pi} \int_0^{\pi} \mathrm e^{\kappa \, \cos \omega} \, \cos n\omega \, \mathrm d\omega. \]
Lets construct two of this kernels.
psi1 = SO3vonMisesFisherKernel('halfwidth',15*degree)
psi2 = SO3vonMisesFisherKernel('halfwidth',20*degree)
plot(psi1)
hold on
plot(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')psi1 = SO3vonMisesFisherKernel
bandwidth: 18
halfwidth: 15°
psi2 = SO3vonMisesFisherKernel
bandwidth: 14
halfwidth: 20°
Here the parameter \(\kappa\) is \(20.34\) for function \(\psi_1\) and \(11.49\) in function \(\psi_2\).
We also take a look at the Fourier coefficients
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')
The Gauss Weierstrass Kernel
The Gauss Weierstrass kernel \(\psi_{\kappa}\in L^2(\mathcal{SO}(3))\) is a nonnegative function depending on a parameter \(\kappa>0\) and is defined by its Chebyshev series
\[ \psi_{\kappa}(t) = \sum\limits_{n=0}^{\infty} (2n+1) \, \mathrm e^{-n(n+1)\kappa} \, \mathcal U_{2n}(t).\]
Lets construct two of them by the parameter \(\kappa\).
psi1 = SO3GaussWeierstrassKernel(0.025)
psi2 = SO3GaussWeierstrassKernel(0.045)
plot(psi1)
hold on
plot(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')psi1 = SO3GaussWeierstrassKernel
bandwidth: 17
halfwidth: 15°
psi2 = SO3GaussWeierstrassKernel
bandwidth: 13
halfwidth: 20°
We also take a look at the Fourier coefficients
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('halfwidth = 15°','halfwidth = 20°')
The Sobolev Kernel
The Sobolev kernel \(\psi_{s}\in L^2(\mathcal{SO}(3))\) is a radial symmetric kernel function depending on a parameter \(s\) and is defined by its Chebyshev series
\[ \psi_s(t) = \sum\limits_{n=0}^{\infty} (2n+1)\, (n(n+1))^s \, \mathcal U_{2n}(t). \]
Lets construct two of them by the parameter \(s\) and bandwidth 15.
psi1 = SO3SobolevKernel(1,'bandwidth',15)
psi2 = SO3SobolevKernel(1.2,'bandwidth',15)
plot(psi1)
hold on
plot(psi2)
hold off
legend('s = 1','s = 1.2')psi1 = SO3SobolevKernel
bandwidth: 15
halfwidth: 8.1°
psi2 = SO3SobolevKernel
bandwidth: 15
halfwidth: 8°
We also take a look at the Fourier coefficients
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('s = 1','s = 1.2')
The Laplace Kernel
The Laplace kernel \(\psi\in L^2(\mathcal{SO}(3))\) is a radial symmetric kernel function which is defined by its Chebyshev series
\[ \psi(t) = \sum\limits_{n=0}^{\infty} \frac{(2n+1)}{4\,n^2\,(2n+2)^2} \, \mathcal U_{2n}(t). \]
psi = SO3LaplaceKernel
plot(psi)psi = SO3LaplaceKernel
bandwidth: 4
halfwidth: 55°
We also take a look at the Fourier coefficients
plotSpektra(psi)
The Squared Singularity Kernel
The squared singularity kernel \(\psi_{\kappa}\in L^2(\mathcal{SO}(3))\) is a nonnegative function depending on a parameter \(\kappa\in(0,1)\) and is defined by its Chebyshev series
\[ \psi_{\kappa}(t) = \sum\limits_{n=0}^{\infty} \hat{f}_n(\kappa) \, \mathcal U_{2n}(t). \]
where the Chebyshev coefficients follows a 3-term recursion
\(\hat{f}_0 = 1\)
\(\hat{f}_1 = \frac{1+\kappa^2}{2\kappa}-\frac1{\log\frac{1+\kappa}{1-\kappa}}\)
\(\hat{f}_n = \frac{(2n-3)(2n+1)(1+\kappa^2)}{(2n-1)(n-1)2\kappa} \, \hat{f}_{n-1}(\kappa)-\frac{2\kappa(n-2)(2n+1)}{2n-3} \, \hat{f}_{n-2}(\kappa)\).
Lets construct two of them by the parameter \(\kappa\).
psi1 = SO3SquareSingularityKernel(0.2)
psi2 = SO3SquareSingularityKernel(0.3)
plot(psi1)
hold on
plot(psi2)
hold off
legend('\kappa = 0.2','\kappa = 0.3')psi1 = SO3SquareSingularityKernel
bandwidth: 5
halfwidth: 78°
psi2 = SO3SquareSingularityKernel
bandwidth: 7
halfwidth: 55°
We also take a look at the Fourier coefficients
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('\kappa = 0.2','\kappa = 0.3')
The Bump kernel
The bump kernel \(\tilde\psi_r\in L^2(\mathcal{SO}(3))\) is a radial symmetric kernel function depending on a parameter \(r\in (0,\pi)\). The function value is 0, if the angle is greater then the halfwidth \(r\). Otherwise it is has a constant value, such that the mean of \(\psi_r\) on \(\mathcal{SO}(3)\) is 1. Hence we use the open set
\[U_r = \{ {\bf R} \in \mathcal{SO}(3) \,\vert ~ \lvert \omega( {\bf R})\rvert <r \}\]
and define the bump kernel by
\[ \tilde\psi_r( {\bf R}) = \frac1{\lvert U_r \rvert } \mathbf{1}_{ \{ {\bf R} \in U_r \} } \]
where \(\mathbf{1}\) is the indicator function.
The main problem of the bump kernel is that we need a lot of Chebyshev coefficients to describe it. That possibly can result in high runtimes.
psi1 = SO3BumpKernel(30*degree)
psi2 = SO3BumpKernel(40*degree)
plot(psi1)
hold on
plot(psi2)
hold off
legend('halfwidth = 30°','halfwidth = 40°')psi1 = SO3BumpKernel
bandwidth: 1024
halfwidth: 30°
psi2 = SO3BumpKernel
bandwidth: 1024
halfwidth: 40°
We also take a look at the Fourier coefficients
plotSpektra(psi1)
hold on
plotSpektra(psi2)
hold off
legend('halfwidth = 30°','halfwidth = 40°')