fftw 中的 convfft() 调用导致崩溃。是关于不正确的库链接吗?
convfft() call in fftw causes crash. Is it about improper library linking?
在我的研究中,我使用 1-D DWT 作为算法的一部分,并使用 C++ 在 32 位 ubuntu linux 中编写应用程序。作为新手 linux 用户,我在编译和 link 代码方面遇到了一些问题。
用C++实现离散小波变换;
我在code-google页面下载了wavelib包,并将wavelib文件夹解压到与我的main.cpp文件相同的文件夹。我使用了需要 fftw 库的 wavelib 源代码。
我从 http://www.fftw.org/ 下载了最新的 fftw 库,并按照给定的说明安装了它。
我在终端中使用以下命令编译了代码。
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()。
执行崩溃,错误如下;
Error in `/home/user/Desktop/linux/main': free(): invalid next size (normal): 0x0819cce0
Program received signal SIGABRT, Aborted. 0xb7fdd424 in
__kernel_vsyscall ()
然后我用codeblocks一步步调试代码
我发现在调用 fftw 库中的 convfft() 函数的 dwt1() 函数中执行崩溃。 dwt1() 函数由 dwt() 调用进行一级转换。
dwt1() 函数在 wavelib/src/static/wavelet2s.cpp
的第 1700 行定义
convfft() 函数在 wavelet2s.cpp 的第 1719 行调用并在 fftw 共享库中定义
为什么调用convfft()函数会导致内存错误?有没有可能我不能 link 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;
}
在我的研究中,我使用 1-D DWT 作为算法的一部分,并使用 C++ 在 32 位 ubuntu linux 中编写应用程序。作为新手 linux 用户,我在编译和 link 代码方面遇到了一些问题。
用C++实现离散小波变换;
我在code-google页面下载了wavelib包,并将wavelib文件夹解压到与我的main.cpp文件相同的文件夹。我使用了需要 fftw 库的 wavelib 源代码。
我从 http://www.fftw.org/ 下载了最新的 fftw 库,并按照给定的说明安装了它。
我在终端中使用以下命令编译了代码。
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()。
执行崩溃,错误如下;
Error in `/home/user/Desktop/linux/main': free(): invalid next size (normal): 0x0819cce0
Program received signal SIGABRT, Aborted. 0xb7fdd424 in __kernel_vsyscall ()
然后我用codeblocks一步步调试代码
我发现在调用 fftw 库中的 convfft() 函数的 dwt1() 函数中执行崩溃。 dwt1() 函数由 dwt() 调用进行一级转换。
dwt1() 函数在 wavelib/src/static/wavelet2s.cpp
的第 1700 行定义convfft() 函数在 wavelet2s.cpp 的第 1719 行调用并在 fftw 共享库中定义
为什么调用convfft()函数会导致内存错误?有没有可能我不能 link 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;
}