SENSE¶
template <typename T1, typename Tobj> class SENSE
Multi-coil sensitivity encoding (SENSE) operator.
Wraps any encoding operator Tobj with per-coil sensitivity maps to form
the full multi-coil signal model:
where \(S_c\) is the sensitivity map for coil \(c\), \(\circ\) denotes element-wise
multiplication, and \(G\) is the encoding operator (template parameter Tobj).
The full data vector stacks all coils: \(\mathbf{d} = [\mathbf{d}_1^T, \ldots, \mathbf{d}_{N_c}^T]^T\).
Forward (per coil):
graph LR
X["$$\mathbf{x}$$"] --> SM["$$S_c \circ \mathbf{x}$$"]
SM --> G["$$G$$"]
G --> D["$$\mathbf{d}_c$$"]
Adjoint (combine coils):
graph RL
D1["$$\mathbf{d}_1$$"] --> GH1["$$G^H$$"]
D2["$$\mathbf{d}_2$$"] --> GH2["$$G^H$$"]
DN["$$\mathbf{d}_{N_c}$$"] --> GHN["$$G^H$$"]
GH1 --> SC1["$$S_1^* \circ$$"]
GH2 --> SC2["$$S_2^* \circ$$"]
GHN --> SCN["$$S_{N_c}^* \circ$$"]
SC1 --> SUM["$$\sum$$"]
SC2 --> SUM
SCN --> SUM
SUM --> XH["$$\hat{\mathbf{x}}$$"]
Use S * x for the forward transform and S / d for the adjoint.
The adjoint sums over all coils:
where \(S_c^*\) is the complex conjugate of the sensitivity map and \(G^H\) is the adjoint encoding operator.
Tobj must support operator* (forward) and operator/ (adjoint).
Compatible types: Gdft, Gnufft, Gfft, TimeSegmentation.
Gnufft<float> G(n1, 2.0f, Nx, Ny, Nz, kx, ky, kz, ix, iy, iz);
SENSE<float, Gnufft<float>> S(G, SMap, nc);
Col<cx_float> allcoil_data = S * image; // forward: all coils
Col<cx_float> recon = S / allcoil_data; // adjoint: combined
See : Pruessmann et al., "SENSE: Sensitivity Encoding for Fast MRI," MRM, 1999. https://doi.org/10.1002/(SICI)1522-2594(199911)42:5<952::AID-MRM16>3.0.CO;2-S
See : pcSENSE
See : TimeSegmentation
T1
: Floating-point precision type (float or double).
Tobj
: Encoding operator type (e.g., Gdft<T1>, Gnufft<T1>,
TimeSegmentation<T1, Gnufft<T1>>).
Variables¶
| Name | Description |
|---|---|
| G_obj | Number of k-space samples per coil (output length per coil). |
| SMap | Sensitivity maps matrix, size n2 x nc (single source of truth, GPU-ready). |
| conjSMap | Conjugate sensitivity maps matrix, size n2 x nc. |
| outData_pg | Mutable scratch buffer for forward-transform output (size n1 x nc). |
| outImg_pg | Mutable scratch buffer for adjoint-transform output (size n2 x 1). |
Operators¶
| Name | Description |
|---|---|
| operator* | Forward SENSE transform: image -> stacked multi-coil k-space. Returns a vector of length n1nc with coil data concatenated as [coil0_data; coil1_data; ...; coil_{nc-1}_data]. d : Input image vector of length n2. Return : Output k-space vector of length n1nc. |
| operator/ | Adjoint SENSE transform: stacked multi-coil k-space -> image. Applies the adjoint of each coil operator, weights by the conjugate sensitivity map, and sums across coils. d : Input k-space vector of length n1nc. Return* : Output image vector of length n2. |
| operator* | Forward SENSE transform (forgeCol overload for Metal path). |
| operator/ | Adjoint SENSE transform (forgeCol overload for Metal path). |
Functions¶
| Name | Description |
|---|---|
| SENSE | Default constructor. |
| SENSE | Construct a SENSE operator from a single-coil operator and sensitivity maps. |
Variable Details¶
G_obj¶
Tobj* G_obj
Number of k-space samples per coil (output length per coil).
Number of image pixels (input length of forward transform).
Number of receiver coils.
Pointer to the underlying single-coil encoding operator.
SMap¶
forgeMat<forgeComplex<T1>> SMap
Sensitivity maps matrix, size n2 x nc (single source of truth, GPU-ready).
conjSMap¶
forgeMat<forgeComplex<T1>> conjSMap
Conjugate sensitivity maps matrix, size n2 x nc.
outData_pg¶
mutable forgeMat<forgeComplex<T1>> outData_pg
Mutable scratch buffer for forward-transform output (size n1 x nc).
outImg_pg¶
mutable forgeMat<forgeComplex<T1>> outImg_pg
Mutable scratch buffer for adjoint-transform output (size n2 x 1).
Operator Details¶
operator*¶
Col<CxT1> operator*(const Col<CxT1>& d) const
Forward SENSE transform: image -> stacked multi-coil k-space.
Returns a vector of length n1*nc with coil data concatenated as [coil0_data; coil1_data; ...; coil_{nc-1}_data].
d
: Input image vector of length n2.
Return : Output k-space vector of length n1*nc.
forgeCol<forgeComplex<T1>> operator*(const forgeCol<forgeComplex<T1>>& d) const
Forward SENSE transform (forgeCol overload for Metal path).
d
: Input image vector of length n2.
Return : Output k-space vector of length n1*nc.
operator/¶
Col<CxT1> operator/(const Col<CxT1>& d) const
Adjoint SENSE transform: stacked multi-coil k-space -> image.
Applies the adjoint of each coil operator, weights by the conjugate sensitivity map, and sums across coils.
d
: Input k-space vector of length n1*nc.
Return
: Output image vector of length n2.
forgeCol<forgeComplex<T1>> operator/(const forgeCol<forgeComplex<T1>>& d) const
Adjoint SENSE transform (forgeCol overload for Metal path).
d
: Input k-space vector of length n1*nc.
Return
: Output image vector of length n2.
Function Details¶
SENSE¶
SENSE()
Default constructor. Produces an uninitialized operator.
SENSE(Tobj& G, Col<CxT1> SENSEmap, uword a, uword b, uword c)
Construct a SENSE operator from a single-coil operator and sensitivity maps.
G
: Single-coil encoding operator (e.g., Gdft or Gnufft).
SENSEmap
: Sensitivity maps as a flat column vector of length n2*nc,
ordered as [coil0_pixel0, coil0_pixel1, ..., coil1_pixel0, ...].
a
: Number of k-space samples per coil (n1).
b
: Number of image pixels (n2).
c
: Number of receiver coils (nc).