我有一个例程计算频域中的 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 位架构?