在同一个应用程序中使用float和double support编译kiss fft

时间:2017-03-01 17:05:53

标签: c++ visual-studio visual-studio-2013 kissfft

我正在尝试使用visual studio 2013在同一个应用程序中编译kiss fft来编译float和double实现。我看到我需要做的就是将kiss_fft_scalar设置为double并重新编译以获得double。 / p>

为此,我整理了一个标题,我在其中包含了kiss_fft_scalar在2个不同名称空间内更改的标题,如下所示:

namespace KissFloat
{
    #undef KISS_FFT_H
    #undef KISS_FTR_H
    #define kiss_fft_scalar float
    #include "kiss_fft.h"
    #include "tools/kiss_fftr.h"
};

namespace KissDouble
{
    #undef KISS_FFT_H
    #undef KISS_FTR_H
    #define kiss_fft_scalar double
    #include "kiss_fft.h"
    #include "tools/kiss_fftr.h"
};

但我无法弄清楚如何包含cpp代码。我尝试了一个单独的KissFloat和KissDouble文件。然后我在cpp文件中尝试了一些东西,但我尝试的所有内容都会导致编译错误。通常与结构重新定义有关。

有人能想出办法让这项工作成功吗?或者我最好使用模板重写kiss fft?

2 个答案:

答案 0 :(得分:1)

有趣的想法,但你可能有更好的运气只是黑客攻击文件,例如使pub struct CodeGen { context: CBox<Context>, builder: CSemiBox<'static, Builder>, module: CSemiBox<'static, Module>, } impl CodeGen { pub fn new() -> CodeGen { let c = Context::new(); // returns a CBox<Context> let c_static_ref: &'static _ = unsafe { let c_ptr = c.as_ptr() as *const _; // get the underlying heap pointer &*c_ptr }; let b = Builder::new(c_static_ref); let m = Module::new("test", c_static_ref); CodeGen { context: c, builder: b, module: m, } } } 成为模板参数。一个问题是头文件将包括其他头文件,如kiss_fft_scalar。我想你可以在做命名空间技巧之前先先包含这些文件。

我猜这个struct redef错误是针对stdlib.h中的kiss_fft_state吗? 如果在包含.c文件之前有单独的Float / Double .cpp文件和使用指令,它可能会有效。

如果您决定对其进行模板化,可以查看Why can't I store a value and a reference to that value in the same struct?

答案 1 :(得分:0)

所以我发现Eigen已经完成了模仿吻FFT的工作。对其他人的辛勤工作! ;)

Eigen可在此处获取:

https://bitbucket.org/eigen/eigen/src

并且吻fft实现在

之下

&#34;不支持/本征/ SRC / FFT /&#34;