def METHOD_NAME(self, signal):
    """
    Compute the NUFFT transform using this plan instance.
    :param signal: Signal to be transformed. For a single transform,
        this should be a a 1, 2, or 3D array matching the plan `sz`.
        For a batch, signal should have shape `(ntransforms, *sz)`.
    :returns: Transformed signal of shape `num_pts` or
        `(ntransforms, num_pts)`.
    """
    sig_frame_shape = signal.shape
    # Note, there is a corner case for ntransforms == 1.
    if self.ntransforms > 1 or (
        self.ntransforms == 1 and len(signal.shape) == self.dim + 1
    ):
        assert (
            len(signal.shape) == self.dim + 1
        ), f"For multiple transforms, {self.dim}D signal should be a {self.ntransforms} element stack of {self.sz}."
        assert (
            signal.shape[0] == self.ntransforms
        ), "For multiple transforms, signal stack length should match ntransforms {self.ntransforms}."
        sig_frame_shape = signal.shape[1:]
        # finufft expects signal.ndim == dim for ntransforms = 1.
        if self.ntransforms == 1:
            signal = signal.reshape(self.sz)
    assert (
        sig_frame_shape == self.sz
    ), f"Signal frame to be transformed must have shape {self.sz}"
    # FINUFFT was designed for a complex input array
    signal = np.array(signal, copy=False, dtype=self.complex_dtype, order="C")
    result = self._transform_plan.execute(signal)
    return result