2011-12-12 106 views
1

我有兩個向量的空間數據(每個約2000個元素的長度)。一個是另一個的卷積版本。我試圖確定會產生這種卷積的內核。我知道我可以通過查找輸出和輸入矢量的傅里葉變換比率的傅立葉逆變換來做到這一點。事實上,當我這樣做時,我可以或多或少地獲得我期待的形狀。但是,我的核矢量與兩個輸入矢量具有相同的維數,實際上卷積僅使用了約五分之一(〜300-400)的點。事實上,我得到正確的形狀,但錯誤的點數使我認爲我沒有正確使用ifft和fft函數。看起來如果我真的做了正確的事情,這應該自然發生。目前我只是在做;在matlab中查找卷積核

FTInput = fft(in); 
FtOutput = fft(out); 
kernel = ifft(FtOutput./FTInput). 

這是正確的,它是由我來正確解釋輸出向量或我簡單的任務?我確定它是後者,我只是不確定在哪裏。

謝謝

+0

你可能會問在dsp.stackexchange.com上。這是一個系統識別問題。有兩個問題:您採用的方法是使用與數據長度相同的FIR濾波器對系統進行建模,這可能是也可能不是一個好的模型。如果你的輸入和輸出信號完全被噪聲破壞,比如說從模擬傳感器數字化,那麼噪音就會傾向於你的答案。 – mtrw

回答

2

你正在做的事情正確,這不是一個錯誤。

給定乾淨和卷積數據估計卷積濾波器的問題非常困難。給定「好」的數據,你可能會得到正確的形狀,但檢索卷積濾波器的真正支持(即得到它們應該在的零點)不會自然發生。

+0

謝謝你,這實際上與我正在做的事情有點切線,更多的是交叉檢查。它似乎可能是這樣的,它永遠不會像我試圖覈對的那樣好。 – Bowler

2

我想你「」問題「」來自於你忽視了

通過傅立葉分必要的離散卷積內在填充物,你認爲你的卷積與在空間循環填充製成(或你的卷積是由傅里葉乘法產生的,兩者都是等價的),但是如果你的卷積是在空間域中計算的,那麼最有可能使用零填充。

s=[1 2 3 4 5] //signal 

f=[0 1 2 1 0] //filter 

s0=s *conv0* f=[4 8 12 16 14] //convolution with zero padding in spatial domain, truncated to signal length 
sc=s *convc* f=[9 8 12 16 15] //convolution with cyclic padding in spatial domain, truncated to signal length 

S,S0,Sc, the ffts of s,s0,sc 

approx0=ifft(S0./S)=[-0.08 1.12 2.72 -0.08 -0.08] 

approxc=ifft(Sc./S)=[0 1 2 1 0]