make_sms_pulse

Contents

make_sms_pulse#

pypulseqpp.make_sms_pulse()[source]#

Modulate one RF pulse into equispaced spectral bands.

The envelope is multiplied by sum(weights * exp(2j*pi*offsets*rf.t)), so band phases are referenced to the start of the shape, not its centre. The offsets always include 0 Hz; for an even band count the unpaired band goes on the positive-frequency side.

Parameters:
  • rf (RfEvent or SimpleNamespace) – Base pulse to modulate.

  • num_bands (int) – Number of bands, counting the on-resonance one.

  • band_offset (float) – Spacing between adjacent bands (Hz).

  • sideband_power (float or sequence of float, default=1.0) – Power, not amplitude, relative to the on-resonance band; weights take its square root. A scalar applies to every off-resonance band; a sequence gives one value per band, the on-resonance one included.

  • phases ({'quadratic', 'wong', 'malik'} or sequence of float, default=None) – Per-band phase (rad), lowest frequency first, or a schedule that keeps the peak down: Grissom’s quadratic one, Wong’s optimised table (3 to 16 bands) or Malik’s Hermitian one (4 to 12 bands). None leaves every band in phase.

Returns:

  • rf (RfEvent) – The modulated pulse.

  • offsets (numpy.ndarray) – Band offsets applied (Hz).

  • weights (numpy.ndarray) – Complex weight applied to each band.

Examples

>>> import numpy as np
>>> import pypulseqpp as pp
>>> system = pp.Opts(max_grad=40, grad_unit="mT/m", max_slew=150, slew_unit="T/m/s")
>>> base = pp.make_sinc_pulse(flip_angle=np.deg2rad(30), duration=2e-3, system=system)
>>> rf, offsets, weights = pp.make_sms_pulse(base, 3, 1000.0)
>>> offsets.tolist()
[-1000.0, 0.0, 1000.0]

See also

sim_rf

check where the bands actually land.