ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PyTorch torch.signal.windows 窗函数完全指南:从 Bartlett 到 Kaiser 的频谱分析工具详解

PyTorch torch.signal.windows 窗函数完全指南:从 Bartlett 到 Kaiser 的频谱分析工具详解 PyTorch torch.signal.windows 窗函数完全指南从 Bartlett 到 Kaiser 的频谱分析工具详解【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch导读本文围绕 PyTorch 官方文档 docs/source/signal.md 中定义的torch.signal模块展开重点讲解其子模块torch.signal.windows提供的 11 个窗函数Bartlett、Blackman、Cosine、Exponential、Gaussian、General Cosine、General Hamming、Hamming、Hann、Kaiser、Nuttall的数学定义、参数语义与实战用法。读完本文你将掌握如何在 PyTorch 中生成用于频谱分析periodic 窗与滤波器设计symmetric 窗的各类窗函数张量理解M、sym、dtype、device等通用参数的作用并了解这些函数与 SciPysignal.get_window的对应关系及仓库内的实现细节与测试验证。torch.signal 模块概述torch.signal是 PyTorch 中面向信号处理领域的模块官方文档明确说明其设计参照 SciPy 的signal模块。当前仓库中该模块的实体位于 torch/signal/init.py顶层__init__.py仅导出一个子模块from . import windows __all__ [windows]在 torch/init.py 中通过from torch.signal import windows as windows将其挂载到torch.signal.windows命名空间因此可以通过torch.signal.windows.name直接调用。从源码结构看torch.signal目前的核心内容是窗函数子模块 torch/signal/windows/windows.py共导出 11 个函数完整清单与__all__一致见 torch/signal/windows/init.pybartlett, blackman, cosine, exponential, gaussian, general_cosine, general_hamming, hamming, hann, kaiser, nuttall窗函数的通用参数模型所有窗函数共享一套由window_common_args定义的参数规范见 windows.py它由窗函数专属参数、PyTorch 通用工厂参数来自factory_common_args定义于 torch/_torch_docs.py以及归一化说明三部分合并而成。核心参数表参数类型说明Mint窗的长度即返回张量的采样点数symbool默认True返回对称窗适用于滤波器设计设为False返回周期窗适用于频谱分析dtypetorch.dtype返回张量的数据类型默认None时取torch.get_default_dtype()仅支持float32与float64layouttorch.layout返回张量的布局默认torch.strided目前仅支持 strided 张量devicetorch.device返回张量所在设备默认取当前默认设备requires_gradbool返回张量是否参与自动微分默认False其中M与sym的定义原文如下节选自window_common_argsM (int): the length of the window. In other words, the number of points of the returned window.sym (bool): IfFalse, returns a periodic window suitable for use in spectral analysis. IfTrue, returns a symmetric window suitable for use in filter design. Default:True.归一化说明window_common_args中特别注明窗函数归一化到 1即最大值恒为 1但当M为偶数且symTrue时峰值 1 不会出现在返回张量中——因为对称窗的样本点分布在两端偶数长度下没有任何采样点恰好落在峰值位置。这一点从各函数示例输出中可以验证例如hann(10)的最大值为0.9698而非 1。底层参数校验每个窗函数在计算前都会调用_window_function_checks见 windows.py统一完成三类校验M 0时抛出ValueError提示 requires non-negative window lengthlayout不是torch.strided时抛出ValueError提示 implemented for strided tensors only例如稀疏布局不可用dtype不在[torch.float32, torch.float64]中时抛出ValueError提示 expects float32 or float64 dtypes。余弦类窗函数族PyTorch 的窗函数实现具有清晰的层级复用关系hann、hamming是general_hamming的特例而general_hamming、blackman、nuttall又统一由general_cosine实现。理解这条调用链见 windows.py 中hann→general_hamming→general_cosine、blackman→general_cosine、nuttall→general_cosine就能掌握大部分窗函数的本质。general_cosine通用余弦窗通用余弦窗的数学定义为w_n Σ (-1)^i · a_i · cos(2π·i·n / (M-1)) i 从 0 到 len(a)-1参数a为可迭代的系数集合源码要求其必须为非空 list/tuple否则抛出TypeError或ValueError。实现上源码先将系数按(-1)^i交替取符号a_i [(-1) ** i * w for i, w in enumerate(a)]再通过torch.cos(i.unsqueeze(-1) * k)构造张量并沿第 0 维求和。当M 0时返回空张量M 1时返回全 1 张量。示例 torch.signal.windows.general_cosine(10, a[0.46, 0.23, 0.31], symTrue) tensor([0.5400, 0.3376, 0.1288, 0.4200, 0.9136, 0.9136, 0.4200, 0.1288, 0.3376, 0.5400]) torch.signal.windows.general_cosine(10, a[0.5, 1 - 0.5], symFalse) tensor([0.0000, 0.0955, 0.3455, 0.6545, 0.9045, 1.0000, 0.9045, 0.6545, 0.3455, 0.0955])第二个例子中a[0.5, 0.5]恰好退化为 Hann 窗见下文可以作为验证函数等价性的快速手段。general_hamming通用 Hamming 窗通用 Hamming 窗是general_cosine的两系数特例数学定义为w_n α - (1 - α) · cos(2π·n / (M-1))唯一专属参数alpha默认0.54。源码实现直接将a[alpha, 1.0 - alpha]转发给general_cosine见 windows.py。hannHann 窗Hann 窗即alpha0.5的通用 Hamming 窗其等价形式为w_n 0.5 · [1 - cos(2π·n / (M-1))] sin²(π·n / (M-1))源码中hann直接调用general_hamming(M, alpha0.5, ...)见 windows.py。典型输出 torch.signal.windows.hann(10) tensor([0.0000, 0.1170, 0.4132, 0.7500, 0.9698, 0.9698, 0.7500, 0.4132, 0.1170, 0.0000]) torch.signal.windows.hann(10, symFalse) tensor([0.0000, 0.0955, 0.3455, 0.6545, 0.9045, 1.0000, 0.9045, 0.6545, 0.3455, 0.0955])对比可见周期窗symFalse的端点与对称窗不同且周期窗的最大值恰好为 1这正是频谱分析中优先选择周期窗的原因——它保证了 FFT 后主瓣对齐且避免端点不连续带来的频谱泄漏。hammingHamming 窗Hamming 窗即默认alpha0.54的通用 Hamming 窗w_n 0.54 - 0.46 · cos(2π·n / (M-1))源码中hamming直接转发给general_hamming见 windows.py因此二者结果完全一致 torch.signal.windows.hamming(10) tensor([0.0800, 0.1876, 0.4601, 0.7700, 0.9723, 0.9723, 0.7700, 0.4601, 0.1876, 0.0800])blackmanBlackman 窗Blackman 窗是三系数通用余弦窗系数固定为[0.42, 0.5, 0.08]w_n 0.42 - 0.5·cos(2π·n/(M-1)) 0.08·cos(4π·n/(M-1))源码同样转发给general_cosine见 windows.py。注意其示例输出中存在-1.4901e-08量级的浮点噪声这是数值计算中的正常现象不影响实际使用 torch.signal.windows.blackman(5) tensor([-1.4901e-08, 3.4000e-01, 1.0000e00, 3.4000e-01, -1.4901e-08])nuttallNuttall 窗最小 4 项 Blackman-HarrisNuttall 窗是四系数通用余弦窗专用于旁瓣抑制性能要求较高的场景。其数学定义为w_n 1 - 0.36358·cos(z_n) 0.48917·cos(2·z_n) - 0.13659·cos(3·z_n) 0.01064·cos(4·z_n) 其中 z_n 2π·n / M注意这里分母是M而非M-1与一般余弦窗的相位定义不同。源码中系数取更高精度的[0.3635819, 0.4891775, 0.1365995, 0.0106411]见 windows.py。文档同时给出两篇参考文献A. Nuttall 1981 年发表于 IEEE 的论文及 Heinzel 等人的 DFT 窗函数综述说明该窗的旁瓣特性有严格的学术依据。指数族窗函数exponential指数窗Poisson 窗指数窗又称 Poisson 窗数学定义为w_n exp(-|n - c| / τ)其中c为窗中心。专属参数参数默认值说明centerM/2周期窗或(M-1)/2对称窗窗中心位置对称窗下必须为None否则抛出ValueErrortau1.0衰减值必须为正数tau 0时抛出ValueError通常与百分比关联取值范围在 (0, 100]当tau100时退化为均匀窗源码实现先将center与tau组合为线性坐标k linspace(-center/τ, (-center(M-1))/τ, M)再返回exp(-|k|)见 windows.py。示例 torch.signal.windows.exponential(10) tensor([0.0111, 0.0302, 0.0821, 0.2231, 0.6065, 0.6065, 0.2231, 0.0821, 0.0302, 0.0111]) torch.signal.windows.exponential(10, symFalse, tau.5) tensor([4.5400e-05, 3.3546e-04, 2.4788e-03, 1.8316e-02, 1.3534e-01, 1.0000e00, 1.3534e-01, 1.8316e-02, 2.4788e-03, 3.3546e-04])gaussian高斯窗高斯窗的数学定义为w_n exp(-(n / (2σ))²)专属参数std标准差默认1.0必须为正数std 0时抛出ValueError。源码中constant 1/(std·√2)通过exp(-(k²))计算见 windows.py。std直接控制窗的宽窄std越小窗越窄、主瓣越宽频域分辨率越差但旁瓣越低。 torch.signal.windows.gaussian(10) tensor([4.0065e-05, 2.1875e-03, 4.3937e-02, 3.2465e-01, 8.8250e-01, 8.8250e-01, 3.2465e-01, 4.3937e-02, 2.1875e-03, 4.0065e-05])基础三角函数窗cosine余弦窗sine 窗cosine窗虽然名字叫 cosine但实现上使用的是正弦波形与 SciPy 保持一致因此也被称为 sine 窗w_n sin(π·(n 0.5) / M)源码注释明确指出该公式与典型的余弦窗公式不同分子中引入了0.5偏移项使得窗的首尾采样点取非零值见 windows.py。在周期模式下分母变为M1 torch.signal.windows.cosine(10) tensor([0.1564, 0.4540, 0.7071, 0.8910, 0.9877, 0.9877, 0.8910, 0.7071, 0.4540, 0.1564]) torch.signal.windows.cosine(10, symFalse) tensor([0.1423, 0.4154, 0.6549, 0.8413, 0.9595, 1.0000, 0.9595, 0.8413, 0.6549, 0.4154])bartlettBartlett 窗三角窗Bartlett 窗即三角窗数学定义为w_n 1 - |2n/(M-1) - 1|等价于分段函数左半段2n/(M-1)右半段2 - 2n/(M-1)。源码实现为1 - |k|其中k linspace(-1, 1, M)见 windows.pyM 0返回空张量M 1返回全 1 张量。 torch.signal.windows.bartlett(10) tensor([0.0000, 0.2222, 0.4444, 0.6667, 0.8889, 0.8889, 0.6667, 0.4444, 0.2222, 0.0000]) torch.signal.windows.bartlett(10, symFalse) tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000, 1.0000, 0.8000, 0.6000, 0.4000, 0.2000])kaiserKaiser 窗Kaiser 窗以零阶第一类修正贝塞尔函数定义w_n I₀(β·√(1 - ((n - N/2)/(N/2))²)) / I₀(β) 其中 N M - 1对称或 M周期I₀ 为 torch.special.i0专属参数beta为形状参数默认12.0必须非负beta 0时抛出ValueError。beta是 Kaiser 窗最核心的自由度它控制主瓣宽度与旁瓣衰减之间的权衡beta越大旁瓣衰减越强、主瓣越宽。源码直接使用torch.i0计算修正贝塞尔函数并特别处理了M 1时返回全 1 张量以避免 NaN见 windows.py。 torch.signal.windows.kaiser(5, symFalse, beta0.9) tensor([1.9858e-07, 5.1365e-05, 3.8659e-03, 8.4658e-02, 5.3941e-01, 1.0000e00, 5.3941e-01, 8.4658e-02, 3.8659e-03, 5.1365e-05])实战窗函数在信号处理中的应用方式频谱分析中的标准流程torch.signal.windows的典型用法是配合torch.fft进行加窗频谱分析。周期窗symFalse专为此场景设计将窗与信号逐点相乘后再做 FFT可显著抑制因信号截断造成的频谱泄漏。基本范式如下import torch M 512 window torch.signal.windows.hann(M, symFalse) signal torch.sin(2 * torch.pi * 50 * torch.arange(M) / 1000.0) spectrum torch.fft.rfft(signal * window)滤波器设计中的对称窗对称窗symTrue默认值适用于 FIR 滤波器设计——窗函数与理想脉冲响应相乘后截断得到有限长的滤波器系数对称性保证了滤波器具有线性相位特性。设备与自动微分所有窗函数均为标准张量工厂函数支持device与requires_grad参数。在 GPU 上生成窗只需window torch.signal.windows.kaiser(256, beta8.0, devicecuda, dtypetorch.float32)由于窗由torch.linspace与初等运算组合而成整个计算图可微分requires_gradTrue时可将窗参数如std、tau、beta纳入端到端训练流程。测试与 SciPy 一致性验证仓库在 test/test_tensor_creation_ops.py 中对该模块提供了系统性的数值验证是理解函数行为的可靠参考test_signal_windows_functions对bartlett、blackman、cosine、hamming、hann、nuttall六个函数在多种长度1、2、5、10、50、100、1024、2048与周期/对称两种模式下与 SciPy 的scipy.signal.get_window逐一比对结果assertEqual(res, ref, exact_dtypeFalse)test_kaiser随机生成 50 组beta值030 均匀分布与 SciPy 结果比对测试还验证了非浮点 dtype 会抛出 floating point 相关RuntimeError、稀疏布局会报 not implemented for sparse types与_window_function_checks的校验逻辑互相印证。测试中的关键映射关系为PyTorch 的symFalse等价于 SciPy 的fftbinsTrue周期窗symTrue等价于fftbinsFalse。此外仓库中 test/test_decomp.py 与 test/distributed/tensor/test_dtensor_ops.py 也涉及torch.signal的分解与分布式张量路径说明该模块已接入 PyTorch 的分解decomposition与 DTensor 体系可用于torch.compile等编译路径。函数关系速查表函数数学本质专属参数底层实现bartlett三角窗无独立实现1 - \|k\|blackman3 系数余弦窗无general_cosine(a[0.42, 0.5, 0.08])cosinesine 波形余弦窗无独立实现sinexponentialPoisson 窗center、tau独立实现expgaussian高斯窗std独立实现expgeneral_cosine通用余弦窗a系数列表核心实现general_hamming2 系数余弦窗alpha默认 0.54general_cosine(a[alpha, 1-alpha])hammingHamming 窗无general_hamming(alpha0.54)hannHann 窗无general_hamming(alpha0.5)kaiser修正贝塞尔窗beta默认 12.0独立实现torch.i0nuttall4 系数 Blackman-Harris无general_cosine(a[0.3635819, 0.4891775, 0.1365995, 0.0106411])使用注意事项小结sym的选择频谱分析用symFalse周期窗滤波器设计用symTrue对称窗默认周期窗的峰值恰为 1对称窗在偶数M下峰值不出现。dtype 限制窗函数仅接受float32与float64整数或半精度 dtype 会被_window_function_checks拒绝如默认 dtype 不满足需求应显式传入dtypetorch.float64等。边界情况所有函数均处理了M 0返回空张量bartlett、general_cosine、kaiser额外处理了M 1返回全 1 张量其中 Kaiser 的特殊处理用于避免修正贝塞尔函数在零点附近的 NaN。与 SciPy 的一致性结果与scipy.signal.get_window一致SciPy 始终返回 float64PyTorch 按所给 dtype 返回可放心在迁移 SciPy 信号处理代码时使用。【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表