天天看點

C語言卷積和C語言互相關:數字信号進行中的卷積和互相關的C語言代碼

一、卷積運算

設x(n)和h(n)的卷積結果為y(n),則x(n)和h(n)卷積運算的數學表達式為

C語言卷積和C語言互相關:數字信号進行中的卷積和互相關的C語言代碼

其中x(n)的長度為xlen,h(n)的長度為hlen,則卷積之後y(n)的長度為xlen+hlen-1。從公式中我們可以看到在做卷積運算時先将h(n)關于n=0做對稱,變為h(-m),然後依次向右平移n個機關來計算y(n),我們在程式設計的時候就可以考慮到這一點,先将第一個輸入序列反轉(實際上就是對數組下标的操作),然後依次平移求得y(n)。代碼如下

//卷積函數,u,v為輸入序列,w為輸出序列,u的長度為ulen,v的長度為vlen
void conv(int *u,int ulen,int *v,int vlen,int *w){
    int i=0;
    int j=0;
    int k = ulen+vlen-1;
 
    for(i=0; i<k; i++){
        *(w+i) = 0;
        for(j=(0>i+1-vlen?0:i+1-vlen);j<=(i<ulen-1?i:ulen-1); j++){
            w[i] += u[j]*v[i-j];
        }
    }
}
           

二、相關運算

x(n)和y(n)的相關運算的數學表達式為

C語言卷積和C語言互相關:數字信号進行中的卷積和互相關的C語言代碼

其中x(n)的長度為xlen,y(n)的長度為ylen,相關運算後的序列長度為xlen+ylen-1。從表達式上可以看出,相關運算跟卷積運算很相似 ,隻不過相關運算沒有對序列做一個對稱處理,代碼和卷積運算具有很大的相似性,代碼如下:

//相關函數,u,v為輸入,w為輸出,m為u的長度,n為v的長度
void corr(int *u,int m,int *v,int n,int *w){
    int k=0;
    int i=0;//求和次數
    int wLength = m+n-1;//相關輸出序列的長度
    for(k=0;k<wLength;k++){
        *(w+k) = 0;
        for(i=(0>k+1-m?0:k+1-m);i<=(k<n-1?k:n-1);i++){
            *(w+k) +=(*(u+k-i)) *(*(v+n-1-i));
        }
    }
}
           

繼續閱讀