离散傅立叶变换给出了错误的答案

时间:2015-05-14 11:58:00

标签: c++ math numeric numerical-methods dft

我已经实现了离散傅立叶变换函数,如下所示(其中CVector是一个数组的简单包装器):

template <typename T, std::size_t Width>
CVector<std::complex<T>, Width> DiscreteFourierTransform( const CVector<T, Width>& vec )
{
    CVector<std::complex<T>, Width> vecResult;
    const std::complex<T> cmplxPrefactor( std::complex<T>( 0, -M_PI ) / (T)(Width/2) );

    for( int s = 0; s < Width; ++s )
    {
        vecResult[s] = std::complex<T>( T( 0.0 ), T( 0.0 ) );

        for( int x = 0; x < Width; ++x )
        {
            vecResult[s] += vec[x] * std::exp( cmplxPrefactor * (T)(x - (int)(Width/2)) * (T)(s - (int)(Width/2)) );
        }

        vecResult[s] /= (T)(Width);
    }

    return vecResult;
}

这适用于单个顶帽功能,以数组中心为中心。但是,如果我用-10个单位替换top-hat函数,请使用以下代码:

int main()
{
    CVector<double, 500> vecSlit;

    for( unsigned int i = 235; i <= 245; ++i )
    {
        vecSlit[i] = 1.0;
    }

    CVector<std::complex<double>, 500> vecFourierTransform = DiscreteFourierTransform( vecSlit );

    std::cout << "Saving..." << std::endl;

    if( SaveList( "offset-fourier-transform.txt", vecFourierTransform ) )
    {
        std::cout << "Save Successful!" << std::endl;
    }
    else
    {
        std::cout << "Save Unsuccessful!" << std::endl;
    }

    return 0;
}

我得到以下输出:

Discrete Fourier Transform

第一个图是幅度,第二个图是输出的实部。振幅很好,但实际部分看起来不正确,有没有人知道为什么会这样?

0 个答案:

没有答案