You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch Conv1d与Scipy卷积差异及信号反卷积技术问询

信号卷积与PyTorch/Scipy实现问题解答

1. 随机猜测Strue的长度设定

根据卷积的长度映射关系,结合观测信号Sobs(长度149)与核(长度120)的生成逻辑,需对应正问题的卷积模式来确定:

  • 若Sobs是valid模式卷积的结果:输出长度 = 输入长度 - 核长度 + 1 → 149 = N - 120 + 1 → Strue长度N=268
  • 若Sobs是same模式卷积的结果:输出长度与输入长度一致 → Strue长度为149
  • 若Sobs是full模式卷积的结果:输出长度 = 输入长度 + 核长度 -1 → 149 = N +120 -1 → N=30

结合你后续提到的“full模式卷积结果过长”的问题,实际场景中Sobs更可能是valid或same模式的产物,最合理的初始猜测是:如果是valid模式生成的Sobs,Strue长度设为268;如果是same模式,设为149。

2. Strue与Sobs长度相同时,full模式卷积结果过长的处理

若强制Strue与Sobs长度相同(149),full模式卷积得到268长度的结果,要匹配Sobs的149长度,可按两种方式处理:

  • 裁剪结果:从full模式的268长度结果中截取中间149个点,等价于Scipy卷积的mode='same'效果
  • 切换卷积模式:直接使用valid或same模式卷积,而非full模式。如果正问题中Sobs是same模式生成的,用same模式卷积即可直接匹配长度;如果是valid模式,那Strue的合理长度本就该是268,而非149。

3. PyTorch实现时minibatch的设定

PyTorch的torch.nn.functional.conv1d输入格式为(batch_size, in_channels, signal_length):

  • 你的Strue是单通道1D信号,in_channels固定为1
  • minibatch(batch_size)应设为1,因为你每次处理的是一组独立的Strue猜测(对应一个样本)。若设为149,会被识别为149个长度为1的独立样本,不符合需求。

示例输入格式:Strue需调整为(1, 1, size),其中size是你设定的Strue长度(如268或149)。

4. PyTorch conv1d匹配Scipy full模式的padding调整

Scipy的full模式卷积,等价于对输入信号两侧填充核长度-1个0后,执行PyTorch的valid模式互相关(需先翻转核,因为PyTorch conv1d本质是互相关,Scipy是卷积):

import torch.nn.functional as F

kernel_len = 120
# 假设Strue形状为(1, 1, N)
padded_strue = F.pad(Strue, (kernel_len-1, kernel_len-1), mode='constant', value=0)
# 翻转核以匹配Scipy的卷积逻辑
flipped_kernel = torch.flip(kernel, dims=[2])
# 执行valid模式互相关,得到full模式卷积结果
full_conv_result = F.conv1d(padded_strue, flipped_kernel, padding=0)

此时full_conv_result的长度为N + 120 -1,与Scipymode='full'的结果完全一致。

内容的提问来源于stack exchange,提问作者SpoonBB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:37:10