我試圖獲得某個波段的功率,但是我想在時域而不是頻域做到這一點。問題 - 樂隊非常緊張,因此使用簡單的過濾器會產生重疊的「尾巴」。時間卷積與頻率乘法
讓[a1 a2] Hz是我想要計算功率的頻段。我可以想象我將頻域乘以一個矩形信號,因此我可以及時得到它,所以我可以做一個時間卷積。
的代碼是:(MATLAB) 對於x - 在時間上的信號,X = FFT(x)中,W - 在頻率窗口中,w = IFFT(W)
filteredX=X.*W;
Fx=ifft(filteredX);
Fx2=conv(x,w,'same');
的結果信號是不同的。 雖然filteredX顯示正確的頻譜,但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(:)))
如果雖然我希望得到s艾姆成績,現在的差距要高得多。
可能重複(http://stackoverflow.com/questions/14025967/verify-the-convolution-theorem)。只需使用'fft'和'conv'而不是'fft2'和'conv2'。 –
謝謝Eitan。使用引用的代碼玩了一下後,似乎問題與大小有關。我有一個1XN的頻率矩形(W)和一個1XN的頻譜(X)。 w的信號和信號x的長度分別是N個點和(N + N + 1)個長的卷積。在卷積中選擇「相同」選項會提取所需的N個點,但頻率結果與乘法不同。甚至不關閉 – BioSP
默認情況下,'conv'函數正向過濾,所以「額外」時間點被添加到原始採樣的末尾。請參閱下面的答案以獲取更詳細的分類。 – cjh