我正在尝试编写一个用于练习我的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 */
}
答案 0 :(得分:1)
你确实有很多指针,所以它们中的任何一个都可能导致分段错误。
从您所做的debbuging中,很可能问题出现在以下指针中:
xTr,xTi,xr或xi;
所有这些都是使用函数mxGetPr()或mxGetPi()初始化的。不知道它做了什么,不可能确定。你确定它会返回一个指向数组的指针吗?你确定两个阵列至少有m个元素吗?
你有一个非常复杂的结构,因此完全分析查找错误的所有指针是一项复杂的工作。