互相關(cross-correlation)中的一些概念及其實現

2021-01-11 聲振之家


在這裡我想探討一下「互相關」中的一些概念。正如卷積有線性卷積(linear convolution)和循環卷積(circular convolution)之分;互相關也有線性互相關(linear cross-correlation)和循環互相關(circular cross-correlation)。線性互相關和循環互相關的基本公式是一致的,不同之處在於如何處理邊界數據。其本質的不同在於它們對原始數據的看法不同。通過這篇文章,我想整理一下相關概念,並給出示例。

假設我們手裡有兩組數據,分別為M個和N個,表示為:


a比v長,即M≥N。序列v和a之間的線性互相關(Linear Cross-Correlation)操作表示為:


其結果也是一個序列,表示為:


具體的操作是用這兩個序列進行的一種類似「滑動點積」的操作,如圖1和圖2所示。


圖1. 線性互相關的計算過程示意



圖2. 線性互相關序列中單個值計算示意


得到的互相關序列總長度為MN-1,該序列的前N-1和後N-1個數值是無效的,有效的數據共M-N1個。線性互相關的有效數據第k個分量的值為:


注意,線性互相關並不滿足交換律,即:


一個簡單的應證是,等式兩側操作所得結果的有效數據個數都不一致。


線性相關的實際意義是,向量a中的各個與向量v等長的子向量與向量v的相似程度。這樣,中值最大的索引就是與向量a中與v最相似的子向量的起始索引。通常,為了獲得有效的互相關數據,我們總是用較短的數據去滑動點積較長的數據。


用一個實際的應用例子來驗證一下吧。如圖3的第一個子圖表示雷達聲納發射了一個探測信號。經過一段時間之後,收到了如圖3的第二個子圖所示的回波(帶有一定的噪聲)。此時我們關注的是如何確定回波中從何時開始是對探測信號的響應,以便計算目標距雷達的距離,這就需要用到線性互相關。在第三個子圖中的『Valid』曲線即是有效互相關數據,其中清晰地呈現出兩處與探測信號相似的回波的位置。


圖3. 相關計算的例子:雷達回波分析


線性互相關中,還有一些概念值得注意:
一是補零。由線性相關的計算式不難發現,為了計算出個完整的相關係數序列(包含那些「無效數據」在內的所有結果),需要用到一些「不存在」的點。這就需要人為地對這些值進行補充,在線性相關的計算中,對這些超出原始數據儲存的區域取值為零。


二是末端效應。由圖1可以發現,一頭一尾的個互相關數據並沒有完全「嵌入」兩個原始數組的全部信息,它們或多或少地受到了人為補零的影響。因此一般認為這些數據是不可用的。


三是計算模式的選擇。這個問題其實是由問題二衍生而來的,就Python語言中的函數而言,至少有兩個可以直接計算線性相關:

numpy.correlate(a, v, mode)

scipy.signal.correlate(a, v, mode)

它們的調用參數完全相同。在調用時有三種模式可供選擇,它們計算的內容是相同的,但是返回值長度各不相同:
mode = 『valid』:只返回有效的那一部分相關數據,共$M-N+1$個;
mode = 『same』:只返回與 等長的那一部分相關數據,共$N$個;
mode = 『full』:返回全部相關數據,共$M+N-1$個。
圖3的第三個子圖展示了這三種模式的計算結果,在那個例子中,『valid』模式是最合適的。


循環互相關(Circular Cross-Correlation)是表徵兩組等長的周期性數據之間相似性的操作,其與線性互相關的區別也正由「等長」和「周期性」這個兩特點產生。在循環互相關中,被處理的原始數據是等長的,即:


序列v和a之間的線性互相關操作表示為Rc(V,a),其結果也是一個序列,表示為:


其計算式與線性互相關的寫法是一致的:


只是得到的互相關序列長度也為N。循環互相關的計算的具體過程如圖4所示,注意到在計算時要用到超出原始數據索引範圍的數據,其數據補充方式並不是「補零」而是「周期延拓」:即:


