CuPy 信号处理模块 cupyx.scipy.signal 完全指南:卷积、滤波、滤波器设计与频谱分析的 GPU 加速 API 全景
【免费下载链接】cupyNumPy & SciPy for GPU项目地址: https://gitcode.com/GitHub_Trending/cu/cupy
本篇技术指南以 CuPy 仓库中cupyx.scipy.signal模块为核心,系统梳理其在 GPU 上实现的 SciPy 信号处理 API 全集,覆盖卷积与相关、B 样条、滤波、FIR/IIR 滤波器设计、LTI 系统、波形与窗函数、峰值检测、频谱分析以及 Chirp Z 变换等十四大功能类别。读完本文,你将掌握cupyx.scipy.signal各子模块的职责划分、核心函数的参数语义与底层实现原理,能够直接在 GPU 上完成从信号滤波、频谱估计到峰值定位的完整数据处理流水线,并与 SciPy 代码做到近乎无痛的迁移。
模块概览:与 scipy.signal 对齐的 GPU 实现
cupyx.scipy.signal是 CuPy 对 SciPy 信号处理模块scipy.signal的 GPU 移植,目标是与 SciPy API 保持一致的函数签名与语义,从而让既有的信号处理代码只需把import scipy.signal换成import cupyx.scipy.signal即可跑在 CUDA GPU(以及 ROCm/HIP 平台)上。官方参考文档将其与SciPy API Reference: Signal processing (scipy.signal)对齐,所有公开函数均以cupy.ndarray作为输入输出。
该模块的公开导出定义在 cupyx/scipy/signal/init.py 中,共约 180 个符号,按功能拆分到十余个实现文件中:
| 实现文件 | 功能职责 |
|---|---|
| _signaltools.py | 卷积/相关、经典滤波、Hilbert 变换等信号处理核心工具 |
| _bsplines.py | B 样条滤波与样条插值系数 |
| _splines.py | 对称 IIR 平滑滤波器symiirorder1/2 |
| _savitzky_golay.py | Savitzky-Golay 平滑/微分与系数 |
| _resample.py | 重采样、抽取(resample、resample_poly、decimate) |
| _fir_filter_design.py | FIR 设计(firwin、firwin2、firls、kaiser*) |
| _iir_filter_design.py | Matlab 风格 IIR 设计(butter、cheby1/2、ellip、iirdesign等) |
| _iir_filter_conversions.py | 滤波器表示转换与原型设计(zpk2tf、buttap、bilinear等) |
| _filter_design.py | 频率响应计算(freqz、freqs、group_delay) |
| _ltisys.py | 连续/离散 LTI 系统与时间/频率响应仿真 |
| _spectral.py | 功率谱估计与 STFT(welch、periodogram、stft等) |
| _peak_finding.py | 峰值定位(find_peaks、argrelmax等) |
| _wavelets.py | 连续小波(cwt、morlet、ricker等) |
| _waveforms.py | 波形发生器(chirp、square、sawtooth等) |
| _czt.py | Chirp Z 变换与 Zoom FFT |
| _upfirdn.py | 多相上/下采样滤波upfirdn |
| windows/ | 窗函数命名空间 |
说明:
scipy.signal中与统计、插值无关的纯数学辅助函数(如多项式根处理unique_roots、部分分式展开residue等)在 CuPy 中同样有对应实现,下文按官方文档分类逐一展开。
卷积与相关(Convolution)
本类是信号处理中最常用的运算集合,包含 9 个函数,全部实现在 _signaltools.py 中:
convolve(in1, in2, mode='full', method='auto'):N 维离散线性卷积;correlate(in1, in2, mode='full', method='auto'):N 维互相关;fftconvolve(in1, in2, mode='full', axes=None):基于 FFT 的卷积;oaconvolve(in1, in2, mode='full', axes=None):重叠相加(overlap-add)卷积;convolve2d(in1, in2, mode='full', boundary='fill', fillvalue=0)/correlate2d:二维卷积/相关,支持边界条件;sepfir2d(input, hrow, hcol):可分离二维 FIR 滤波(在 _bsplines.py 中);choose_conv_method(in1, in2, mode='full'):自动选择最快卷积方法;correlation_lags(in1_len, in2_len, mode='full'):计算卷积/相关结果的滞后(lag)索引。
mode 与 method 参数的语义
mode决定输出尺寸,与 SciPy 完全一致:
'full'(默认):完整离散线性卷积,输出尺寸为in1.shape + in2.shape - 1;'valid':仅输出不依赖零填充的元素,要求in1与in2在每个维度上至少一方不小于另一方;'same':输出与in1同尺寸,相对'full'输出居中。
method决定计算路径(见 convolve 源码):
'direct':直接按卷积定义求和;'fft':调用fftconvolve走频域相乘;'auto'(默认):调用choose_conv_method估算更快者。
从 _correlate 源码 可以看到实现细节:auto模式下会委托cupy._math.misc._choose_conv_method决策;走 FFT 路径时,相关运算会把in2做翻转并取共轭(_reverse(in2).conj())再执行fftconvolve;整数结果还会round()并还原类型。值得注意:choose_conv_method目前不支持 SciPy 的measure参数,也不保证与 SciPy 返回相同的选择结果——这是迁移时唯一需要留意的行为差异。
FFT 卷积与重叠相加
fftconvolve对大数组通常远快于直接法,但只能输出浮点结果(整型/对象输入会被转换为浮点)。其核心链路在 fftconvolve 源码:先校验输入,再在指定axes(默认全部维度)上构造x1 + x2 - 1的频域尺寸,调用_freq_domain_conv完成 FFT 相乘,最后按mode裁剪。
oaconvolve在一个输入远大于另一个时通常比fftconvolve更快,其实现(源码)把长输入切块做 FFT 卷积再重叠相加;若两输入形状相同则直接退化为fftconvolve,若切块后每个维度只有一个块同样回退到fftconvolve,避免无谓开销。
实战示例
import cupy as cp import cupyx.scipy.signal as signal x = cp.arange(1000, dtype=cp.float64) h = cp.array([0.25, 0.5, 0.25]) # 自动选择最快方法(direct / fft) y_full = signal.convolve(x, h, mode='full') # 长度 1002 y_same = signal.convolve(x, h, mode='same') # 长度 1000 y_valid = signal.convolve(x, h, mode='valid') # 长度 998 # 强制 FFT 路径,可指定参与卷积的轴 y_fft = signal.fftconvolve(x, h, mode='same') # 互相关滞后坐标 lags = signal.correlation_lags(x.size, h.size, mode='same') # 二维卷积,支持 boundary='fill' | 'wrap' | 'reflect' 等边界 img = cp.random.rand(64, 64) kernel = cp.ones((3, 3)) / 9.0 blurred = signal.convolve2d(img, kernel, mode='same', boundary='wrap')B 样条(B-Splines)
B 样条用于构造平滑插值/滤波的样条系数,包含 9 个函数,全部位于 _bsplines.py:
gauss_spline(x, n):高斯样条近似;cspline1d(signal, lamb=0.0):1D 三次样条系数(causal);qspline1d(signal, lamb=0.0):1D 二次样条系数;cspline2d/qspline2d:对应的 2D 版本;cspline1d_eval(csj, dx, x0=0.0, x1=None)/qspline1d_eval:在给定系数上求值;spline_filter(Iin, lmbda=5e-2):样条平滑滤波。
cspline1d返回的系数配合cspline1d_eval可对一维信号做三次样条插值;cspline2d/spline_filter常用于图像缩放与平滑。lamb是样条正则化参数,0 表示纯插值样条。样条系数计算在 CuPy 中仍运行在设备端,适合对大规模波形/图像做 GPU 插值预处理。
滤波(Filtering)
滤波类是模块中函数最多的类别(23 个),主要分布在 _signaltools.py、_resample.py、_savitzky_golay.py、_splines.py 与 _upfirdn.py 中。
经典 IIR/FIR 滤波:lfilter 与 sosfilt 家族
lfilter(b, a, x, axis=-1, zi=None):沿指定轴用 IIR/FIR 数字滤波器滤波,直接 II 型转置结构;lfiltic(b, a, y, x=None):由输入/输出初值构造lfilter的初始条件zi;lfilter_zi(b, a):计算阶跃响应的稳态初始状态;sosfilt(sos, x, axis=-1, zi=None):以级联二阶节(SOS)形式滤波,数值稳定性更好,官方推荐多数场景优先于lfilter;sosfilt_zi(sos)、sosfiltfilt(sos, x, axis=-1, padtype='odd', padlen=None):SOS 版初始条件与零相位正反向滤波;filtfilt(b, a, x, axis=-1, padtype='odd', padlen=None, method='pad', irlen=None):零相位正反向滤波。
lfilter的差分方程为a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M] - a[1]*y[n-1] - ... - a[N]*y[n-N],若a[0] != 1会自动归一化。CuPy 的实现(lfilter 源码)与 SciPy 的串行递推不同:它先计算 FIR 部分,再把 IIR 递推分块并行化——把输入切成m大小的块g_i,各块并行递推后用基于 (1,2,…,N) 斐波那契序列的修正因子表合并块间依赖(apply_iir与compute_correction_factors,见 _iir_utils.py)。该算法源自 Maleki & Burtscher 2018 年关于线性递推自动分层并行化的论文。
重要兼容性提示:由于并行化实现,lfilter的zi维度与 SciPy不一致,但只要zi由同一库(CuPy)产生并链式传递,最终输出结果一致。切勿把 SciPy 的zi直接传给 CuPy(反之亦然)。sosfilt同样接受 SOS 形式的zi。
import cupyx.scipy.signal as signal b, a = signal.butter(4, 0.2) # 4 阶 Butterworth 低通 x = cp.random.randn(8192) y, zf = signal.lfilter(b, a, x) # 返回输出与最终状态 y0 = signal.filtfilt(b, a, x) # 零相位滤波 sos = signal.butter(4, 0.2, output='sos') y1 = signal.sosfilt(sos, x)非线性与统计滤波
order_filter(a, domain, rank):顺序统计滤波(rank 阶域内值);medfilt(volume, kernel_size=None):中值滤波;medfilt2d(input, kernel_size=3):2D 中值滤波;wiener(im, mysize=None, noise=None):Wiener 去噪;savgol_filter(x, window_length, polyorder, deriv=0, delta=1.0, axis=-1, mode='interp', cval=0.0):Savitzky-Golay 平滑/微分;deconvolve(signal, divisor):反卷积(多项式除法);detrend(data, axis=-1, type='linear', bp=0, overwrite_data=False):去除线性/常数趋势;symiirorder1/symiirorder2:对称边界条件的 1/2 阶 IIR 平滑(_splines.py)。
Hilbert 变换与重采样
hilbert(x, N=None, axis=-1):解析信号(希尔伯特变换);hilbert2(x, N=None):二维解析信号;decimate(x, q, n=None, ftype='iir', axis=-1, zero_phase=True):抗混叠滤波后抽取;resample(x, num, t=None, axis=0, window=None):FFT 重采样到任意长度;resample_poly(x, up, down, axis=0, window=('kaiser', 5.0)):多相有理数倍重采样;upfirdn(h, x, up=1, down=1, axis=-1):FIR 滤波 + 上采样 + 抽取一步完成。
decimate默认使用 8 阶 Chebyshev I 型低通滤波器,ftype='fir'时使用 30 点 Hamming 窗 FIR;文档建议 IIR 抽取因子超过 13 时分多次调用decimate。resample_poly内部先用firwin设计原型 FIR 低通(截止频率取1/max(up, down),半长度10*max_rate,见 _resample.py),并先约去up/down的最大公约数以节省计算量。
滤波器设计(Filter design)
本类 26 个函数分布在 _filter_design.py、_fir_filter_design.py 与 _iir_filter_conversions.py 中,分为几组:
频率响应计算:freqz(b, a, worN=512, whole=False, plot=None, fs=6.283185307179586)、freqz_zpk、freqz_sos、sosfreqz计算数字滤波器频率响应;freqs、freqs_zpk计算模拟滤波器频率响应;findfreqs(num, den, N)生成等间隔频点;group_delay((b, a), w, whole=False, fs=6.283185307179586)计算群延迟。
FIR 设计:firwin(numtaps, cutoff, width=None, window='hamming', pass_zero=True, scale=True, nyq=None, fs=None)基于窗函数法设计 FIR;firwin2任意幅频响应 FIR;firls(numtaps, bands, desired, weight=None, nyq=None, fs=None)最小二乘 FIR;minimum_phase(h, method='homomorphic', n_fft=None)最小相位重构;savgol_coeffs计算 Savitzky-Golay 系数。
通用 IIR 设计:iirdesign(wp, ws, gpass, gstop, analog=False, ftype='ellip', output='ba', fs=None)与iirfilter(N, Wn, rp=None, rs=None, btype='band', analog=False, ftype='butter', output='ba', fs=None)。output支持'ba'(分子分母)、'zpk'(零点/极点/增益)、'sos'(二阶节),其中'sos'是数值稳定性最优的选择。
Kaiser 辅助:kaiser_atten(numtaps, width)、kaiser_beta(a)、kaiserord(ripple, width)三件套用于按阻带衰减/过渡带宽度估算 Kaiser 窗 FIR 的阶数与 β。
变换与展开:bilinear/bilinear_zpk(双线性变换)、unique_roots、residue/residez、invres/invresz(部分分式展开与反变换)、gammatone(听觉滤波)、BadCoefficients异常类。
# 用 Kaiser 窗设计带通 FIR:50 taps taps = signal.firwin(50, [0.1, 0.2], pass_zero=False, window='kaiser', fs=1.0) w, h = signal.freqz(taps, worN=1024) # 频率响应Matlab 风格 IIR 滤波器设计
本类 12 个函数实现经典滤波器原型设计,位于 _iir_filter_design.py:
butter(N, Wn, btype='low', analog=False, output='ba', fs=None):巴特沃斯最大平坦;cheby1(N, rp, Wn, btype='low', analog=False, output='ba', fs=None):Chebyshev I 型(通带等波纹,rp为通带纹波 dB);cheby2(N, rs, Wn, btype='low', analog=False, output='ba', fs=None):Chebyshev II 型(阻带等波纹,rs为阻带衰减 dB);ellip(N, rp, rs, Wn, btype='low', analog=False, output='ba', fs=None):椭圆(Cauer)滤波器;iircomb(w0, Q, ftype='notch', fs=2.0, *, pass_zero=False):梳状滤波器;iirnotch(w0, Q, fs=2.0)/iirpeak(w0, Q, fs=2.0):陷波/峰值滤波器(二者共用 _design_notch_peak_filter 内部实现);buttord、cheb1ord、cheb2ord、ellipord:按通带/阻带指标估算最小阶数。
通用参数:Wn为截止频率(fs给定时为 Hz,否则为 0~1 归一化频率;带通/带阻传二元组),btype支持'low' | 'high' | 'band' | 'bandpass' | 'stop',analog=True返回模拟原型,output可选'ba' | 'zpk' | 'sos'。iirfilter是这些函数的统一底层入口,butter等均为其便捷封装。
sos = signal.butter(4, [0.1, 0.3], btype='band', output='sos', fs=1.0) y = signal.sosfilt(sos, x) b, a = signal.iirnotch(0.25, Q=30, fs=1.0) # 在归一化频率 0.25 处陷波底层滤波器设计函数(Low-level filter design)
本类 15 个函数是滤波器设计的底层构件,位于 _iir_filter_conversions.py 与 _lti_conversion.py:
- 模拟原型:
buttap(N)、cheb1ap(N, rp)、cheb2ap(N, rs)、ellipap(N, rp, rs)返回各自原型的零点/极点/增益; - 频带变换:
lp2lp/lp2lp_zpk、lp2hp/lp2hp_zpk、lp2bp/lp2bp_zpk、lp2bs/lp2bs_zpk把归一化低通原型变换为低通/高通/带通/带阻; - 辅助:
abcd_normalize(A, B, C, D)(状态空间归一化)、band_stop_obj(带阻目标函数)、normalize(b, a)(分子分母归一化)。
这些函数通常由高层设计函数内部调用,但也可以直接用于自定义模拟滤波器设计流程,例如手动获取buttap(4)的零极点后自行做频带变换。
LTI 表示与表示转换
表示转换(12 个):zpk2tf、zpk2sos、zpk2ss、tf2zpk、tf2sos、tf2ss、ss2tf、ss2zpk、sos2tf、sos2zpk完成 传递函数(tf)/零极点增益(zpk)/二阶节(sos)/状态空间(ss)四种表示之间的相互转换;cont2discrete用零阶保持等方法把连续系统离散化;place_poles极点配置。SOS 形式因数值稳定性好,是滤波与仿真的推荐表示。
LTI 系统类:lti与dlti分别是连续/离散线性时不变系统工厂,StateSpace、TransferFunction、ZerosPolesGain三种具体表示类均可被自动转换并参与仿真。相关实现集中在 _ltisys.py。
连续时间线性系统
lsim(system, U, T, X0=None, interp=True)对任意输入激励做连续时间仿真;impulse/step计算脉冲/阶跃响应;freqresp计算频率响应;bode返回幅值/相位(dB 与度)。system可以是lti实例、(b, a)元组、(num, den)或(A, B, C, D)状态空间。典型用法:
sys = signal.lti([1.0], [1.0, 0.5, 1.0]) # 二阶连续系统 t, y = signal.step(sys) # 阶跃响应 t, y = signal.impulse(sys) # 脉冲响应 w, mag, phase = signal.bode(sys) # Bode 图数据离散时间线性系统
与连续版本一一对应:dlsim、dimpulse、dstep、dfreqresp、dbode,以及dlti工厂类与StateSpace/TransferFunction/ZerosPolesGain(离散语义)。离散系统的dt属性表示采样周期,dlti(*system, dt=1.0)显式传入即可:
dsys = signal.dlti([1.0], [1.0, -0.5], dt=0.01) n, y = signal.dstep(dsys) w, mag, phase = signal.dbode(dsys)波形生成(Waveforms)
_waveforms.py 提供测试/仿真常用波形,_max_len_seq.py 提供伪随机序列:
chirp(t, f0, t1, f1, method='linear', phi=0, vertex_zero=True):扫频信号,method支持'linear' | 'quadratic' | 'logarithmic' | 'hyperbolic';gausspulse(t, fc=1000, bw=0.5, bwr=-6, tpr=-60, retquad=False, retenv=False):高斯调制正弦脉冲;sawtooth(t, width=1)、square(t, duty=0.5):锯齿波/方波;unit_impulse(shape, idx=None, dtype=<class 'float'>):单位冲激;sweep_poly(t, poly, phi=0):多项式相位扫频;max_len_seq(nbits, state=None, length=None, taps=None):最大长度序列(m 序列)。
这些函数输出cupy.ndarray,可直接送入后续滤波/频谱分析流水线。
窗函数(Window functions)
窗函数统一放在独立的cupyx.scipy.signal.windows命名空间(详见 scipy_signal_windows.rst 与 windows/_windows.py),包括barthann、bartlett、blackman、blackmanharris、bohman、boxcar、chebwin、cosine、exponential、flattop、gaussian、general_cosine、general_gaussian、general_hamming、hamming、hann、kaiser、kaiser_bessel_derived、nuttall、parzen、taylor、triang、lanczos、tukey共 24 种。
在cupyx.scipy.signal顶层则提供按名称取窗的便捷函数get_window(window, Nx, fftbins=True):
from cupyx.scipy.signal import get_window w = get_window(('kaiser', 8.0), 512) # 带参数字典形式 w = get_window('hann', 512, fftbins=False)fftbins=True返回适合 FFT 的周期窗,False返回对称窗;窗函数常用于频谱估计(welch等)与 FIR 设计的加窗步骤。
小波(Wavelets)
_wavelets.py 提供连续小波变换相关函数:
morlet(M, s=1.0, w=5.0):Morlet 小波;morlet2(M, s, w=5.0):归一化 Morlet 小波(用于cwt);ricker(points, a):Ricker(墨西哥帽)小波;qmf(hk):正交镜像滤波器对系数;cwt(data, wavelet, widths, dtype=None, **kwargs):连续小波变换,沿宽度维做卷积。
widths = cp.arange(1, 31) cwtmatr = signal.cwt(x, signal.ricker, widths)峰值检测(Peak finding)
_peak_finding.py 提供信号峰值定位与特征提取工具:
find_peaks(x, height=None, threshold=None, distance=None, prominence=None, width=None, wlen=None, rel_height=0.5, plateau_size=None):按多种约束(高度/距离/显著性/宽度)找峰;peak_prominences(x, peaks, wlen=None):计算每个峰的显著性(prominence);peak_widths(x, peaks, rel_height=0.5, prominence_data=None, wlen=None):计算峰的宽度;argrelmin(data, order=1, axis=-1, mode='clip')/argrelmax/argrelextrema(data, comparator, axis=0, order=1, mode='clip'):基于局部比较器的相对极值定位(order为比较邻域半径)。
find_peaks是 ECG 心率检测、光谱寻峰等场景的主力工具,支持多条件组合过滤:
peaks, props = signal.find_peaks(x, height=0.5, distance=10, prominence=0.3, width=2)频谱分析(Spectral analysis)
_spectral.py 实现功率谱估计与短时傅里叶变换家族,均以fs(采样率)、window、nperseg(分段长度)、noverlap(重叠长度)为主要参数:
periodogram(x, fs=1.0, window='boxcar', nfft=None, detrend='constant', return_onesided=True, scaling='density', axis=-1):经典周期图;welch(x, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None, detrend='constant', return_onesided=True, scaling='density', axis=-1, average='mean'):Welch 平均周期图(分段 + 加窗 + 平均,方差更小);csd:互功率谱密度;coherence(x, y, ...):幅度平方相干;spectrogram:时频图;vectorstrength(events, period):事件相位矢量强度;lombscargle(x, y, freqs, precenter=False, normalize=False):非均匀采样 Lomb-Scargle 周期图;stft(x, fs=1.0, window='hann', nperseg=256, noverlap=None, nfft=None, detrend=False, return_onesided=True, boundary='zeros', padded=True, axis=-1)与istft:短时傅里叶变换与逆变换;check_COLA(window, nperseg, noverlap, tol=1e-10)/check_NOLA(window, nperseg, noverlap, tol=1e-10):校验窗函数是否满足常数重叠相加(COLA)/非零重叠相加(NOLA)条件——stft与istft完美重建的前提。
f, Pxx = signal.welch(x, fs=128.0, nperseg=256) # 功率谱 f, t, Zxx = signal.stft(x, fs=128.0, nperseg=256) # 时频分析 t, xr = signal.istft(Zxx, fs=128.0) # 逆变换重建 assert signal.check_COLA('hann', 256, 128) # 校验 COLA 条件这些函数内部依赖cupyx.scipy.fft的 GPU FFT 实现(见 _spectral.py 导入),对长信号、大批量频谱估计场景可获得显著的加速收益。
Chirp Z 变换与 Zoom FFT
_czt.py 提供 CZT 相关接口,__init__.py中以from cupyx.scipy.signal._czt import *全量导出:
czt(x, m=None, w=None, a=None):Chirp Z 变换,可在任意圆弧上计算 Z 变换采样点;czt_points(m, w=None, a=None):生成 CZT 采样点坐标;zoom_fft(x, fn, m=None, fs=2, endpoint=False, axis=-1):Zoom FFT——只在目标频段做高分辨率 DFT;CZT/ZoomFFT:可复用(预计算蝶形系数)的类封装,多次对不同信号做同一频段分析时可显著节省开销。
Zoom FFT 的应用场景是"先粗看全局、再对感兴趣频段细看",例如在密集频谱中分辨相距很近的两个峰:
zoomer = signal.ZoomFFT(n=x.size, fn=[0.1, 0.2], fs=1.0, m=4096) spec = zoomer(x) # 仅计算 [0.1, 0.2] 频段的 4096 点谱与 SciPy 的兼容性与注意事项
迁移到cupyx.scipy.signal时,除了在开头把导入改为import cupyx.scipy.signal as signal、把数据放入cupy.ndarray外,需要留意以下已确认的差异:
lfilter的zi维度与 SciPy 不同:CuPy 的并行 IIR 实现决定了状态向量的组织方式不同(源码注释)。务必保持zi来自同一库,不要跨库混用;choose_conv_method不支持measure参数,且不保证与 SciPy 返回相同的方法选择(源码警告);- 整数输入在 FFT 路径下会被转换为浮点(
fftconvolve、oaconvolve),_correlate会对整数结果做round()还原; convolve/correlate的auto决策基于 CuPy 预计算值,与 SciPy 的实测耗时决策可能不同,但两者结果数值一致。
测试验证与进一步探索
该模块的行为正确性由仓库内大量测试保障,测试位于 tests/cupyx_tests/scipy_tests/ 目录下,覆盖卷积、滤波、频谱、峰值检测等各类别,例如test_signaltools.py、test_spectral.py、test_peak_finding.py等;这些测试通常直接与 SciPy 的参考结果逐元素对比。如果你需要确认某个具体函数的参数细节,推荐按如下顺序阅读:
- cupyx/scipy/signal/init.py:查看导出与模块归属;
- 对应实现文件(上表已列出):查看 docstring 中的完整参数说明与
See Also交叉引用; - tests/cupyx_tests/scipy_tests/ 下的同名测试:查看可运行的调用示例与数值对比方式。
至此,从卷积、滤波、滤波器设计到 LTI 仿真、峰值检测与频谱分析的 GPU 加速信号处理全链路,你都可以直接在cupyx.scipy.signal中完成,并借助 CuPy 的cupy.ndarray生态与 FFT 后端获得设备端吞吐。
【免费下载链接】cupyNumPy & SciPy for GPU项目地址: https://gitcode.com/GitHub_Trending/cu/cupy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考