我正在尝试获得某个频段的功率,但我想在时域而不是频域中执行此操作。问题 - 带非常紧,因此使用简单的过滤器会产生重叠的“尾巴”。
让 [a1 a2]Hz 是我想要计算功率的频带。我可以想象我将频域乘以一个矩形信号,因此我可以及时得到它,所以我可以及时进行卷积。
代码是: (matlab) for x - 时间信号,X=fft(x),W - 频率窗口,w=ifft(W)
filteredX=X.*W;
Fx=ifft(filteredX);
Fx2=conv(x,w,'same');
信号的结果是不同的。虽然经过过滤的X 显示了正确的频谱,但 Fx2 的 fft(卷积的结果)完全不同。
有什么建议么?
编辑:
正如 EitanT 所建议的(谢谢),我玩过以下代码:
im = fix(255 * rand(500,1));
mask = ones(4,1) / 16;
% # Circular convolution
resConv = conv(im, mask);
% # Discrete Fourier transform
M = size(im, 1) + size(mask, 1);
resIFFT = ifft(fft(im, M) .* fft(mask, M));
% # Not needed any more - resIFFT = resIFFT(1:end-1); % # Adjust dimensions
% # Check the difference
max(abs(resConv(:) - resIFFT(:)))
哪个工作正常,但我不能使用它,所以我不得不更改与尺寸问题有关的部分并得到以下内容(请参阅评论):
im = fix(255 * rand(500,1));
mask = ones(4,1) / 16;
% # Circular convolution
resConv = conv(im, mask,'same'); % # instead of conv(im, mask)
% # Discrete Fourier transform
M = size(im, 1) % # Instead of: M = size(im, 1) + size(mask, 1);
resIFFT = ifft(fft(im, M) .* fft(mask, M));
resIFFT = resIFFT(1:end-1); % # Adjust dimensions
% # Check the difference
max(abs(resConv(:) - resIFFT(:)))
如果虽然我希望得到相同的结果,但现在差异要大得多。