1. 程式人生 > >MATLAB計算自相關函式和互相關函式

MATLAB計算自相關函式和互相關函式

  • 要求:t[n]=f(n)*g(n),把g(n)翻轉,向右移動n格與f(n)的乘積和。
  • 假設f(n)長度為L,g(n)長度為P,則卷積後的有效點數為L+P-1,其餘為全零。
  • 由傅立葉變換定理:時域卷積等效於頻域乘積,即 T(e^jw)=F(e^jw)G(e^jw)。用w=(2*pi/N)k,代替可得:T~[k]=F~[k]G~[k],取k=0-N-1則可得到T[k]=F[k]G[k]。
  • 一個“週期序列”的DFS相當於對“一個週期”的序列傅立葉變換做頻域抽樣w=(2*pi/N)k,且抽樣後滿足x~[n]=∑x[n-rN]。N為週期。
  • 由於DFS無論時域還是頻域都可以用N個點表示所有資訊,所以定義DFT,只取時域N個點並對應頻域N個點,藉助DFS便可相互恢復。方法為取x~[n]從0到N-1即可。
  • 計算F[k]G[k],首先要保證N>=L+P-1,則將f(n)、g(n)補全至長度N,補零。

二、自相關函式:定義f(t)*f(-t)   ∫f(t)f(t-α)

    互相關函式:定義f(t)*g(-t)   ∫f(t)g(t-α)

MATLAB實現:例如A=[1 2 3]

 自相關函式應該為:n=-2 -1 0 1 2 對應 值為 3 8 14 8 3

    1. 使用xcorr函式:

       xcorr(A)= 3.0000    8.0000   14.0000    8.0000    3.0000

    2. 自己使用FFT實現:

       基本原理是兩訊號的FFT乘積相當於時域卷積結果的∑x[n-rN]。

       原本卷積過程是y軸對稱的平移相稱,而這裡自相關和互相關不要求y軸翻轉過程,相當於t(-n)的卷積過程;t(-n)對應的是X(e-jw),如果是實數即為conj(X(ejw))

       conj()求複數共軛

       若直接ifft(fft(A).*conj(fft(A))),得到 k=0 1 2  對應值  14 11 11,明顯因x[n]長度為5,而這裡N=3使得∑x[n-rN]混疊了了;其實,兩個等長的序列的FFT點乘得到的是時域以此長度為週期,迴圈卷積的結果。

       因此令B=[A 0 0]補成一個週期長度N=5,這樣雖然依然混疊(不可避免),但是混疊的區間都是值為0的。沒有關係,反而得到了k=-2 -1的值,在k=3、4無失真顯示。

       B=[A 0 0]

       ifft(fft(B).*conj(fft(B)))

       得到:14     8     3     3     8 和上面分析一樣

三、小m序列生成:查書可得生成多項式的抽頭係數,線性迴圈暫存器產生出來即可,暫存器初始狀態不影響小m序列,僅僅是造成一個移位而已。

    Gold序列生成:找到優選對的小m的序列進行模2加即可。