這意味著對於循環互相關,不存在不同的計算模式之分,所有的數據都是有效數據。


圖4. 循環互相關的計算過程示意


注意,循環互相關也不滿足交換律。

這裡給出了一個關於循環相關的算例。兩路原始數據分別由如下函數生成:

如果視y1為某個線性系統的周期輸入信號,而視y2為這個線性系統的輸出信號。由於存在外接幹擾,因此輸出信號不完全由輸入信號決定。此時,循環互相關的實際意義是,分辨輸出信號中的哪一個部分(頻率成分)是由該輸入信號產生的。

 
圖5. 時域數據,從上到下:y1,y2和他們的循環互相關


圖6. 頻譜,從上到下:y1,y2和他們的循環互相關

從圖5和圖6可以看出,循環互相關的頻譜準確地說明了那些測試信號的相關性。


遺憾的是,在Python幾大數值計算庫中,並沒有直接可計算循環相關的函數。但是可以採用如下代碼構造出一個可用的(經過歸一化的)cxcorr(a, v)函數出來:

def cxcorr(a,v):nom = np.linalg.norm(a[:])*np.linalg.norm(v[:])return fftpack.irfft(fftpack.rfft(a)*fftpack.rfft(v[::-1]))/nom

圖4中的數據就是通過這個函數計算出來的。其中用到了傅立葉變換和反變換來計算循環互相關,這是可行的。它們之間的關係在第四小節的QA中專門討論。


實際上,線性相關也可以處理周期信號,前提是將兩組信號採樣成不長度差異較大的序列。這樣,其有效線性互相關也可以完美地反應數據之間的相關性。


同樣採用第二節中的例子。這時為了保證足夠的有效線性互相關數據,兩組數據的長度故意不一致(但都足夠表徵其特徵),如圖7所示。它們的頻譜如圖8所示,仍然完美地體現了測試數據的相關性。


圖7. 時域數據,從上到下:y1,y2和他們的線性互相關


圖8. 頻譜,從上到下:y1,y2和他們的線性互相關

既然線性互相關也能處理周期性數據,為什麼還要專門搞一個基於等長序列和周期延拓的循環互相關呢?實際上,正如後文QA中專門討論的,這是為了利用快速傅利葉變換加速計算。


至此,兩種常用的互相關評價方法及其計算已經總結完畢。然而其中還有一些細節尚待分辨。例如,序列a和v之間的互相關的計算式:


與卷積(convolution)的定義式:


如此類似,如果再聯想起傅立葉變換的卷積定理,那麼,至少會產生如下的問題:

Q.1:它們之間有更深意義上的聯繫嗎?
A.1:
文獻[1]的答覆是堅決的:「不要讓求卷積和互相關的數學相似性迷惑你,它們描述了不同的信號處理過程。卷積是系統輸入信號、輸出信號和衝激響應之間的關係。互相關是一種在噪聲背景下檢測已知信號的方法。二者在數學上的相似僅僅是一種巧合。」實際上,只要注意到卷積操作是滿足交換律的,而互相關操作並不滿足交換律。僅此一點也許就能說明它們有著本質的不同吧。


Q.2:可以利用Python中計算卷積的函數來計算互相關嗎?
A.2:
可以,但是只能用以計算線性互相關。Python中的numpy.convolve()函數就可以計算兩個序列之間的卷積。在卷積的計算過程中也會自動進行補零(而不是周期延拓,這就是為什麼只能計算線性相關的原因),這種卷積有時被稱為線性卷積,同樣涉及末端效應、有效數據長度等考慮。具體地,根據相關和卷積的表達式,如果希望計算序列之間的線性互相關序列。等效地,只需要計算序列v和a[:: -1]之間的卷積。a[:: -1]表示序列a的「反置」,即將序列[1,2,3]反置為[3,2,1]。


Q.3:可以根據傅立葉變換的性質中有卷積定理,利用傅立葉正/逆變換計算互相關嗎?
A.3:
可以,但是只能用於計算循環互相關。傅立葉變換的卷積定理中所涉及的卷積是循環卷積。與前述的線性卷積是不同的。實際上不同的並不是卷積本身,它們的計算式是一致的,而是在如何看待參與卷積計算的數據,線性卷積認為參與計算的序列之外都是零,而循環卷積認為參與計算的序列是一個無限循環的數據的一段——這導致了它們對「越界」數據的補齊方式不一樣。正如線性互相關和循環互相關的區別!先將循環互相關等效為一個循環卷積,再利用快速傅立葉變換計算卷積即可。實際上本文給出的cxcorr(a, v)函數正是利用這一性質來計算循環相關的。其對計算速度的提升是相當明顯的。


Q.4:怎樣進行歸一化(normalization),以便於比較互相關數據?
A.4:
根據參考[4],用公式:


本文於2013年首發於聲振論壇,2015年作者對本文進行了重編輯和修正!


聲明:本文由聲振論壇會員Rainyboy(範雨)原創,並授權聲振之家編輯發布,轉載必須註明出處(聲振論壇:vibunion.com或者聲振之家公眾號:vibunion)。

