比較兩波形的相似度

摘要:本文介紹了利用相關對信號波形進行相似程度的判別方法。通過該技術可以對採集到


的多種類型的數據信號間的相似度進行判別。本算法由Microsoft Visual C++ 6.0實現。 


  一、 引言 


  在工程上我們經常要判斷某設備產生的實際波形信號是否能同預先設計的相擬合,但由


於實際產生的波形不僅僅是簡單的正、餘弦波形,而往往是含有較豐富頻率分佈的不規則波


形,而設備元器件本身及外界的電磁干擾又不可避免的引入了干擾噪聲,就爲我們分析其與


預先設計波形的擬合程度的判別增加了困難。另外,實際波形和預先設計波形間往往存在着


時序上的差別,相位的改變同樣也不利於信號的擬合判別。本文利用高等數學以及信號與系


統方面的有關知識提出對該問題的解決方法。 


  二、 信號相似程度判別的理論依據 


  在信號與系統這門學科中,相關性是一種在時域中對信號特性進行描述的重要方法。由


於其通信的功率譜函數是一對傅立葉變換,在信號分析中往往利用它來分析隨機信號的功率


譜分佈,以致不少人一提到相關性馬上會聯想到信號功率譜的計算,但相關在對確定信號的


分析也是有一定應用。由於相關的概念是爲研究隨機信號的統計特性而引入的,那麼從理論


上我們也可以將其應用於兩個確定信號(一個我們採集到的信號波形和一個理論波形)相似


性的研究上。 


  要比較兩波形的相似程度還要從相關的概念上入手,假定兩信號分別爲x(t)、y(t),可


以選擇當倍數a使a*y(t)去逼近x(t)。再此我們可以借用誤差能量來度量這對波形的相似程


度,具體方法同高等數學上用來判斷函數間正交性的方法基本類似: 


  誤差能量用x(t)-a*y(t)的平方在時域上的積分來表示;倍數a的選擇必須要保證能使能


量誤差爲最小,通過對函數求導求極值可以得知當a爲x(t)*y(t)在時域的積分與y(t)*y(t)在


時域的積分比值時可以滿足條件,在此條件下的誤差能量是可能所有條件下最小的。定義


x(t)與y(t)的相關數爲Pxy,其平方與1的差值爲相對誤差能量,即誤差能量與x(t)*x(t)在時域


積分的比值。其中,xy就可以用來表徵兩波形的相似程度。解出關於Pxy的方程,其分子


爲x(t)*y(t)在時域的積分;分爲兩信號各自的平方在時域積分之積的平方根。從數學上可以


證明分子的模小於分母,也即相關數Pxy的模不會大於1。由於對於能量有限的信號而言,


能量是確定的,相關係數Pxy的大小隻由x(t)*y(t)的積分所決定。如果兩完全不相似的波形


其幅度取值和出現時刻是相互獨立、彼此無關的,x(t)*y(t)=0,其積分結果亦爲0,所以當


相關係數爲0時相似度最差,即不相關。當相關係數爲1,則誤差能量爲0,說明這兩信號


相似度很好,是線形相關的。因此把相關係數作爲兩個信號 


波形的相似性(或線形相關性)的一種度量完全是有理論依據的、合理的。 


  三、 算法的設計與實現  


  我們在對信號進行比較之前,先將理論波形做成一個數據文件,實際設備輸出的波形也


通過計算機接口採集並將數據存成數據文件。我們編寫的程序通過對兩個數據文件的相關性


比較來得出實際波形同理論波形信號的擬合度。下面就對數據文件的讀取、數據相關程度計


算等關鍵代碼作簡要的紹: 


  首先,要在計算相關係數前把參加運算的兩序列數據從文件讀取到內存(堆棧)中去,


爲了方便讀取多種數據格式的文件使程序更加靈活,選用MFC基本類庫的CFileDialog類


的成員函數來選取數文件,然後再通過CFile類的相關成員函數將其讀取到內存中: 


…… 


CFileDialog dlg(TRUE,"dat","*.dat", //TRUE爲"打開文件"窗口 


OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, 


"信號數據文件(*.dat)|*.dat|所有文件(*.*)|*.*||",NULL); 


if(dlg.DoModal()==IDOK) { 


CString FileName=""; 


FileName=dlg.GetPathName(); //取文件所在的完整路徑 


CFile file; 


file.Open(FileName,CFile::modeReadWrite); //以讀寫方式打開文件 


buf1=new char [file.GetLength()]; //爲指針動態分配堆棧 


file.Read(buf1,file.GetLength()); //將數據讀取到內存 


m_nData1Len=file.GetLength(); //獲取文件長度 


file.Close(); //關閉文件 





…… 


  上述爲讀取一個信號文件的相關代碼,其中buf1是一個char*類型的指針,該指針指向


的內存存儲有數據文件的數據,m_nData1Len 保存有第一個數據文件的長度。用同樣的方


法將第二個數據文件也讀取到內存中,指向其首地址的指針爲buf2,文件長度爲


m_nData2Len。參與運算的數據序列準備好後就可以進行這兩組信號波形的相關係數的計算


了,下面是有關的關鍵部分代碼:  


…… 


int N=m_nData1Len>m_nData2Len?m_nData2Len:m_nData1Len; 


  由於兩序列長度可能不一樣,如以較長序列爲準,將短序列不足部分補0,根據相關係


數的概念,補0部分的x(t)*y(t)的積分爲0,沒有實際意義,故以較短序列爲準可以避免不


必要的運算,運算效較高。  


…… 


float A,B,C,Pxy; 


A=B=C=Pxy=0.0f; 


…… 


  在計算機中將積分近似按離散點取和的方式進行近似的積分: 


for(int i=0;i 





A+=buf1[i]*buf2[i];//對x(t)*y(t)的積分 


B+=buf1[i]*buf1[i];//對x(t)*x(t)的積分 


C+=buf2[i]*buf2[i];//對y(t)*y(t)的積分 





Pxy=A/(sqrt(B*C));//計算出相關係數 


…… 


  最後釋放掉申請的內存: 


delete[] buf1; 


delete[] buf2;  


  四、 實驗效果的檢驗 


  下面通過一個實際的例子來檢驗一下上述程序,我們想要獲得的理想的波形如下圖


Data1所示,Data2所示波形是設備經過噪聲抑制和相位糾偏等諸多措施後產生的實際波形,


Data3所示波形是在沒有任何保護措施下得到的粗糙的波形,顯然Data2要比Data3能更好


的同設計的理想波形Data1相擬合,但只是停留在定性分析上,究竟相似程度如何,定量的


分析靠肉眼顯然是無法完成的。先對Data1和Data2波形信號進行相關係數計算,得出其相關係數爲0.793931,基本上是線形相關的,即實際的Data2信號設計的理想信號Data1的擬


合程度還是可以接受的;然後再對Data1和Data3兩波形信號進行相關係數計算,組信號的


相關係數爲 -0.013341,基本上線形不相關;再對Data2和Data3進行分析,計算結果是


0.011665,結論也是基本不相關。通過上述程序對波形信號進行的定量分析同直觀上的定性分


析是相吻的。通過實際實驗的檢驗證明該程序是可靠、實用的。 


 


  小結:本文提出的對波形信號相似程度的判斷在電子工程上有着較爲廣泛的應用,能準


確的判斷出參加比較的兩波形信號的相似程度,爲設備的改進、元器件的選型等提供可參考


的依據。另外,在判斷移動的信號是否具有線形相關性的場合,如對雷達站接收到的兩個不


同距離的目標的反射信號的分析等都可以用本算法。通過對本文介紹的相關算法的改進還可


以對信號的功率譜進行繪製、對波形信號進行更全面 


的分析。本程序在Windows 98下,由Microsoft Visual C++ 6.0編譯通過。 


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章