Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ FFT算法中的一个缺陷_C++_Visual Studio 2010_Fft - Fatal编程技术网

C++ FFT算法中的一个缺陷

C++ FFT算法中的一个缺陷,c++,visual-studio-2010,fft,C++,Visual Studio 2010,Fft,朋友们,我现在正在编程FFT算法,我有以下程序: #include<iostream> #include<vector> #include<complex> #include<cmath> #define _USE_MATH_DEFINES #include<math.h> #include<stdlib.h> using namespace std; const complex<double> I(0,1)

朋友们,我现在正在编程FFT算法,我有以下程序:

#include<iostream>
#include<vector>
#include<complex>
#include<cmath>
#define _USE_MATH_DEFINES
#include<math.h>
#include<stdlib.h>

using namespace std;

const complex<double> I(0,1);
const int pi = M_PI;

//This function will check if a number is a power of certain number 
bool checkpower(float base,float num){
    float a = ceil(log(num)/log(base))-floor(log(num)/log(base));
    if (a==0){
        return 1;
    }
    else{
    return 0;
    }
}


//Fast Fourier Transform for DFT
vector<complex<double>> FFT_DFT(vector<complex<double>> samples){
    int N = samples.size();
    cout << N << endl;
    if(!checkpower(2,N)){
        cout << "Please make sure the sample size is of 2^n!" << endl;
        exit (EXIT_FAILURE);
    }
    else{
        vector<complex<double>> F(N);
        if(N==1){
            F.push_back(samples[0]);
        }
        else{
            int M = N/2;
            cout << M << endl;
            vector<complex<double>> O; //vector to store the odd elements
            vector<complex<double>> E; //vector to store the even elements
            //Reoder the samples
            for(int l=0;l<M;l++){
                E.push_back(samples[2*l]);
                O.push_back(samples[2*l+1]);
            }
            vector<complex<double>> ODFT;
            cout << "Start recursive for odd" << endl;
            ODFT = FFT_DFT(O);
            vector<complex<double>> EDFT;
            cout << "Start recursive for even" << endl;
            EDFT = FFT_DFT(E);
            for(int k=0;k<M;k++){
                cout << real(EDFT[k]) << " + "<< imag(EDFT[k]) << "I" << endl;
                cout << real(ODFT[k]) << " + "<< imag(ODFT[k]) << "I" << endl;
                F[k] = EDFT[k]+exp(-2.0*pi*k*I/(double)N)*ODFT[k];
                F[k+M] = EDFT[k]-exp(-2.0*pi*k*I/(double)N)*ODFT[k]; 
                cout << real(F[k]) << " + "<< imag(F[k]) << "I" << endl;
                cout << real(F[k+M]) << " + "<< imag(F[k+M]) << "I" << endl;
            }
        }
        return F;
    }
}


int main(){
    vector<complex<double>> samples;
    samples.push_back(8.0);
    samples.push_back(4.0);
    samples.push_back(8.0);
    samples.push_back(0.0);

    vector<complex<double>> dft = FFT_DFT(samples);
    vector<complex<double>>::iterator item;

    for(item=dft.begin();item!=dft.end();item++){
        cout << real(*item) << " + "<< imag(*item) << "I" << endl;
    }


    return 0;
}
我使用visual studio 2010 professional作为编译器。我不知道我的递归算法出了什么问题,所以我在VS中使用了调试模式,并逐行检查了过程,但它似乎总是给我所有值0。我用普通的FFT算法对其进行了测试,效果非常好。那么,有人能帮我看看我的节目吗?我已经调试了大约4个小时,仍然找不到错误。也许,我做了一些非常愚蠢的事,但我没有注意到

请注意,在FFT函数中,为了查看实际发生的情况,我还添加了许多cout行


谢谢你帮助我

我无法立即说出您的问题是什么,但您至少有一个严重的bug。在这里:

float a = ceil(log(num)/log(base))-floor(log(num)/log(base));
if (a==0){
    return 1;
}
除了与0.0f的有效比较之外,您不应该进行浮点计算,而希望该值是一个特定的数字。如果您预期为0.0,那么它实际上可能类似于0.00000000132。因为那是。不幸的是,他们一直都会这样工作

至于你的FFT计算,我会更仔细地观察你分配F[k]和F[k+M]的线。在这种情况下,将一个值乘以ODFT[k],我怀疑ODFT[k]可能在那里为0。

F.push_back(samples[0]);
它将一个元素添加到F中-F已经有一个元素,零-带有

F[0] = samples[0];
以一个向量结束递归,该向量的第一个元素是零,第二个元素是样本。
由于以后只使用第一个元素,因此所有元素都将变为零。

请将代码张贴在此处。要格式化它,只需选择它,然后单击问题编辑器中的{}按钮。你知道如何插入整个代码块吗?我只知道如何逐行插入代码。谢谢@奥列沙尔斯沃思,谢谢你!很抱歉,你可以忽略这个函数,因为我做了大量的测试,它工作正常。如果一个数是某个数的幂,它只返回真值,因此2,4将给出真值,而2,5不会。如果我们限制输入,我们也可以在FFT函数中删除此检查,因此主要问题是FFT算法部分此函数不起作用。它不能,除非你理解它,否则你永远无法正确地编写数学算法。用72401或0.35,0.042875试试。对不起,我没有明确指定,虽然我声明它为浮点,但我将只输入整数,因为这是我在FFT算法中需要的。我不知道您使用的是哪种编译器,但72401在我的Visual studio中工作得非常完美,它返回了1。@Cancan我提到的这两个编译器是在64位平台上使用gcc进行快速测试的失败示例。它失效的确切值也可能不同,这只会使该函数更糟糕。至于你的FFT计算,我会更仔细地观察你分配F[k]和F[k+M]的线。在这种情况下,你将一个值乘以ODFT[k],我怀疑ODFT[k]可能在那里为0。我刚刚这么做了,请看一下我最后一条评论的后半部分并编辑回答:我没有运行你的代码,但看起来它可能会失败。谢谢,哥们!这立即修复了程序!你真棒!