我试图通过多项式(系数)乘法、快速傅里叶变换和矩阵乘法来理解卷积的等价性。我正在使用 octave 和 octave-signal 包,这个问题的一部分可能与它们的实现有关(我相信这与 MATLAB 相同)。
因此,我创建了长度为的原始信号,而我的棚车窗口长度为。
N = 48;
n = 6;
我使用作为这个例子的输入函数。
dt = 2*pi/N;
t = [-N/2:N/2-1]'*dt;
f = sin(t);
多项式乘法卷积():
h = ones(n,1);
g_conv = conv(h,f);
g_conv_same = conv(f,h,'same');
FFT 和 FFT 卷积与输入的零填充(也是):
g_ft = real(ifft(fft(h,N).*fft(f)));
f_padded = [f; zeros(n-1,1)]; % append zeros
g_ft_padded = real(ifft(fft(h,N+n-1).*fft(f_padded)));
矩阵乘法卷积():
A = convmtx(h,N);
g_mtx = A*f;
看起来像这样:

查找修剪数组的索引:
idx_A = find(sum(A,2) == n);
idx_t = 1:length(idx_A);
绘制结果(通过不同方法卷积的信号):
plot(t(idx_t),g_mtx(idx_A),'k','linewidth',3);
line(t-5*dt,g_ft,'color','g','linewidth',2); %-> offset by 5*dt
line(t-7*dt,g_ft_padded(1:length(t)),'color','r','linestyle','--'); %-> offset by 7*dt
line(t(idx_t),g_conv(idx_A),'color','b','marker','o');
line(t-2*dt,g_conv_same,'color','b','marker','+'); %-> offset by 2*dt
legend({'matrix','FFT','FFT (padded)','conv','conv (same shape)'},...
'location','southeast')
xlabel('x value')
ylabel('y value')
看起来像这样:

在这一点上我有几个问题:
- 为什么 FFT 方法的结果会偏移几个单位
dt? - 如果我填充 FFT 结果以使输入向量不再是周期性的(红色虚线),为什么我会在结果中遗漏部分卷积函数(右侧)?
- 如何处理 FFT 卷积的末端,以使结果与多项式和矩阵乘法结果对齐?
提前致谢。PS如果这些细节有很好的教科书参考,我将不胜感激。
(我已经编辑澄清。)