3

我有一个例程计算频域中的 Rice Wavelet Toolbox 中指定的移位不变离散小波变换。该代码采用 MEX(c 语法)并使用一些额外的例程来执行虚多项式。在一个单独的文件中。

源文件 fsidwt.c、fisidwt.c 和辅助例程 polyphase.[chm] 一起压缩在一个文件中:http: //ubuntuone.com/6zXIIuA3J4OTTlSquycMlz

此代码在较旧的 matlab 版本中没有问题,其他 matlab 函数依赖于它。

但是,现在,当我现在编译它时,首先会出现一条警告消息

>> mex fisidwt.c polyphase.c % message about different gcc version
>> mex fsidwt.c polyphase.c % message about different gcc version
    fsidwt.c: In function ‘multiMRFWD1D’:
    fsidwt.c:187: warning: cast to pointer from integer of different size
    fsidwt.c:188: warning: cast to pointer from integer of different size
    fsidwt.c:189: warning: cast to pointer from integer of different size
    fsidwt.c:190: warning: cast to pointer from integer of different size

这很奇怪,因为没有整数被转换为指针。但这只是一个警告,所以让我们继续。

现在,mex 文件 fsidwt 和 fisidwt 计算正向和反向频域移变小波变换。

我的测试程序很简单:

>> clear all; len_sig=256; wlevels=3; numsig=1; numtest=1; 
    % 256 points, 3 wavelet decomposition levels
>> st=4; ts=(1:(len_sig/st))'*(1:st); ts=ts(:); ts=ts*ones(1,numsig); Ts=fft(ts); 
    % sawtooth with 4 'teeth' of increasing height and its FFT
>> h=[1;1]/sqrt(2); g=qmf(h); h=[h(:) g(:)]; H=fft(h,len_sig); 
    % Haar wavelet filters and 256-point FFTs
>> [ffs ffd] = fsidwt(Ts, H, wlevels); 
    % forward wavelet transform
>> ffr=fisidwt(ffs,ffd,cH,levels); 
    % recontruction

不幸的是,它以分段违规退出,其原因我无法从核心转储输出中追踪...

代码中的行 [在 http://ubuntuone.com/6zXIIuA3J4OTTlSquycMlz 的 zip 文件中],fsidwt.c 的第 187-190 行,阅读:

Hfilter2d = (dComplexMat) dComplexMake2D ( hcomp[0],  NQ, Q);
Gfilter2d = (dComplexMat) dComplexMake2D ( hcomp[1],  NQ, Q);
Detail2d  = (dComplexMat) dComplexMake2D ( workspaced, Q, NQ);
Approx2d  = (dComplexMat) dComplexMake2D ( workspacec, Q, NQ);

所有的 LHS 都是类型

dComplexMat

这是

typedef struct {double r,i;} dComplex;
typedef dComplex *dComplexVec;
typedef dComplexVec *dComplexMat;

所有的 RHS 都是类型

(dComplexVec, long, long)

dComplexMake2D() 的代码是:

dComplexMat dComplexMake2D(
            dComplexVec array1D,
            int width, int height) {
    register int i;
    dComplexMat theMatrix = (dComplexMat) mxCalloc ( width, sizeof(dComplexVec) );
    theMatrix[0]=(dComplexVec)array1D;
    for(i=1;i<width;i++)
        theMatrix[i] = theMatrix[i-1] + height;
    return theMatrix;
}

我将如何开始查找此分段违规的原因?跟警告有关系吗?是新的Matlab版本吗?还是 64 位架构?

4

1 回答 1

1

哦亲爱的。MathWorks 帮助台在调查这个问题时发现,函数头dComplexMake2D有一个额外的东西d,我必须至少忽略了 42 次。

好尴尬。但无论如何,代码就像一个梦(很快就会上线)和一个教训:

MEX 就返回类型发出警告,dComplexMake2D因为它找不到匹配的标头,继续执行(看起来确实如此)但假定返回类型int,链接到dComplexMake2D返回指针(long int大小类型)的编译文件,这就是出错的地方...

感谢 MathWorks 的技术支持。他们确实指出调试 MEX 文件与他们无关。

于 2013-02-28T20:14:45.333 回答