2013-05-27 35 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

是的。堆栈腐败是我的目标。这可能会或可能不会导致崩溃。 –