分段错误错误

时间:2011-05-04 13:51:23

标签: c matlab segmentation-fault mex

我正在尝试编写一个用于练习我的C的RLS过滤器的MATLAB / mex代码,当然也是为了在我设法实现这一目标后加快代码速度。但是,尝试使用输入运行以下代码时出现分段错误错误。

#include <math.h>
#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{       
    /* Macros for input data */
    #define xData prhs[0] /* Input signal to filter */
    #define dData prhs[1] /* Desired output signal */
    #define deltaData prhs[2] /* For initializing covariance matrix */
    #define lambdaData prhs[3] /* Forgetting factor */
    #define MData prhs[4] /* Filter order */

    /* Macros for output data */
    #define wData plhs[0] /* Final filter coefficients */
    #define yData plhs[1] /* Filter output signal vector */
    #define eData plhs[2] /* Error vector */
    #define WData plhs[3] /* Filter coefficients matrix */

    /* Variables */
    mxArray *xT, *P, *q, *k; /* Temp arrays */
    double *xr, *xi, *dr, *di, delta, lambda;
    double *Pr, *Pi, *qr, *qi, *kr, *ki, *xTr, *xTi, den;
    double *wr, *wi, *yr, *yi, *er, *ei, *Wr, *Wi;
    int M, Mx, Md, Nx, Nd, m, n, m1, m2, nT, l;

    /* Get pointers to input data */
    xr = mxGetPr(xData); /* Real */
    xi = mxGetPi(xData); /* Imag */
    dr = mxGetPr(dData); /* Real */
    di = mxGetPi(dData); /* Imag */
    delta = mxGetScalar(deltaData);
    lambda = mxGetScalar(lambdaData);
    M = (int)mxGetScalar(MData);

    /* Get dimensions of input data */
    Mx = mxGetM(xData); /* Number of rows in x */
    Nx = mxGetN(xData); /* Number of columns in x */
    Md = mxGetM(dData); /* Number of rows in d */
    Nd = mxGetN(dData); /* Number of columns in d */

    /* Temporary vector - size M-by-1 */
    xT = mxCreateDoubleMatrix(M, 1, mxCOMPLEX);
    xTr = mxGetPr(xT); /* Real */
    xTi = mxGetPi(xT); /* Imag */

    /* Covariance matrix - size M-by-M */
    P = mxCreateDoubleMatrix(M, M, mxCOMPLEX);
    Pr = mxGetPr(P); /* Real */
    Pi = mxGetPi(P); /* Imag */

    /* Temporary vector for computing gain vector - size M-by-1 */
    q = mxCreateDoubleMatrix(M, 1, mxCOMPLEX);
    qr = mxGetPr(q); /* Real */
    qi = mxGetPi(q); /* Imag */

    /* Gain vector - size M-by-1 */
    k = mxCreateDoubleMatrix(M, 1, mxCOMPLEX);
    kr = mxGetPr(k); /* Real */
    ki = mxGetPi(k); /* Imag */

    /* Create output vector - size Mx-by-1 */
    yData = mxCreateDoubleMatrix(Mx, 1, mxCOMPLEX); 
    yr = mxGetPr(yData); /* Real */
    yi = mxGetPi(yData); /* Imag */

    /* Create error vector - size Mx-by-1 */
    eData = mxCreateDoubleMatrix(Mx, 1, mxCOMPLEX); 
    er = mxGetPr(eData); /* Real */
    ei = mxGetPi(eData); /* Imag */

    /* Create coeff. vector - size M-by-1 */
    wData = mxCreateDoubleMatrix(M, 1, mxCOMPLEX); 
    wr = mxGetPr(wData); /* Real */
    wi = mxGetPi(wData); /* Imag */

    /* Create coeff. matrix - size M-by-Mx */
    WData = mxCreateDoubleMatrix(M, Mx, mxCOMPLEX); 
    Wr = mxGetPr(WData); /* Real */
    Wi = mxGetPi(WData); /* Imag */

    m2 = 0;
    /* Initialize covariance matrix */
    for(m1 = 0; m1 < M; m1++, m2++)
    {
        Pr[m1*M+m2] = (1/delta); /* diag(P) = (1/delta) */
        Pi[m1*M+m2] = (1/delta); /* diag(P) = (1/delta) */
    }

    for(n = 0; n < Mx; n++)
    {
        /* Compute xT_m = [x[n] x[n-1] .... x[n-(M-1)]] */
        for(m = 0; m < M; m++)
        {/* Assume zeros outside available data and zero-fill*/
            if(n < (M-1)) 
            {
                nT = n;
                for(l = 0; l < M; l++)
                {
                     xTr[l] = xr[nT]; /* Real */
                     xTi[l] = xi[nT]; /* Imag */
                     if(nT == 0)
                         break;
                     else
                         nT--;
                 }
            } /* Data available for all lags */
            else 
            {   
                 xTr[m] = xr[n-m]; /* Real */
                 xTi[m] = xi[n-m]; /* Imag */
            }
            /* Set to zero prior to filling for computing gain vector */
            qr[m] = 0; /* Real */
            qi[m] = 0; /* Imag */
        }
    }
    return;
}

Atm我已经删除了大量的代码,因为我已经设法找出错误的来源;如果我在下面的代码中注释掉以下部分,那么它就会运行(但对我来说没用)。我试图打印出数组中使用的索引,看看其中一个是否为负,但没有运气。所以我真的找不到错误。最有可能是傻事,但我无法找出错误是什么。我还在另一个函数(对于LMS过滤器)中使用下面相同的代码片段,并且它可以正常工作。两个函数之间的主要区别在于处理所需的临时数组的数量。所以最大的问题是:是否有人在代码中看到任何应该导致seg的明显错误。故障? (否则我知道代码可能不是那么好,但是当我写了一些更多的C时,这会随着时间而来。)

for(m = 0; m < M; m++)
{/* Assume zeros outside available data and zero-fill*/
    if(n < (M-1)) 
    {
        nT = n;
        for(l = 0; l < M; l++)
        {
            // xTr[l] = xr[nT]; /* Real */
            // xTi[l] = xi[nT]; /* Imag */
            if(nT == 0)
                break;
            else
                nT--;
            }
    } /* Data available for all lags */
    else 
    {   
            // xTr[m] = xr[n-m]; /* Real */
            // xTi[m] = xi[n-m]; /* Imag */
    }
    /* Set to zero prior to filling for computing gain vector */
    qr[m] = 0; /* Real */
    qi[m] = 0; /* Imag */
}

1 个答案:

答案 0 :(得分:1)

你确实有很多指针,所以它们中的任何一个都可能导致分段错误。

从您所做的debbuging中,很可能问题出现在以下指针中:

xTr,xTi,xr或xi;

所有这些都是使用函数mxGetPr()或mxGetPi()初始化的。不知道它做了什么,不可能确定。你确定它会返回一个指向数组的指针吗?你确定两个阵列至少有m个元素吗?

你有一个非常复杂的结构,因此完全分析查找错误的所有指针是一项复杂的工作。