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

如何修改FFT实现,使其结果与1D卷积的'same'模式一致?

实现FFT卷积与conv(x,k,'same')结果一致的方法

要让FFT实现的卷积和conv(x,k,'same')结果一致,核心是对FFT得到的full卷积结果做和MATLAB相同的中间段截取——因为'same'模式本质就是从full卷积结果里提取与输入x长度相同的中间部分。

具体修改步骤

  • 先通过FFT得到full模式的卷积结果(你现有代码里的Y_fft就是这个结果)
  • 根据卷积核长度计算截取的起始/结束索引:对于1D场景,'same'模式会从full结果的第floor((length(k)-1)/2)+1个元素开始,连续取length(x)个元素
  • 对FFT结果执行截取操作,再和conv(x,k,'same')的输出对比

修改后的完整测试代码

% Create vector and kernel
x = randn(1, 100); 
k = randn(1, 10);  

% Do 1D conv in 'same' mode
y_conv_same = conv(x, k, 'same');

% Do 1D FFT-based full convolution
N = length(x) + length(k) - 1;
X = fft(x, N);
K = fft(k, N);
Y_fft_full = ifft(X .* K);

% Convert FFT full result to 'same' mode
start_idx = floor((length(k)-1)/2) + 1;
end_idx = start_idx + length(x) - 1;
Y_fft_same = Y_fft_full(start_idx:end_idx);

% Compare
max_diff = max(abs(y_conv_same - Y_fft_same));
disp(['The maximal difference is: ' num2str(max_diff)]);

原理说明

MATLAB的conv(x,k,'same')会根据卷积核长度自动对齐中间位置:卷积核长度为偶数时,截取结果会轻微偏向输入右侧;奇数时则严格居中。上面的索引计算完全复现了这个逻辑,因此截取后的FFT结果和直接调用conv的'same'模式结果会高度一致(仅存在浮点运算带来的微小误差)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:49:55