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
相关产品推荐
相关产品推荐

