2015-04-07 3 views
1

Dans mon étude, j'utilise DWT 1-D dans le cadre de l'algorithme et j'écris l'application en Ubuntu linux 32 bits avec C++. En tant qu'utilisateur linux novice, j'ai quelques problèmes pour compiler et lier mes codes. Pour mettre en œuvre la transformée en ondelettes discrète en C++;L'appel de convfft() dans fftw provoque un crash. Est-ce une mauvaise liaison avec une bibliothèque?

  • J'ai téléchargé le paquet wavelib dans la page code-google et décompressé le dossier wavelib dans le même dossier avec mon fichier main.cpp. J'ai utilisé le code source de wavelib qui nécessite une bibliothèque fftw.

  • J'ai téléchargé la dernière bibliothèque fftw de http://www.fftw.org/ et l'ai installée par des instructions données.

J'ai compilé le code avec la commande suivante dans le terminal.

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

En fonction main(), est défini un réseau aléatoire un vecteur dimensionnel et la denoise1d() La fonction est appelée. Dans la fonction denoise1d(), les fonctions wavelib, dwt() et idwt() sont appelées.

L'exécution s'est bloquée avec une erreur comme suit;

Erreur dans `/ home/user/Desktop/linux/main': libre(): invalide suivant la taille (normal): 0x0819cce0

Programme signal reçu SIGABRT, Aborted. 0xb7fdd424 dans __kernel_vsyscall()

J'ai ensuite utilisé codeblocks pour le débogage étape par étape du code.

J'ai découvert que l'exécution se bloque dans la fonction dwt1() où la fonction convfft() de la bibliothèque fftw est appelée. La fonction dwt1() est appelée par dwt() pour la transformation à un niveau.

dwt1() fonction est définie à la ligne 1700 de wavelib/src/fonction statique/wavelet2s.cpp

convfft() est appelée à la ligne 1719 de wavelet2s.cpp et défini dans la bibliothèque partagée fftw

Pourquoi l'appel de la fonction convfft() provoque-t-il une erreur de mémoire? Est-il possible que je ne puisse pas lier correctement la bibliothèque fftw?

Merci d'avance.

Les codes associés sont joints ci-dessous. (nécessite wavelib et fftw comme indiqué ci-dessus)

#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); 
} 
+0

Veuillez poser des questions spécifiques. Un bon point de départ serait ici: http://stackoverflow.com/help/how-to-ask et ici: http://stackoverflow.com/help/mcve "Que dois-je faire?" ce n'est pas vraiment une question. En dehors de cela, une fois que vous aurez compris, vous verrez que SO est "la" ressource. –

+0

Ok merci. Je vais formater ma question en utilisant des recommandations. Laissez-moi un peu de temps –

+0

je pense que la question est maintenant plus précise. –

Répondre

1

J'ai finalement découvert mon bogue. Avant d'appeler la fonction denoise1d, un vecteur de taille 65 est défini. Cependant, dwt est supposé accepter des tailles d'entrée de puissance-de-2 (dans ce cas 64). J'ai corrigé le bug et le code s'exécute sans erreur.

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

    denoise1d(signal,wfname); 
    return 0; 
}