1. 程式人生 > >訊號(互)相關及其應用

訊號(互)相關及其應用

在訊號處理中,經常要研究兩個訊號的相似性,或者一個訊號經過一段時間延遲後自身的相似性,以便實現訊號檢測、識別與提取等。

可用於研究訊號相似性的方法稱為相關,該方法的核心概念是相關函式和互相關函式

1 相關函式定義

無限能量訊號,訊號x(n)與y(n)的互相關函式定義為


等於將x(n)保持不動,y(n)左移m個抽樣點後,兩個序列逐點對應相乘的結果。


當x(n)與y(n)不是同一訊號時,rxy中的x、y順序是不能互換等價的。

當x(n)與y(n)為同一訊號時,記


為訊號x(n)的自相關函式在m時刻的值。自相關函式反映了x(n)和其自身發生m個取樣點平移後的相似程度。

可以想象,當m=0時,即原訊號不做任何平移,一一對應的疊加時rx(m)值最大

,這個結論很重要。

對於有限能量訊號或週期訊號,設訊號為覆信號,自相關函式和互相關函式可表達為



注意:

(1)m的取值範圍可以從-(N-1)到(N-1),對於N點訊號,rx共可計算得2N-1點相關函式結果值

(2)對於給定的m,因為實際訊號總是有限長的N,所以要計算rx(m),n+m=N-1,因此實際寫程式時注意n的實際可取長度為N-1-m

(3)當m值越大時,對於N點有限長訊號,可用於計算的訊號長度越短,計算出的rx(n)效能越差,因此實際應用中常令m<<N

(4)Matlab自帶的xcorr函式可用於計算互相關,但計算結果是沒有除以N的結果。

2 基於定義的相關函式計算

/* 
 * FileName : correl.c
 * Author   : xiahouzuoxin    [email protected]
 * Date     : 2014/2/16
 * Version  : v1.0
 * Compiler : gcc
 * Brief    : 
 */
#include <stdio.h>

typedef struct {
    float real;
    float imag;
} complex;


static void assert_param(int32_t x)
{

}

/*---------------------------------------------------------------------
  Routine CORRE1:To estimate the biased cross-correlation function
  of complex arrays x and y. If y=x,then it is auto-correlation.
  input parameters:
     x  :n dimensioned complex array.
     y  :n dimensioned complex array.
     n  :the dimension of x and y.
     lag:point numbers of correlation.
  output parameters:
     r  :lag dimensioned complex array, the correlation function is
         stored in r(0) to r(lag-1).
---------------------------------------------------------------------*/
void corre1(complex x[],complex y[],complex r[],int n,int lag)
{
    int m,j,k,kk;

    assert_param(lag >= 2*n-1);

    for (k=n-1; k>0; k--) {  /* -(N-1)~0 PART */
        kk = n-1-k;
        r[kk].real = 0.0;
        r[kk].imag = 0.0;
        for (j=k; j<n; j++) {
            r[kk].real += y[j-k].real*x[j].real+y[j-k].imag*x[j].imag;
            r[kk].imag += y[j-k].imag*x[j].real-y[j-k].real*x[j].imag;
        }
//        r[kk].real=r[kk].real/n;
//        r[kk].imag=r[kk].imag/n;
    }
    for (k=0; k<n; k++) {  /* 0~(N-1) PART */
        kk = n-1+k;
        m = n-1-k;
        r[kk].real = 0.0;
        r[kk].imag = 0.0;
        for (j=0; j<=m; j++) {
            r[kk].real += y[j+k].real*x[j].real+y[j+k].imag*x[j].imag;
            r[kk].imag += y[j+k].imag*x[j].real-y[j+k].real*x[j].imag;
        }
//        r[kk].real=r[kk].real/n;
//        r[kk].imag=r[kk].imag/n;
    }

    return;
}

#define SIG_N    5
complex x[SIG_N];
complex y[SIG_N];
complex r[2*SIG_N-1];

int main(void)
{
    int i = 0;

    x[1].real = 1;
    x[2].real = 2;
    x[3].real = 3;
    x[4].real = 4;
    x[0].real = 5;
    
    x[1].imag = 0;
    x[2].imag = 0;
    x[3].imag = 0;
    x[4].imag = 0;
    x[0].imag = 0;

    y[1].real = 2;
    y[2].real = 4;
    y[3].real = 5;
    y[4].real = 6;
    y[0].real = 1;

    y[1].imag = 0;
    y[2].imag = 0;
    y[3].imag = 0;
    y[4].imag = 0;
    y[0].imag = 0;

    corre1(x,y,r,5,9);

    for (i=0; i<2*SIG_N-1; i++) {
        printf("r[%d].real=%.2f, r[%d].imag=%.2f\n", i, r[i].real, i, r[i].imag);
    }
} 
執行輸出結果如下,
r[0].real=4.00, r[0].imag=0.00
r[1].real=11.00, r[1].imag=0.00
r[2].real=24.00, r[2].imag=0.00
r[3].real=37.00, r[3].imag=0.00
r[4].real=54.00, r[4].imag=0.00
r[5].real=42.00, r[5].imag=0.00
r[6].real=37.00, r[6].imag=0.00
r[7].real=31.00, r[7].imag=0.00
r[8].real=30.00, r[8].imag=0.00

從0~8依次儲存的是m=-(N-1)到(N-1)的結果。為驗證正確性,我們不妨用matlab自帶的xcorr計算

>> y = [1 2 4 5 6]
y =
     1     2     4     5     6
>> x = [5 1 2 3 4]
x =
     5     1     2     3     4

>> xcorr(x,y)
ans =
   30.0000   31.0000   37.0000   42.0000   54.0000   37.0000   24.0000   11.0000    4.0000

結果一致,只是儲存順序相反。

3 使用FFT計算相關函式

採用暴力的按定義計算訊號相關的方法的計算複雜度約O(N^2),當資料點數N很大時,尤其在DSP上跑時耗時過長,因此採用FFT和IFFT計算互相關函式顯得尤為重要。

那麼,互相關函式與FFT之間又是一種什麼樣的關係呢?

設y(n)是x(n)與h(n)的互相關函式,


則,


誒,這不對啊,不是說兩個訊號時域的卷積才對應頻域的乘積嗎?難道時域的互相關和時域的卷積等價了不成??

這裡說明下,通過推倒可以得到,相關於卷積的關係滿足:


不管如何,與直接卷積相差一個負號。這時,看清楚了,相關函式在頻域也不完全是乘積,是一個訊號的共軛再與原訊號乘積,這就是與“時域卷積頻域相乘不同的地方”。

所以,請記住這個有用的結論,

兩個訊號的互相關函式的頻域等於X訊號頻域的共軛乘以Y訊號的頻域

我們就有計算互相關的新方法了:將訊號x(n)和h(n)都進行FFT,將FFT的結果相乘計算得互相關函式的FFT,在進行逆變換IFFT得到互相關函式y(m)。

typedef complex TYPE_CORREL;

/*
 * @brief  To estimate the biased cross-correlation function
 *   of TYPE_CORREL arrays x and y. 
 *   the result will store in x, size of x must be >=2*m
 * @input params 
     x : n dimensioned TYPE_CORREL array. 
     y : n dimensioned TYPE_CORREL array.
     m : the dimension of x and y.    
     n : point numbers of correlation.
     icorrel: icorrel=1, cross-correlation; icorrel=0, auto-correlation
 * @retval None
 *
 * ====
 * TEST OK 2013.01.14
 */
