Time-frequency and preprocessing#
Range-Doppler processing assumes target Doppler is nearly stationary over one coherent processing interval. Micro-motion violates that assumption in useful ways: rotating wheels, limbs, and vibration create time-varying Doppler. The short-time Fourier transform (STFT) estimates a local spectrum,
where \(w\) is a window and \(H\) is the hop size. Smaller segments improve time localization; longer segments improve Doppler resolution. Overlap changes the sampling of time, not the information bandwidth.
from pyradar import rsp
spectrogram = rsp.micro_doppler_spectrogram(
slowTimeSignal,
radar=radar,
segmentLength=128,
overlap=112,
fftSize=512,
window="hann",
)
power = spectrogram.power
velocity = spectrogram.velocity # m/s, positive approaching
time = spectrogram.time # s
pyradar.rsp.stft() is the parameter-only form and returns two-sided
frequency coordinates. pyradar.rsp.micro_doppler_spectrogram() derives
the slow-time sample rate and velocity coordinate from Radar when supplied.
Zoom FFT#
Zero-padding samples a conventional DFT more densely but still computes the
entire Nyquist interval. pyradar.rsp.zoom_fft() uses the chirp z-transform
to evaluate only a requested frequency interval:
zoom = rsp.zoom_fft(
adc,
frequencyRange=(120e3, 180e3),
sampleRate=radar.sampler.sampleRate,
fftSize=2048,
axis=-1,
)
The interval is half-open by default, so adjacent intervals do not duplicate an endpoint. Zoom FFT improves frequency-grid spacing in the selected band; it does not surpass the waveform’s physical range resolution.
Composable preprocessing#
remove_static_clutter subtracts the coherent slow-time mean and therefore
places a notch at zero Doppler. It should be disabled when stationary targets
matter or the coherent interval is too short.
coherent_integrate sums complex samples and preserves phase gain. It requires
phase alignment. noncoherent_integrate sums magnitudes or powers and is safer
across incoherent channels at the cost of coherent processing gain. These are
parameter functions; pipeline defaults remain in
ProcessingConfig.