Я строю модель PyTorch для оценки Ответов Impuse . В настоящее время я рассчитываю потери от реального и предполагаемого импульсного отклика. Я хотел бы свести воедино как предполагаемый, так и реальный импульсный отклик с сигналом, а затем рассчитать потери по ним.
В пакете pyroomaccoustics используется SciPy's fftconvolve
для свертывания импульсного отклика с данным сигналом. Я не могу использовать это, так как это нарушит график вычислений PyTorch. PyTorch conv1d
использует взаимную корреляцию. Из этого ответа кажется, что, перевернув фильтр, можно использовать conv1d
для свертки.
Я запутался, почему следующий код дает другой результат для conv1d
и convolve
и что нужно изменить, чтобы получить равные выходы.
import torch
from scipy.signal import convolve
a = torch.tensor([.1, .2, .3, .4, .5])
b = torch.tensor([.0, .1, .0])
a1 = a.view(1, 1, -1)
b1 = torch.flip(b, (0,)).view(1, 1, -1)
print(torch.nn.functional.conv1d(a1, b1).view(-1))
# >>> tensor([0.0200, 0.0300, 0.0400])
print(convolve(a, b))
# >>> [0. 0.01 0.02 0.03 0.04 0.05 0. ]