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 ビット アーキテクチャですか?