如何修改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
相关产品推荐
相关产品推荐

