When processing non-uniformly spaced data in fields like MRI, radar, or geophysics, it’s crucial to use methods that can handle irregular sampling. In this blog, we discussed two important techniques: **Non-Uniform FFT (NUFFT)** and **Time-domain Sinc Interpolation** after regridding the data onto a uniform grid.

Here’s how we integrate both approaches using Python for practical applications.

### Step-by-Step Workflow: NUFFT and ResampleSINC Interpolation

**Simulate Non-Uniformly Sampled Data**: First, create a sinusoidal signal on a uniform grid, then sample it non-uniformly (like in MRI k-space).**Apply NUFFT**: Use NUFFT to handle the non-uniform data directly.**Regrid Non-Uniform Data to Uniform Grid**: Use interpolation methods like`interp1d`

to map the data to a uniform grid.**Apply ResampleSINC**: Use the`resampleSINC`

function for precise interpolation onto the uniform grid.

Let’s look at the complete Python code:

```
import numpy as np
import matplotlib.pyplot as plt
from pynufft import NUFFT
from scipy import interpolate
# Step 1: Generate a signal on a uniform grid
N = 256 # Number of points in the signal
x = np.linspace(0, 2*np.pi, N)
signal = np.sin(5*x) + np.sin(15*x) # A test signal with two frequencies
# Step 2: Simulate non-uniform sampling
non_uniform_grid = np.sort(np.random.rand(N) * 2 * np.pi)
# Step 3: Perform NUFFT
nufft = NUFFT()
nufft.plan(non_uniform_grid, (N,), (256,))
signal_non_uniform = np.interp(non_uniform_grid, x, signal)
nufft_transform = nufft.forward(signal_non_uniform)
# Step 4: Regrid non-uniform data onto uniform grid using cubic interpolation
uniform_grid = np.linspace(0, 2*np.pi, N)
regridded_signal = interpolate.interp1d(non_uniform_grid, signal_non_uniform, kind='cubic')(uniform_grid)
# Step 5: Apply ResampleSINC for precise interpolation
def resampleSINC(signal, x, u):
"""
Resample a signal using sinc interpolation in time domain
Parameters:
- signal : original signal on non-uniform grid
- x : non-uniform grid
- u : uniform grid to resample onto
Returns:
- interpolated_signal : the resampled signal on the uniform grid
"""
interpolated_signal = np.zeros_like(u)
for i in range(len(u)):
interpolated_signal[i] = np.sum(signal * np.sinc((u[i] - x) / (x[1] - x[0])))
return interpolated_signal
# Apply ResampleSINC on regridded signal
sinc_interpolated_signal = resampleSINC(regridded_signal, uniform_grid, uniform_grid)
# Step 6: Plot the results
plt.figure(figsize=(12, 6))
# Original and Non-Uniform Sampled Signal
plt.subplot(1, 2, 1)
plt.plot(x, signal, label='Original Signal')
plt.scatter(non_uniform_grid, signal_non_uniform, color='red', label='Non-uniform Samples')
plt.legend()
plt.title('Original and Non-Uniformly Sampled Signal')
# Sinc Interpolated Signal
plt.subplot(1, 2, 2)
plt.plot(x, signal, label='Original Signal')
plt.plot(uniform_grid, sinc_interpolated_signal, label='Sinc Interpolated Signal', linestyle='dashed')
plt.legend()
plt.title('Sinc Interpolation after Regridding')
plt.show()
```

### Workflow Breakdown

**Simulate Non-Uniform Sampling**: We create a simple sinusoidal signal on a uniform grid and simulate non-uniform sampling, common in MRI k-space.**Regrid to Uniform Grid**: Using cubic interpolation (`interp1d`

from`scipy`

), we map the non-uniform samples onto a uniform grid to facilitate subsequent operations like FFT or interpolation.**ResampleSINC**: The`resampleSINC`

function is applied after regridding to precisely interpolate the signal onto a uniform grid. This technique uses sinc interpolation, which is ideal for band-limited signals when applied to uniformly spaced data.**Plot Results**: We visualize the original, non-uniform samples, and the signal reconstructed using sinc interpolation. As seen in the plot, the sinc-interpolated signal closely follows the original signal, providing an accurate reconstruction.

### Conclusion

When working with non-uniformly spaced data, especially in fields like MRI or geophysics, it’s essential to use the right tools to process and reconstruct the signal. This blog demonstrated two key techniques:

**NUFFT**allows direct handling of non-uniform data without interpolation, providing accurate frequency-domain transforms.**ResampleSINC**is ideal for signal reconstruction after regridding non-uniform data to a uniform grid, ensuring minimal distortion.

These methods, when used together, offer a powerful solution for handling non-uniformly sampled signals. By first regridding and then applying sinc interpolation, you ensure your final signal is both smooth and faithful to the original data.

### Reference

Dr. Erol Kalkan, P.E. (2024). Time-domain Sinc Interpolation (Resampling) (https://www.mathworks.com/matlabcentral/fileexchange/59027-time-domain-sinc-interpolation-resampling), MATLAB Central File Exchange. Retrieved September 17, 2024.

If you’re dealing with non-uniform sampling in your field, contact QuakeLogic today for advanced solutions at info@quakelogic.net.

Let us show you how our state-of-the-art technologies can transform your signal processing workflows.

### Discover more from QuakeLogic

Subscribe to get the latest posts sent to your email.