void zx_xcorrel(TYPE_CORREL x[], TYPE_CORREL y[], int m, int n, int icorrel)
{
    int s,k;
    TYPE_CORREL z;

    assert_param(n >= 2*m);

    /* n must be power of 2 */
    s = n;
    do {
        s = s >> 1;
        k = s - 2;
    } while (k > 0);
    if (k<0) return;

	/* Padding 0 */
	for (k=m; k<n; k++) {
        x[k].real = 0.;
		x[k].imag = 0.0f;
	}
    fft(x, n);
      
    if (1 == icorrel) {  
	    /* Padding 0 */
		for (k=m; k<n; k++) {
            y[k].real = 0.;
			y[k].imag = 0.0f;
		}
		fft(y, n);

        /* conjuction */
        for (k=0; k<n; k++) {
            z.real = x[k].real; 
            z.imag = x[k].imag;
            x[k].real = (z.real*y[k].real + z.imag*y[k].imag)/(float)m;
            x[k].imag = (z.real*y[k].imag - z.imag*y[k].real)/(float)m;
        } 
    } else {
        for (k=0; k<n; k++) {
            x[k].real = (x[k].real*x[k].real+x[k].imag*x[k].imag) / (float)(m);
			x[k].imag = 0.0f;
		}
	}

    ifft(x, n);

	return;   
}

Matlab中自帶的xcorr也是通過FFT實現的互相關函式計算,這將互相關函式計算的複雜度降低到

4 應用

互相關函式有許多實際的用途,比如通過不同的感測器檢測不同方向到達的聲音訊號,通過對不同方位感測器間的訊號進行互相關可計算聲音到達不同感測器間的時延。自相關函式還可以用來計算週期訊號的週期。對此,有時間將還會對此進行詳細研究。

參考資料

[1] 《數字訊號處理——理論、演算法與實現》,胡廣書
[2]  劉永春,陳琳. 基於廣義互相關時延估計演算法聲源定位的研究.
[3]  金中薇,姜明順等. 基於廣義互相關時延估計演算法的聲發射定位技術. 感測技術學報. 第26卷11期,2013年11月.

相關推薦

訊號相關及其應用

在訊號處理中,經常要研究兩個訊號的相似性,或者一個訊號經過一段時間延遲後自身的相似性,以便實現訊號檢測、識別與提取等。 可用於研究訊號相似性的方法稱為相關,該方法的核心概念是相關函式和互相關函式。 1 相關函式定義 無限能量訊號,訊號x(n)與y(n)的互相關函式定義為

郝夫曼Huffman及其應用

1. 基本概念 路徑長度:樹中一個結點到另一個結點路徑上的分支數目。 樹的路徑長度:從樹根到每一結點的路徑長度之和。 帶權路徑長度:結點到樹根之間的路徑長度與結點上權的乘積。 樹的帶權路徑長度(WPL):樹中所有葉子結點的帶權路徑長度之和。 郝夫曼樹(

一文詳解蒙特卡洛Monte Carlo及其應用

概述 蒙特卡羅方法是一種計算方法。原理是通過大量隨機樣本,去了解一個系統,進而得到所要計算的值。 它非常強大和靈活,又相當簡單易懂,很容易實現。對於許多問題來說,它往往是最簡單的計算方法,有時甚至是唯一可行的方法。它誕生於上個世紀40年代美國的"曼哈頓計劃",名字

QT54程式碼實現應用訊號槽例項

一、基於Qt5的程式碼 除了使用Qt的《設計》來快速新增控制元件,同樣可以使用程式碼來新增控制元件。 二、新建專案 在新建專案過程中時取消建立介面,Qt將不會幫我們建立UI程式碼,需要我們手工新增。 三、新增程式碼 1、在mainwindo

神經網絡結構在命名實體識別NER中的應用

field edi most 好的 向量 後來 目標 領域 png 神經網絡結構在命名實體識別(NER)中的應用 近年來,基於神經網絡的深度學習方法在自然語言處理領域已經取得了不少進展。作為NLP領域的基礎任務—命名實體識別(Named Entity Recogni

雪飲者 決策樹系列決策樹應用

ssi 字符串長度 mes pla 選擇 font com vector nac   本篇以信息增益最大作為最優化策略來詳細介紹決策樹的決策流程。   首先給定數據集,見下圖    註:本數據來源於網絡 本篇將以這些數據作為訓練數據(雖然少,但足以介紹清楚原理!),下圖是決

Redis相關命令

redis redis.conf redis-cli(一)簡介Redis 命令用於在 redis 服務上執行操作。要在 redis 服務上執行命令需要一個 redis 客戶端。Redis 客戶端在我們之前下載的的 redis 的安裝包中。Redis 客戶端的基本語法為:redis-cli[[email

【Android個人理解】跨應用調用不同組件的方法

返回 使用 turn 數字 現實 rpc 文件夾 cas rgb 如果情景: 創建兩個應用appA和appB,appA包括一個Service,此Service有一個堵塞方法每隔10秒鐘產生一個隨機數字,例如以下: public int getRandom

用戶user和用戶組group相關的配置文件、命令或目錄;

req 相關 sed logout val execute pmo warning cto 1、與用戶(user)和用戶組(group)相關的配置文件; 1)與用戶(user)相關的配置文件;/etc/passwd 註:用戶(user)的配置文件;/etc/shadow 註

JXLS 2.4.0系列教程——更進一步的應用和bug修復

erl dir 問題 create sna 過程 idl es2017 cal 註:本文代碼建立於前面寫的代碼。不過不看也不要緊。   前面的文章把JXLS 2.4.0 的基本使用寫了一遍,現在講講一些更進一步的使用方法。我只寫一些我用到過的方法,更多的高級使用方法請參

Struts2學習筆記1---相關配置

XML def rec 模塊 定向 -1 開發 oba 合並 Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合並的全新的Struts 2框架。 1創建action對象(三種) 1 創建普通的類,不繼承任何類,也不

L2-001. 緊急救援PAT~最短路應用

長度 eof pan sizeof clas ron 全國 color jks 作為一個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連接城市的快速道路。每個城市的救援隊數量和每一條連接兩個城市的快速道路長度都標在地圖上。當其他城市有

javaScrip字符串String相關

字符串 join [] news push javascrip fun abc 獲取 -----------------------------------------此頁只記錄前端關於String的東西-----------------------------------

身份認證系統多WEB應用的單點登錄

會有 求和 頂級域名 等等 票據 什麽 多個 另一個 如何解決 隨著互聯網的發展,web應用的復雜度也一直在提升,慢慢的單一的web應用已經不能滿足復雜的業務需求。例如百度的搜索、新聞、百科、貼吧,其實本質上都是不同的網站。當用戶使用這些平臺的時候,我們當然不希望用戶在每一

python簡單應用

總結 限制 循環語句 簡單 light highlight true ... 添加 自學之後運用循環語句和判斷語句所解決的幾個簡單問題: 1、實現1到10的和: x = 1 he = 0 while x < 11: if x == 7: pa

如何使用JavaScript UI控制元件WijmoJS構建Electron應用程式

概述 What is Electron? Electron是一個使用JavaScript、HTML和CSS構建跨平臺桌面應用程式的框架。 您可以將Electron與純JavaScript或您選擇的JavaScript框架一起使用: React Angular Vue 構建

Spring.NET教程依賴注入(應用篇)

談到高階語言程式設計,我們就會聯想到設計模式;談到設計模式,我們就會說道怎麼樣解耦合。而Spring.net的IoC容器其中的一種用途就是解耦合,其最經典的應用就是:依賴注入(Dependeny Injection)簡稱DI,目前DI是最優秀的解耦方式之一。下面我就來談談依賴注入的應用場景。 我模擬了三種不

自考計算機及應用專業——資料結構導論

前言 這本書的視訊教程不好找,我也沒有去找過,其實國內所有講資料結構的教科書都差不多,全是從嚴蔚敏的資料結構演變而來,所以我在拿到本書之前,看了blibli上上海交大的演算法與資料結構的公開課,然後自習這本書,不懂就再看相關部分的視訊或者百度,我根據考試重點來解剖這本書,也許還會出一篇

訊號signal

訊號本質   訊號是軟體中斷,是在軟體層次上對中斷的一種模擬 訊號產生(來源) 1.硬體來源:比如我們按下了鍵盤或者其它硬體故障; 2.軟體來源:最常用傳送訊號的系統函式是kill, raise, alarm和pause; 訊號遞送   當導致產生訊號的事件發生時,核心就產生一個訊號。訊號產生後,

ASIO—下一代C++標準可能接納的網路庫1簡單的應用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!