c++ - fftw 中的 convfft() 调用导致崩溃。是关于不正确的库链接吗?

标签 c++ g++ fftw wavelet dwt

在我的研究中,我使用一维 DWT 作为算法的一部分,并使用 C++ 在 32 位 ubuntu linux 中编写应用程序。作为 Linux 新手,我在编译和链接代码时遇到了一些问题。

用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() 函数中,定义了一个随机的一维 vector 数组,并调用了 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 ()

然后我使用代码块来逐步调试代码。

我发现在调用 fftw 库中的 convfft() 函数的 dwt1() 函数中执行崩溃。 dwt1() 函数由 dwt() 调用,用于一级转换。

dwt1() 函数定义在 wavelib/src/static/wavelet2s.cpp 的第 1700 行

convfft() 函数在 wavelet2s.cpp 的第 1719 行调用并在 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 大小的 vector 。但是,假定 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;
}

关于c++ - fftw 中的 convfft() 调用导致崩溃。是关于不正确的库链接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29494630/

相关文章:

C++ 从 back_insert_iterator 转换为仿函数中的迭代器

c++ - std::mem_fn(&method_defined_with_forceinline)(*this) 未内联

c - 真实数据序列上的 FFTW

c - Mac OS X Mavericks 问题上的 FFTW

c++ - CArray<int, int> 和 CArray<int, int&> 有什么区别?

c++ - 整数到 double 的转换

c++ - 在 mac os x (10.8) 中链接

2d - fftw c2c : missing symmetry in transformed real data

c++ - OpenGL header 中的平台特定宏

c++ - Open MP:SIMD循环中的SIMD兼容功能?