Вызов convfft() в fftw вызывает сбой. Это о неправильном связывании библиотек?

В своем исследовании я использую 1-D DWT как часть алгоритма и пишу приложение в 32-битной Ubuntu Linux с C++. Как начинающий пользователь Linux, у меня возникли некоторые проблемы с компиляцией и компоновкой моих кодов.

Реализовать дискретное вейвлет-преобразование на C++;

  • Я скачал пакет wavelib в code-google и извлек папку wavelib в ту же папку, что и мой файл main.cpp. Я использовал исходный код wavelib, для которого требуется библиотека fftw.

  • Я скачал последнюю версию библиотеки fftw с http://www.fftw.org/ и установил ее, следуя инструкциям.

Я скомпилировал код с помощью следующей команды в терминале.

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() определяется случайный одномерный векторный массив и вызывается функция denoise1d(). В функции denoise1d() вызываются функции wavelib, dwt() и idwt().

Выполнение завершилось с ошибкой следующим образом;

Ошибка в `/home/user/Desktop/linux/main': free(): недопустимый следующий размер (нормальный): 0x0819cce0

Программа получила сигнал SIGABRT, прервана. 0xb7fdd424 в __kernel_vsyscall()

Затем я использовал кодовые блоки для пошаговой отладки кода.

Я обнаружил, что выполнение падает в функции dwt1(), где вызывается функция convfft() из библиотеки fftw. Функция dwt1() вызывается функцией dwt() для одноуровневого преобразования.

Функция dwt1() определена в строке 1700 файла wavelib/src/static/wavelet2s.cpp

Функция convfft() вызывается в строке 1719 файла wavelet2s.cpp и определяется в разделяемой библиотеке 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);
}

person Sukru G    schedule 07.04.2015    source источник
comment
Пожалуйста, задавайте конкретные вопросы. Хорошим местом для начала будет здесь: stackoverflow.com/help/how-to-ask и здесь: stackoverflow.com/help/mcve Что мне делать? на самом деле не вопрос. Кроме того, как только вы освоитесь, вы увидите, что ТАК - это ресурс.   -  person    schedule 07.04.2015
comment
Хорошо спасибо. Я отформатирую свой вопрос, используя рекомендации. Дай мне немного времени   -  person Sukru G    schedule 08.04.2015
comment
Я думаю, что вопрос теперь более определен.   -  person Sukru G    schedule 08.04.2015


Ответы (1)


Наконец-то я узнал свой баг. Перед вызовом функции denoise1d определяется вектор размером 65. Однако предполагается, что dwt принимает входные размеры степени двойки (в данном случае 64). Я исправил ошибку, и код работает без ошибок.

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;
}
person Sukru G    schedule 11.04.2015