1

私の研究では、アルゴリズムの一部として 1-D DWT を使用し、C++ を使用して 32 ビットの ubuntu Linux でアプリケーションを作成しています。初心者の Linux ユーザーとして、コードのコンパイルとリンクに関していくつか問題があります。

C++ で離散ウェーブレット変換を実装するには;

  • code-googleページで wavelib パッケージをダウンロードし、wavelib フォルダーを main.cpp ファイルと同じフォルダーに抽出しました。fftwライブラリを必要とするwavelibのソースコードを使用しました。

  • http://www.fftw.org/から最新の fftw ライブラリをダウンロードし、指示に従ってインストールしました。

ターミナルで次のコマンドを使用してコードをコンパイルしました。

g++ -g -o main main.cpp wavelib/src/static/wavelet2s.cpp -I. -Iwavelib/src/static -I/usr/local/include -L/usr/local/lib -lfftw3

main() 関数では、ランダムな 1 次元ベクトル配列が定義され、 denoise1d() 関数が呼び出されます。denoise1d() 関数では、wavelib 関数の dwt() と idwt() が呼び出されます。

実行は次のエラーでクラッシュしました。

`/home/user/Desktop/linux/main' のエラー: free(): 次のサイズが無効です (通常): 0x0819cce0

プログラムがシグナル SIGABRT を受信し、中止されました。__kernel_vsyscall () の 0xb7fdd424

次に、コードの段階的なデバッグにコードブロックを使用しました。

fftw ライブラリの convfft() 関数が呼び出される dwt1() 関数で実行がクラッシュすることがわかりました。dwt1() 関数は、1 レベルの変換のために dwt() によって呼び出されます。

dwt1() 関数は、wavelib/src/static/wavelet2s.cpp の 1700 行で定義されています。

convfft() 関数は、wavelet2s.cpp の 1719 行で呼び出され、fftw 共有ライブラリで定義されています。

convfft() 関数呼び出しでメモリ エラーが発生するのはなぜですか? fftw ライブラリを正しくリンクできなかった可能性はありますか?

前もって感謝します。

関連するコードを以下に添付します。(上記のように、wavelib と fftw が必要です)

#include "wavelet2s.h"
#include "fftw3.h"
#include <vector>
#include <iostream>
using namespace std;

#define BufSize 64

void denoise1d(vector<double> &s, string nm);

int main (int argc, char **argv)
{
    string wfname = "db2";
    vector<double> signal(BufSize+1);
    for(int i=0; i<BufSize+1;i++)
        signal[i] = 1.0d / (double)rand();

    denoise1d(signal,wfname);
    return 0;
}

void denoise1d(vector<double> &s, string nm)
{
    vector<double> iC, iFlag, iL;

    // perform 4-Level DWT
    dwt(s, 4, nm, iC, iFlag, iL);

    // doing some denoising operations on wavelet coeffs

 //Perform 4-Level IDWT
    idwt(iC, iFlag, nm, s,iL);
}
4

1 に答える 1