Дискретное преобразование Фурье, дающее неправильный ответ

Я реализовал функцию дискретного преобразования Фурье следующим образом (где 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;
}

Это прекрасно работает с единственной функцией top-hat, центрированной в центре массива. Однако, если я смещу функцию top-hat на -10 единиц, используя следующий бит кода:

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;
}

Я получаю следующий вывод:

Дискретное преобразование Фурье

Где первый график — это амплитуда, а второй — действительная часть результата. Амплитуда выглядит хорошо, но реальная часть выглядит неправильно, у кого-нибудь есть идеи, почему это может быть?

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector