簡體   English   中英

沒有Stackoverflow的C卷積

[英]Convolution in C without Stackoverflow

我正在嘗試在C語言中做卷積算法,但是正在卷積數組上堆疊。

#include <stdio.h>
#include <math.h>
#include <stddef.h>
#define convtotal 2590

int main(int argc, char *argv[]) {

    int m,n,i,j;
    double x[convtotal],h[convtotal];
    m=sizeof(x)/sizeof(double);
    n=sizeof(h)/sizeof(double);


    double aux1[convtotal], aux2[convtotal],conv[convtotal][1];
    for (i=0;i<n+m;i++){
        if (i<n)
            aux1[i]=x[i];
        else
            aux1[i]=0;

        if (i<m)
            aux2[i]=h[i];
        else
            aux2[i]=0;
    }


    for (i=0;(n+m-1);i++){
        conv[i][1]=0;
        for (j=0;j<m;j++)
            if (i-j+1>0)
                conv[i][1]=conv[i][1]+(aux1[j]*aux2[i-j+1]);
    }

}

對這個問題有什么建議嗎?

for (i=0;(n+m-1);i++){

不是i < m+ n - 1嗎?

for (i=0;(n+m-1);i++){
    conv[i][1]=0;
    for (j=0;j<m;j++)
        if (i-j+1>0)
            conv[i][1]=conv[i][1]+(aux1[j]*aux2[i-j+1]);
}

(n + m-1)個以常數為停止條件的無限循環。 實際上不是無限的,直到它出現段錯誤為止。

兩個問題:

for (i=0;(n+m-1);i++)

您沒有將i限制為任何值,因此當您到達數組末尾時,循環不會退出。 它只會一直遞增i直到您遇到不屬於您的內存為止,這時您會遇到段錯誤。 由於conv只適用於mn ,我想你打算寫

for (i = 0; i < n; i++)

其次,您將conv聲明為Nx1數組,這意味着第二維中唯一的合法索引可能是0,因此這些行

conv[i][1] = 0;

conv[i][1]=conv[i][1]+(aux1[j]*aux2[i-j+1]);

應該

conv[i][0] = 0;

conv[i][0]=conv[i][0]+(aux1[j]*aux2[i-j+1]);

不知道為什么要聲明一個Nx1數組(似乎可以用一個維度聲明conv ),但是我可能會遺漏一些明顯的東西。

請注意,您的xh數組最初包含隨機值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM