我正在尝试为 RLS 过滤器编写 MATLAB/mex 代码来练习我的 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 过滤器)中使用了下面相同的代码片段,它在那里正常工作。这两个函数之间的主要区别在于处理所需的临时数组的数量。所以最大的问题是:有没有人看到代码中有任何明显的错误会导致段。过错? (否则,我知道代码可能不如它所能做到的那么好,但我假设,当我编写更多 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 */
}
最佳答案
你确实有很多指针,所以它们中的任何一个都可能导致段错误。
从您所做的调试来看,问题很可能出在以下几点之一:
xTr、xTi、xr 或 xi;
所有这些都使用函数 mxGetPr() 或 mxGetPi() 进行初始化。不知道它做了什么,就不可能确定。你确定它返回一个指向数组的指针吗?你确定两个数组至少有 m 个元素吗?
那里的结构相当复杂,因此要全面分析所有指针以找出错误是一项复杂的工作。
关于c - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884482/