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

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

1

Решение

Я наконец-то узнал свою ошибку. Перед вызовом функции 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;
}
1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector