2009-12-02 125 views
0

我有兩個時域波形,其中我需要測量MATLAB中的cross-correlation係數。我試過max(abs(xcorr(m,n,'coeff'))),但它似乎沒有正常工作。我還需要測量波形不同部分的互相關係數,例如,以1分鐘的間隔測量互相關係數。如果可能的話,將這些值輸出到矩陣或其他東西。互相關係數

我知道這是一個很多問,但我是一個MATLAB新手,並發現這項任務令人生畏!
任何幫助你可以給我這個問題的任何部分將受到感謝。


編輯: 這是我用來測試相關碼的代碼:

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcorr(x,y,'coeff'))) 
+0

我們需要比「它似乎沒有正常工作」更多的細節。你得到了什麼?你得到了什麼? – gnovice 2009-12-02 15:28:47

回答

0

我試圖最大(ABS(xcorr(M,N, '係數_') )),但它似乎沒有正常工作。

你是什麼意思?它輸出什麼,你期望什麼?

互相關中可能出現的一個問題是,波形中的直流偏置會破壞結果。據我所知,沒有通用的方法來做任何事情。您必須以某種方式確保您的波形不包含任何直流偏置。

+0

嗯,我希望0和1之間的值,在視覺上信號非常相似,有一點滯後。但是我上面輸入的代碼給出了0.77的值,這是很好的,但是如果我在Matlab中創建的兩個隨機信號上使用該代碼,則其相關係數約爲0.83,表明它們非常相似。 – Scott 2009-12-02 16:43:29

+0

請發佈代碼(通過編輯上面的問題)。很難相信兩個隨機信號之間的相關係數除了大約爲零以外幾乎都不是 - 除非它們很短,或者2)有一個直流偏置。 – 2009-12-02 18:14:09

5

根據方程this article你可以指望在這樣的交叉相關係數:如果要計算係數只對信號的某些部分

% Assuming: m and n are your signals organized as row vectors 
r = cov([m;n])/(std(m)*std(n)); 

,只需使用:

r = cov([m(1:100);n(1:100)])/(std(m(1:100))*std(n(1:100))); 

您是否也嘗試了corrcoef功能?

編輯 好吧,我已經檢查了corrcoef功能,它似乎能正常工作,一起來看看:

>> x = 100*randn(1000,1); 
>> y=34*randn(1000,1); 
>> corrcoef(x,y) 

ans = 

    1.0000 -0.0543 
    -0.0543 1.0000 

所以相關係數爲-0.0543 - 小的相似性(如預期) 。
要檢查,讓我們計算的係數相同的信號:

>> y=x; 
>> corrcoef(x,y) 

ans = 

    1  1 
    1  1 

正如預期的那樣,它是等於1

編輯。 正如你可以看到,corrcoef的結果是所有可能的相關係數的這兩個信號之間的矩陣:

 x  y 
x 1.0000 -0.0543 
y -0.0543 1.0000 

所以對於需要選擇外部的主對角線的元素之一交叉相關(有位置自相關係數,在這種情況下總是等於1)。
如果您選擇ans(2,1)或ans(1,2),則沒有區別 - 如果計算x和y的關聯或y和x的關聯,則沒有區別。

所以最終代碼應類似於此:

R = corrcoef(x,y); % Correlation matrix 
r = R(2,1); % this is your Cross-Correlation coefficient 
+0

嗨,謝謝,但是這會返回很多數字,其中大部分數字都在一個之上。我正在尋找代表相似性的單個值。任何其他建議可能有幫助? – Scott 2009-12-02 16:44:33

+0

你需要ans(1,2) – 2009-12-04 10:52:38

+0

我假設斯科特足夠聰明,可以自己做;)確定 - >編輯 – Gacek 2009-12-04 11:12:42

0

這是我用來測試的相關代碼的代碼:

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcorr(x,y,'coeff'))) 

的問題是,rand回報在區間(0,1)內均勻分佈的數字爲換句話說,你有0.5的直流偏差(平均值)!這就是爲什麼你會得到看似隨機信號的高相關係數:它們不是完全隨機的,因爲每個信號都有一個類似的常數分量,顯示在相關係數中。

因此,請嘗試使用randn來代替:它會返回隨機數,其元素爲,正態分佈均值爲0,這正是您想要的。

+0

即使消除直流偏見類似的東西: x = rand(1,14400) - 0.5; y =蘭特(1,14400) - 0.5; r = max(abs(xcorr(x,y,'coeff'))) 將解決這個「問題」。但是,使用randn的建議很好;近似正態/高斯噪聲在實際信號中很常見(主要歸功於中心極限定理),而均勻噪聲則不是。 – musicinmybrain 2009-12-07 13:08:56

1

嘗試使用互協方差代替

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcov(x,y,'coeff'))) 

互協方差序列是均值去除 序列的互相關。像Joonas提到的那樣,rand的直流偏移爲0.5,會給你一個「不正確的」結果。