2013-05-27 55 views
-6

這是我的代碼,用於查找兩個信號的卷積,但是我的輸出每次都變成零,任何人都可以解釋我的代碼中的錯誤? 我試圖compling,但我無法findout是什麼問題我的整個代碼是正確的 由於事先這個程序中的錯誤是什麼?

#include<stdio.h> 
#include<stdlib.h> 
#define array_len(x) (sizeof(x)/sizeof(double)) 
void convolution(double *signal, int nt, double *wind, int r, double *rm) 
{ 
    int i,j; 
    printf("%u\n", sizeof(wind)); 
    int l = (nt+r-1); 
    for(i=r;i<=l;i++) 
    { 
     wind[i]=0; 
    } 
     for(i=nt;i<=l;i++) 
     { 
      signal[i]=0; 
     } 
     printf("signal\n"); 
     for(i=0; i<=l; i++) 
     { 
      printf("%lf\n",signal[i]); 
     } 
     for(i=0;i<=l;i++) 
     { 
      rm[i]=0; 
      for(j=0;j<=i;j++) 
      { 
       rm[i] = (rm[i]+(signal[j]*wind[i-j])); 
      } 
     } 
} 



void main() 
{ 
    double a[] = {1,2,3,4}; 
    int i; 
    int la = array_len(a); 
    printf("\nc1\t%ld",la); 
    double b[] = {1,1,1,1} ; 
    int lb = array_len(b); 
    printf("\nc2\t%ld\n",lb); 
    double r[la+lb-1]; 
    int lr = array_len(r); 
    printf("\nc3\t%ld\n",lr); 

    printf("entering convolution\n"); 
    convolution(a,la,b,lb,r); 

    for(i=0;i<(lr);i++) 
    { 
     printf("rm[%d]=%lf\n",i,r[i]); 
    } 
} 
+2

請嘗試縮小問題 – rethab

+0

是的,我能夠編譯它 –

+0

你的輸出不是零,無論如何,我得到了一些異常的結果,這是由於訪問數組越界! –

回答

0

你試試這個!

void convolution(double *signal, int nt, double *wind, int r, double *rm) 
{ 
    int i,j; 
    printf("%u\n", sizeof(wind)); // Why you do this? this just returns the size of the pointer only 
    int l = (nt+r-1); 
    double one[l]; 
    double two[l]; 
    for(i=0;i<l;i++) 
    { 
     if (i < nt) 
      one[i] = signal[i]; 
     else 
      one[i] = 0; 
     if (i < r) 
      two[i] = wind[i]; 
     else 
      two[i] = 0; 
    } 
    printf("signal\n"); 
    for(i=0; i<l; i++) 
     printf("%lf\n",one[i]); 
    for(i=0;i<l;i++) 
    { 
     rm[i]=0; 
     for(j=0;j<=i;j++) 
     { 
      rm[i] = (rm[i]+(one[j]*two[i-j])); 
     } 
    } 
} 
+0

非常感謝你的代碼運行良好 –

0

可以不是答案爲什麼你看到0作爲答案,但,

for(i=r;i<=l;i++) 
{ 
    wind[i]=0; 
} 

for(i=nt;i<=l;i++) 
{ 
    signal[i]=0; 
} 

長度可變 'L' 是(NB + R-1),即如圖7所示,而數組傳遞到卷積函數,'b'和'a'只有4個元素,內存分配只能容納4個元素。因此,使用你的代碼,你正在爲風和信號穿越陣列邊界。我想知道爲什麼它不會崩潰。

+0

我認爲它不會崩潰,因爲它在堆棧中。是這樣嗎? –

+0

是的。堆棧腐敗是我的目標。這可能會或可能不會導致崩潰。 –