В моем исследовании я использую 1-D DWT как часть алгоритма, и я пишу приложение в 32-битном Ubuntu Linux с C ++. Как начинающий пользователь Linux, у меня возникли проблемы с компиляцией и компоновкой моих кодов.
Реализовать дискретное вейвлет-преобразование в C ++;
Я скачал пакет wavelib в кода 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 / статический
-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);
}
Я наконец-то узнал свою ошибку. Перед вызовом функции denoise1d определяется вектор размером 65. Однако предполагается, что dwt принимает входные размеры степени-2 (в данном случае 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;
}