【发布时间】:2013-06-19 23:55:09
【问题描述】:
我正在尝试获取某个频段的功率,但我想在时域而不是频域中执行此操作。问题 - 波段非常紧,因此使用简单的过滤器会产生重叠的“尾巴”。
让 [a1 a2]Hz 是我要计算功率的频段。我可以想象我将频域乘以一个矩形信号,因此我可以及时得到它,所以我可以及时进行卷积。
代码是:(matlab) 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(:)))
效果很好,但我不能使用它,所以我不得不更改与尺寸问题有关的部分并得到以下(请参阅 cmets):
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(:)))
虽然我希望得到相同的结果,但现在差异要大得多。
【问题讨论】:
-
Verify the convolution theorem 的可能副本。只需分别使用
fft和conv而不是fft2和conv2。 -
谢谢艾坦。在玩了一点参考代码之后,问题似乎出在大小上。我有一个 1XN 频率矩形 (W) 和一个 1XN 频谱 (X)。 w 和信号 x 的 ifft 各有 N 个点长,卷积的长度为 (N+N+1) 个。在卷积中采用“相同”选项确实提取了所需的 N 个点,但频率的结果与乘法不同。甚至没有关闭
-
默认情况下,
conv函数在正向过滤,因此“额外”时间点被添加到原始样本的末尾。请参阅下面的答案以获取更详细的细分。
标签: matlab filter signal-processing convolution