【问题标题】:Deconvolution C++反卷积 C++
【发布时间】:2012-11-06 06:09:49
【问题描述】:

我从http://rosettacode.org/wiki/Deconvolution/1D#C 获得了这个一维反卷积的示例代码,但它似乎无法正常工作。在尝试构建此项目时,我首先收到此错误,“_fft”:非法使用“void”类型。如果有帮助,这段代码最初是为 C 设计的,我必须进行一些更改,例如将 include 从 complex.h 更改为 complex,以及使用命名空间 std。感谢您的帮助

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex>
using namespace std;

double PI;
complex<double> cplx;




void _fft(cplx buf[], cplx out[], int n, int step)
 {
if (step < n) {
    _fft(out, buf, n, step * 2);
    _fft(out + step, buf + step, n, step * 2);

    for (int i = 0; i < n; i += 2 * step) {
        cplx t = cexp(-I * PI * i / n) * out[i + step];
        buf[i / 2]     = out[i] + t;
        buf[(i + n)/2] = out[i] - t;
    }
}
}

void fft(cplx buf[], int n)
{
cplx out[n];
for (int i = 0; i < n; i++) out[i] = buf[i];
_fft(buf, out, n, 1);
}

cplx *pad_two(double g[], int len, int *ns)
{
int n = 1;
if (*ns) n = *ns;
else while (n < len) n *= 2;

cplx *buf = calloc(sizeof(cplx), n);
for (int i = 0; i < len; i++) buf[i] = g[i];
*ns = n;
return buf;
}

void deconv(double g[], int lg, double f[], int lf, double out[]) {
int ns = 0;
cplx *g2 = pad_two(g, lg, &ns);
cplx *f2 = pad_two(f, lf, &ns);

fft(g2, ns);
fft(f2, ns);

cplx h[ns];
for (int i = 0; i < ns; i++) h[i] = g2[i] / f2[i];
fft(h, ns);

for (int i = 0; i >= lf - lg; i--)
    out[-i] = h[(i + ns) % ns]/32;
free(g2);
free(f2);
}

int main()
{
PI = atan2(1,1) * 4;
double g[] = {24,75,71,-34,3,22,-45,23,245,25,52,25,-67,-96,96,31,55,36,29,-43,-7};
double f[] = { -3,-6,-1,8,-6,3,-1,-9,-9,3,-2,5,2,-2,-7,-1 };
double h[] = { -8,-9,-3,-1,-6,7 };

int lg = sizeof(g)/sizeof(double);
int lf = sizeof(f)/sizeof(double);
int lh = sizeof(h)/sizeof(double);

double h2[lh];
double f2[lf];

printf("f[] data is : ");
for (int i = 0; i < lf; i++) printf(" %g", f[i]);
printf("\n");

printf("deconv(g, h): ");
deconv(g, lg, h, lh, f2);
for (int i = 0; i < lf; i++) printf(" %g", f2[i]);
printf("\n");

printf("h[] data is : ");
for (int i = 0; i < lh; i++) printf(" %g", h[i]);
printf("\n");

printf("deconv(g, f): ");
deconv(g, lg, f, lf, h2);
for (int i = 0; i < lh; i++) printf(" %g", h2[i]);
printf("\n");
}

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++ math complex-numbers


    【解决方案1】:

    如果不运行它,cplx 将被用作一个类,而它实际上是一个变量。你能改变这一行吗:

    complex<double> cplx;
    

    喜欢这个

    typedef complex<double> cplx;
    

    【讨论】:

    • 我发现了同样的事情。看起来对这个有相当多的额外破坏。我以某种方式怀疑它是否在任何环境中编译过。
    • 就像我说的,我在网上找到了它,无法验证它是否曾在任何环境中编译过,但我按照建议更改为 typedef,但随后 cexp 函数不起作用。有什么想法吗?感谢您的帮助
    • 好吧,我发现exp 因复杂而过载。所以你应该替换cexp。第 40 行还有一个无效的强制转换,您想将其强制转换为 cplx*。我还发现了一个未定义的I,我认为这实际上是一个 1。最后一个问题是第 59 行的operator/。我建议你做更多的研究,如果你有更多的问题,我会在这里重新发布必须做一些工作才能弄清楚那条线实际上在做什么(但我相信我们都愿意提供帮助)
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多