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 ヘルプデスクがこれを調査していたところ、 の関数ヘッダーに、私が少なくとも 42 回見落としたに違いないdComplexMake2D余分なものがあることがわかりました。d

とても恥ずかしい。とにかく、コードは夢のように機能し (すぐにオンラインに公開されます)、次の教訓が得られました。

dComplexMake2DMEX は、一致するヘッダーを見つけることができなかったため、戻り値の型について警告しました (実行されているように) が実行されましたが、戻り値の型 が想定intされ、コンパイル済みファイルにリンクされdComplexMake2D、ポインタ (long intサイズの付いた型) が返され、そこで問題が発生しました。 ...

MathWorks の技術サポートに感謝します。彼らは、MEX ファイルのデバッグは決して彼らの仕事ではないことを指摘しました。

于 2013-02-28T20:14:45.333 に答える