Skip to content

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:

\[\mathbf{d}_c = G(S_c \circ \mathbf{x}), \quad c = 1, \ldots, N_c\]

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:

\[\hat{\mathbf{x}} = \sum_{c=1}^{N_c} S_c^* \circ (G^H \mathbf{d}_c)\]

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).