"""ECG signal resampling utilities."""from__future__importannotationsfrommathimportgcdimportnumpyasnpfromecgdatakit.modelsimportLead,LeadLikefromecgdatakit.processing._coreimportensure_lead,new_lead,require_scipy
[docs]defresample(lead:LeadLike,target_rate:int,*,fs:int|None=None)->Lead:"""Resample a lead to a different sample rate. Uses polyphase rational resampling (``scipy.signal.resample_poly``) which preserves signal content up to the Nyquist frequency of the lower sample rate. Parameters ---------- lead : Lead | NDArray[np.float64] Input ECG lead or raw signal array. target_rate : int Desired output sample rate in Hz. fs : int | None Sample rate in Hz. Required when *lead* is a numpy array. """lead=ensure_lead(lead,fs=fs)iftarget_rate<=0:raiseValueError(f"target_rate must be positive, got {target_rate}")iftarget_rate==lead.sampling_rate:returnnew_lead(lead,samples=lead.samples.copy())sig=require_scipy("signal")up=target_ratedown=lead.sampling_ratedivisor=gcd(up,down)up//=divisordown//=divisorresampled=sig.resample_poly(lead.samples,up,down).astype(np.float64)returnnew_lead(lead,samples=resampled,sampling_rate=target_rate)