相關焦點

  • Cross-sectional study
    from a population, or a representative subset, at a specific point in time—that is, cross-sectional data.
  • 「相關」與「卷積」的理解和使用
    信號的相關相關特性是表徵兩個信號之間(互相關)或者一個信號相隔一定時間的兩點之間
  • 三大相關係數簡介及其在R中的相關函數
    概率統計學習中最常見的是Pearson相關係數,其取值範圍是[-1,1],當取值為0時表示不(線性)相關,取值為[-1,0)表示負相關,取值為(0,1]表示正相關。相關係數絕對值越接近於1,兩個變量間(線性)相關性越強。
  • TensorFlow四種Cross Entropy算法實現和應用
    詳解我們先看sigmoid_cross_entropy_with_logits,為什麼呢,因為它的實現和前面的交叉熵算法定義是一樣的,也是TensorFlow最早實現的交叉熵算法。注釋中還提到這10個分類之間是獨立的、不要求是互斥,這種問題我們成為多目標,例如判斷圖片中是否包含10種動物,label值可以包含多個1或0個1,還有一種問題是多分類問題,例如我們對年齡特徵分為5段,只允許5個值有且只有1個值為1,這種問題可以直接用這個函數嗎?答案是不可以,我們先來看看sigmoid_cross_entropy_with_logits的代碼實現吧。
  • 自相關和互相關函數計算方法總結及心得體會
    這個是信號分析裡的概念,他們分別表示的是兩個時間序列之間和同一個時間序列在任意兩個不同時刻的取值之間的相關程度,即互相關函數是描述隨機信號
  • TensorFlow四種Cross Entropy算法的實現和應用
    sigmoid_cross_entropy_with_logits我們先看sigmoid_cross_entropy_with_logits,為什麼呢,因為它的實現和前面的交叉熵算法定義是一樣的,也是TensorFlow最早實現的交叉熵算法。
  • 對無形資產的邊界限定及其相關概念的關係研究
    二是相關概念具有等效的關係。於玉林(2005)認為,在學術界,無形資產、智力資產、知識資產、人力資源和無形資本、知識資本、智力資本、人力資本等幾個概念,是從不同方面對同一內容進行研究而經常出現的,在會計學的研究中,一般較多地使用無形資產或無形資本的概念,在經濟學的研究中一般較多地使用知識資本或知識資產的概念,在管理學的研究中一般較多地使用智力資產和智力資本的概念。
  • 環境地球化學的概念及其主要研究內容,以及與相關學科的關係
    一、環境地球化學的概念及其主要研究內容1.概念環境地球化學(Environmental Geochemistry)與其它許多學科有密切關係,是介於環境科學和地球化學之間的一門新興邊緣交叉學科,是研究化學元素和微量元素在人類賴以生存的周圍環境中的含量、分布和遷移和循環規律的科學,並研究它們對人類健康造成的影響。
  • python學習筆記:兩個變量之間的互相關圖形和簡單動畫曲線
    簡單動畫曲線(下圖實際上應該是動態圖)import numpy as npfrom matplotlib import pyplot as plt#導入animation創建動畫from matplotlib import animation#生成圖紙,設置坐標軸中x
  • NGO與NPO相關概念
    註:NGO的相關概念有不少。比如"非營利組織"、"第三部門"、"非政府組織"等等。一般來講我們這裡所指的NGO是"非營利組織",並且我們這個欄目裡將不會對這些概念作嚴格區分。下面引用兩本NGO研究著作的相關描述對這些概念作簡單介紹。以下的定義在學術界有較大爭議,僅作參考。
  • 遺傳算法的基本概念和實現(附 Java 實現案例)
    本文簡要地介紹了遺傳算法的基本概念和實現,希望能為讀者展示啟發式搜索的魅力。   如上圖(左)所示,遺傳算法當個體由多條染色體組成,每條染色體由多個基因組成。上圖(右)展示了染色體分割和組合方式。  自然選擇的概念  自然選擇的過程從選擇群體中最適應環境的個體開始。後代繼承了父母的特性,並且這些特性將添加到下一代中。
  • 什麼是機器學習中的cross entropy
    entropy是用於表示二元分類器的誤差,而cross entropy則用於表示多元分類器的誤差。對於一個用的測試樣本的元分類器,那麼cross entropy的計算公式如下:比如一個三元分類問題,有兩個測試樣本,第一個樣本:預測出來的概率為,實際標籤為,寫成one-hot的形式是;第二個樣本:預測出來概率為
  • PyTorch中的傅立葉卷積:通過FFT計算大核卷積的數學原理和代碼
    在機器學習應用程式中,使用較小的內核大小更為常見,因此PyTorch和Tensorflow之類的深度學習庫僅提供直接卷積的實現。 但是,在現實世界中,有很多使用大內核的用例,其中傅立葉卷積更為有效。PyTorch實現現在,我將演示如何在PyTorch中實現傅立葉卷積函數。
  • 可視化理解 Binary Cross-Entropy
    動機我一直在尋找一個可以向學生展示的以清晰簡潔可視化的方式解釋二值交叉熵/對數損失背後概念的博客文章。對於像我們的示例這樣的二分類,典型的損失函數是binary cross-entropy / log。損失函數:二值交叉熵/對數(Binary Cross-Entropy / Log )損失如果您查看此損失函數,就會發現:
  • 聲學中的相干性及其相關應用!
    今天我們討論的一個概念叫做「相干性」,這是在相關性的基礎上,更加深入的表述兩個信號之間的因果關係(在信號處理領域)。信號處理中的狹義定義在信號處理中,相干性是一種統計數據,可用於驗證兩個信號或數據之間的關係。它通常用於估算線性系統輸入和輸出之間的功率傳輸狀況。如果系統函數是線性的,則可以使用它來估計輸入和輸出之間的因果關係,即因果性。針對某一個頻率,其相位差恆定,幅值變化表現一致,說明這兩信號中這個頻率點的相干性較高。
  • 高等數學入門——函數微分的概念及其與導數的聯繫
    文章中的例題大多為紮實基礎的常規性題目和幫助加深理解的概念辨析題,並適當選取了一些考研數學試題。所選題目難度各異,對於一些難度較大或對理解所學知識有幫助的「經典好題」,我們會詳細講解。閱讀更多「高等數學入門」系列文章,歡迎關注數學若只如初見!
  • 互阻放大器帶寬計算方法
    摘要:互阻放大器是在光電檢測前置放大中常用的一種電路結構。在互阻放大器的設計中沒有增益帶寬積的概念,其帶寬分析往往讓設計者感到困惑。