我试图使conv(x, k, 'same')
结果与 相同FFT
。但我注意到这仅适用于 shapefull
而不适用于same
.
% Create vector and kernel
x = randn(1, 100);
k = randn(1, 10);
% Do 1D conv
y_conv = conv(x, k, 'full');
% Do 1D FFT
N = length(x) + length(k) - 1;
X = fft(x, N);
K = fft(k, N);
Y_fft = ifft(X .* K);
% Compare
max_diff = max(abs(y_conv - Y_fft));
disp(['The maximal difference is: ' num2str(max_diff)]);
我之所以想要same
,是因为我的输出数据需要与输入数据相同。
问题:
为了使 FFT 结果与 相同,需要做什么/更改conv(x, k, 'same')
?
“相同”的垫有零。您需要用至少
K-1
零填充输入(如果您的内核有 lengthK
),然后进行 FFT 卷积,最后将结果裁剪为预期大小。fft(x, N)
当 时,右侧填充零N > length(x)
。所以你需要从右边裁剪。但由于其fft(k, N)
工作方式,内核的起源位于第一个样本,而不是“相同”假设的中间。所以结果就转移了。因此,您还需要从左侧删除一些样本,可能(K-1)/2
假设样本K
是奇数。