В своем исследовании я использую 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);
}