对于这篇文章的篇幅感到抱歉,但我们有一个非常具体的场景,我想提供尽可能详细的信息。
我们正在尝试编写一个MATLAB程序来控制和处理来自Newport FTIR光谱仪的数据,以用于研究应用。我们最大的障碍是从光谱仪的专有软件(MIRMAT版本1.0,与仪器捆绑在一起,并且恰好是.exe格式的旧编译的Matlab程序)中输出干涉图数据阵列,以便在我们自己的程序中使用。
MIRMAT软件提供了两种导出所需数据的方法。第一种是手动将数据保存在.txt文件中,然后可以将其手动导入到我们的程序中。不幸的是,这对我们来说不是一个可行的选择。我们需要能够在一秒钟内快速完成几次测量。
因此,我们留下了后一个选项,它涉及一个ActiveX容器,其中包含允许我们访问所需数据的方法和属性。这些可在光谱仪用户手册的第59和60页详细找到,位于:
http://assets.newport.com/webDocumentsEN/images/Oriel%20FTIR%20User%20Manual.PDF
到目前为止,我们依靠ActiveX属性RawDataBuffer和Numberpoints来获取收集所需数据数组所需的信息(见下文):
(来自Newport光谱仪用户手册第60页)
long RawDataBuffer : 指向包含干涉图数据阵列的双精度数组内存中地址的指针。 (伏)
long NumberPoints : 干涉图阵列中的数据点数
给定内存指针和数据点数作为输入,我们尝试编写以下MATLAB可执行(MEX)函数来检索我们想要的数据。该函数是用C ++编写的,由MATLAB的MEX特性编译。
/*=================================================================
* pass mem adress like this
* ptrArg = uint64(hex2dec( '00C2E4E8' ));
* myMexFile( ptrArg );
*
* Execute Function like this:
* readArray2(uint64(g),n)
*
* Where:
* g = RawDataBuffer value
* n = NumberPoints value
*=================================================================*/
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
*prhs[])
{
double *pointer; /* pointer to real data in new array */
mwSize index;
double *size;
/* Check for proper number of arguments. */
if (nrhs != 2)
{
mexErrMsgIdAndTxt( "MATLAB:yprime:invalidNumInputs","Two input
arguments required.");
}
size = mxGetPr(prhs[1]);
uint64_T mlData = *static_cast<unsigned long long *>( mxGetData(
prhs[0] ) );
double *p = reinterpret_cast<double *>( mlData );
/* Create an m-by-n mxArray; you will copy existing data into it */
plhs[0] = mxCreateNumericMatrix(1, *size, mxDOUBLE_CLASS, mxREAL);
pointer = mxGetPr(plhs[0]);
/* Copy data into the mxArray */
for ( index = 0; index < *size; index++ )
{
pointer[index] = p[index];
}
return;
}
不幸的是,这个函数不会返回我们需要的数据。它当前返回一个数组,其中所有数据点都为零。当我们从ActiveX包含内存位置时,我们将其转换为并确保Matlab将其保存为UINT64。简而言之,我们很难过。如果我们的代码可以修复/改进,或者任何人对如何排除故障或解决此问题有任何建议,我们将不胜感激。