
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.pyB 样条滤波与样条插值系数_splines.py对称 IIR 平滑滤波器symiirorder1/2_savitzky_golay.pySavitzky-Golay 平滑/微分与系数_resample.py重采样、抽取resample、resample_poly、decimate_fir_filter_design.pyFIR 设计firwin、firwin2、firls、kaiser*_iir_filter_design.pyMatlab 风格 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功率谱估计与 STFTwelch、periodogram、stft等_peak_finding.py峰值定位find_peaks、argrelmax等_wavelets.py连续小波cwt、morlet、ricker等_waveforms.py波形发生器chirp、square、sawtooth等_czt.pyChirp Z 变换与 Zoom FFT_upfirdn.py多相上/下采样滤波upfirdnwindows/窗函数命名空间说明scipy.signal中与统计、插值无关的纯数学辅助函数如多项式根处理unique_roots、部分分式展开residue等在 CuPy 中同样有对应实现下文按官方文档分类逐一展开。卷积与相关Convolution本类是信号处理中最常用的运算集合包含 9 个函数全部实现在 _signaltools.py 中convolve(in1, in2, modefull, methodauto)N 维离散线性卷积correlate(in1, in2, modefull, methodauto)N 维互相关fftconvolve(in1, in2, modefull, axesNone)基于 FFT 的卷积oaconvolve(in1, in2, modefull, axesNone)重叠相加overlap-add卷积convolve2d(in1, in2, modefull, boundaryfill, fillvalue0)/correlate2d二维卷积/相关支持边界条件sepfir2d(input, hrow, hcol)可分离二维 FIR 滤波在 _bsplines.py 中choose_conv_method(in1, in2, modefull)自动选择最快卷积方法correlation_lags(in1_len, in2_len, modefull)计算卷积/相关结果的滞后lag索引。mode 与 method 参数的语义mode决定输出尺寸与 SciPy 完全一致full默认完整离散线性卷积输出尺寸为in1.shape in2.shape - 1valid仅输出不依赖零填充的元素要求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, dtypecp.float64) h cp.array([0.25, 0.5, 0.25]) # 自动选择最快方法direct / fft y_full signal.convolve(x, h, modefull) # 长度 1002 y_same signal.convolve(x, h, modesame) # 长度 1000 y_valid signal.convolve(x, h, modevalid) # 长度 998 # 强制 FFT 路径可指定参与卷积的轴 y_fft signal.fftconvolve(x, h, modesame) # 互相关滞后坐标 lags signal.correlation_lags(x.size, h.size, modesame) # 二维卷积支持 boundaryfill | wrap | reflect 等边界 img cp.random.rand(64, 64) kernel cp.ones((3, 3)) / 9.0 blurred signal.convolve2d(img, kernel, modesame, boundarywrap)B 样条B-SplinesB 样条用于构造平滑插值/滤波的样条系数包含 9 个函数全部位于 _bsplines.pygauss_spline(x, n)高斯样条近似cspline1d(signal, lamb0.0)1D 三次样条系数causalqspline1d(signal, lamb0.0)1D 二次样条系数cspline2d/qspline2d对应的 2D 版本cspline1d_eval(csj, dx, x00.0, x1None)/qspline1d_eval在给定系数上求值spline_filter(Iin, lmbda5e-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, ziNone)沿指定轴用 IIR/FIR 数字滤波器滤波直接 II 型转置结构lfiltic(b, a, y, xNone)由输入/输出初值构造lfilter的初始条件zilfilter_zi(b, a)计算阶跃响应的稳态初始状态sosfilt(sos, x, axis-1, ziNone)以级联二阶节SOS形式滤波数值稳定性更好官方推荐多数场景优先于lfiltersosfilt_zi(sos)、sosfiltfilt(sos, x, axis-1, padtypeodd, padlenNone)SOS 版初始条件与零相位正反向滤波filtfilt(b, a, x, axis-1, padtypeodd, padlenNone, methodpad, irlenNone)零相位正反向滤波。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, outputsos) y1 signal.sosfilt(sos, x)非线性与统计滤波order_filter(a, domain, rank)顺序统计滤波rank 阶域内值medfilt(volume, kernel_sizeNone)中值滤波medfilt2d(input, kernel_size3)2D 中值滤波wiener(im, mysizeNone, noiseNone)Wiener 去噪savgol_filter(x, window_length, polyorder, deriv0, delta1.0, axis-1, modeinterp, cval0.0)Savitzky-Golay 平滑/微分deconvolve(signal, divisor)反卷积多项式除法detrend(data, axis-1, typelinear, bp0, overwrite_dataFalse)去除线性/常数趋势symiirorder1/symiirorder2对称边界条件的 1/2 阶 IIR 平滑_splines.py。Hilbert 变换与重采样hilbert(x, NNone, axis-1)解析信号希尔伯特变换hilbert2(x, NNone)二维解析信号decimate(x, q, nNone, ftypeiir, axis-1, zero_phaseTrue)抗混叠滤波后抽取resample(x, num, tNone, axis0, windowNone)FFT 重采样到任意长度resample_poly(x, up, down, axis0, window(kaiser, 5.0))多相有理数倍重采样upfirdn(h, x, up1, down1, axis-1)FIR 滤波 上采样 抽取一步完成。decimate默认使用 8 阶 Chebyshev I 型低通滤波器ftypefir时使用 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, worN512, wholeFalse, plotNone, fs6.283185307179586)、freqz_zpk、freqz_sos、sosfreqz计算数字滤波器频率响应freqs、freqs_zpk计算模拟滤波器频率响应findfreqs(num, den, N)生成等间隔频点group_delay((b, a), w, wholeFalse, fs6.283185307179586)计算群延迟。FIR 设计firwin(numtaps, cutoff, widthNone, windowhamming, pass_zeroTrue, scaleTrue, nyqNone, fsNone)基于窗函数法设计 FIRfirwin2任意幅频响应 FIRfirls(numtaps, bands, desired, weightNone, nyqNone, fsNone)最小二乘 FIRminimum_phase(h, methodhomomorphic, n_fftNone)最小相位重构savgol_coeffs计算 Savitzky-Golay 系数。通用 IIR 设计iirdesign(wp, ws, gpass, gstop, analogFalse, ftypeellip, outputba, fsNone)与iirfilter(N, Wn, rpNone, rsNone, btypeband, analogFalse, ftypebutter, outputba, fsNone)。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 窗设计带通 FIR50 taps taps signal.firwin(50, [0.1, 0.2], pass_zeroFalse, windowkaiser, fs1.0) w, h signal.freqz(taps, worN1024) # 频率响应Matlab 风格 IIR 滤波器设计本类 12 个函数实现经典滤波器原型设计位于 _iir_filter_design.pybutter(N, Wn, btypelow, analogFalse, outputba, fsNone)巴特沃斯最大平坦cheby1(N, rp, Wn, btypelow, analogFalse, outputba, fsNone)Chebyshev I 型通带等波纹rp为通带纹波 dBcheby2(N, rs, Wn, btypelow, analogFalse, outputba, fsNone)Chebyshev II 型阻带等波纹rs为阻带衰减 dBellip(N, rp, rs, Wn, btypelow, analogFalse, outputba, fsNone)椭圆Cauer滤波器iircomb(w0, Q, ftypenotch, fs2.0, *, pass_zeroFalse)梳状滤波器iirnotch(w0, Q, fs2.0)/iirpeak(w0, Q, fs2.0)陷波/峰值滤波器二者共用 _design_notch_peak_filter 内部实现buttord、cheb1ord、cheb2ord、ellipord按通带/阻带指标估算最小阶数。通用参数Wn为截止频率fs给定时为 Hz否则为 0~1 归一化频率带通/带阻传二元组btype支持low | high | band | bandpass | stopanalogTrue返回模拟原型output可选ba | zpk | sos。iirfilter是这些函数的统一底层入口butter等均为其便捷封装。sos signal.butter(4, [0.1, 0.3], btypeband, outputsos, fs1.0) y signal.sosfilt(sos, x) b, a signal.iirnotch(0.25, Q30, fs1.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, X0None, interpTrue)对任意输入激励做连续时间仿真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, dt1.0)显式传入即可dsys signal.dlti([1.0], [1.0, -0.5], dt0.01) n, y signal.dstep(dsys) w, mag, phase signal.dbode(dsys)波形生成Waveforms_waveforms.py 提供测试/仿真常用波形_max_len_seq.py 提供伪随机序列chirp(t, f0, t1, f1, methodlinear, phi0, vertex_zeroTrue)扫频信号method支持linear | quadratic | logarithmic | hyperbolicgausspulse(t, fc1000, bw0.5, bwr-6, tpr-60, retquadFalse, retenvFalse)高斯调制正弦脉冲sawtooth(t, width1)、square(t, duty0.5)锯齿波/方波unit_impulse(shape, idxNone, dtypeclass float)单位冲激sweep_poly(t, poly, phi0)多项式相位扫频max_len_seq(nbits, stateNone, lengthNone, tapsNone)最大长度序列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, fftbinsTrue)from cupyx.scipy.signal import get_window w get_window((kaiser, 8.0), 512) # 带参数字典形式 w get_window(hann, 512, fftbinsFalse)fftbinsTrue返回适合 FFT 的周期窗False返回对称窗窗函数常用于频谱估计welch等与 FIR 设计的加窗步骤。小波Wavelets_wavelets.py 提供连续小波变换相关函数morlet(M, s1.0, w5.0)Morlet 小波morlet2(M, s, w5.0)归一化 Morlet 小波用于cwtricker(points, a)Ricker墨西哥帽小波qmf(hk)正交镜像滤波器对系数cwt(data, wavelet, widths, dtypeNone, **kwargs)连续小波变换沿宽度维做卷积。widths cp.arange(1, 31) cwtmatr signal.cwt(x, signal.ricker, widths)峰值检测Peak finding_peak_finding.py 提供信号峰值定位与特征提取工具find_peaks(x, heightNone, thresholdNone, distanceNone, prominenceNone, widthNone, wlenNone, rel_height0.5, plateau_sizeNone)按多种约束高度/距离/显著性/宽度找峰peak_prominences(x, peaks, wlenNone)计算每个峰的显著性prominencepeak_widths(x, peaks, rel_height0.5, prominence_dataNone, wlenNone)计算峰的宽度argrelmin(data, order1, axis-1, modeclip)/argrelmax/argrelextrema(data, comparator, axis0, order1, modeclip)基于局部比较器的相对极值定位order为比较邻域半径。find_peaks是 ECG 心率检测、光谱寻峰等场景的主力工具支持多条件组合过滤peaks, props signal.find_peaks(x, height0.5, distance10, prominence0.3, width2)频谱分析Spectral analysis_spectral.py 实现功率谱估计与短时傅里叶变换家族均以fs采样率、window、nperseg分段长度、noverlap重叠长度为主要参数periodogram(x, fs1.0, windowboxcar, nfftNone, detrendconstant, return_onesidedTrue, scalingdensity, axis-1)经典周期图welch(x, fs1.0, windowhann, npersegNone, noverlapNone, nfftNone, detrendconstant, return_onesidedTrue, scalingdensity, axis-1, averagemean)Welch 平均周期图分段 加窗 平均方差更小csd互功率谱密度coherence(x, y, ...)幅度平方相干spectrogram时频图vectorstrength(events, period)事件相位矢量强度lombscargle(x, y, freqs, precenterFalse, normalizeFalse)非均匀采样 Lomb-Scargle 周期图stft(x, fs1.0, windowhann, nperseg256, noverlapNone, nfftNone, detrendFalse, return_onesidedTrue, boundaryzeros, paddedTrue, axis-1)与istft短时傅里叶变换与逆变换check_COLA(window, nperseg, noverlap, tol1e-10)/check_NOLA(window, nperseg, noverlap, tol1e-10)校验窗函数是否满足常数重叠相加COLA/非零重叠相加NOLA条件——stft与istft完美重建的前提。f, Pxx signal.welch(x, fs128.0, nperseg256) # 功率谱 f, t, Zxx signal.stft(x, fs128.0, nperseg256) # 时频分析 t, xr signal.istft(Zxx, fs128.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, mNone, wNone, aNone)Chirp Z 变换可在任意圆弧上计算 Z 变换采样点czt_points(m, wNone, aNone)生成 CZT 采样点坐标zoom_fft(x, fn, mNone, fs2, endpointFalse, axis-1)Zoom FFT——只在目标频段做高分辨率 DFTCZT/ZoomFFT可复用预计算蝶形系数的类封装多次对不同信号做同一频段分析时可显著节省开销。Zoom FFT 的应用场景是先粗看全局、再对感兴趣频段细看例如在密集频谱中分辨相距很近的两个峰zoomer signal.ZoomFFT(nx.size, fn[0.1, 0.2], fs1.0, m4096) 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),仅供参考