Ошибка ошибки сегментации - PullRequest
1 голос
/ 04 мая 2011

Я пытаюсь написать код MATLAB / mex для фильтра RLS для отработки моего C и, конечно же, для ускорения кода, как только мне удастся добиться этого.Тем не менее, я получаю ошибку ошибки сегментации при попытке запустить следующий код со входами.

#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), и там он работает как надо.Основное различие между этими двумя функциями заключается в количестве временных массивов, необходимых для обработки.Итак, главный вопрос: кто-нибудь видит какую-либо очевидную ошибку в коде, которая должна привести к сегменту?вина?(В противном случае я знаю, что код, вероятно, не так хорош, как может, но это произойдет со временем, когда я напишу еще немного CI).

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 Ответ

1 голос
/ 04 мая 2011

У вас есть много указателей, поэтому любой из них может быть причиной ошибки сегментации.

Из сделанной вами отладки, скорее всего, проблема в одном из следующих указателей:

xTr, xTi, xr или xi;

Все они инициализируются с помощью функции mxGetPr () или mxGetPi (). Не зная, что он делает, невозможно быть уверенным. Вы уверены, что он возвращает указатель на массив? Вы уверены, что оба массива имеют как минимум m элементов?

У вас там довольно сложная структура, поэтому сложно полностью проанализировать все указатели, чтобы найти ошибку.

...