DFT (transformée de fourier discrète) avec C++ STL
J'essaie de calculer la TFD pour ce tableau x_1
. Il doit être simple, mais mes valeurs sont trop faibles. Quel est le problème avec mon code?
Veuillez pas des liens vers d'autres exemples - juste à la recherche d'une solution pour mon propre code.
#include <iostream>
#include <complex>
#include <cassert>
int main ()
{
const unsigned int N = 20;
const double x_1[N] = {0, 0.3, 0.6, 0.8, 1, 1, 0.9, 0.7, 0.5, 0.2, 0.2, 0.5, 0.7, 0.9, 1, 1, 0.8, 0.6, 0.3, 0};
for(unsigned int k = 0; k < N; k++)
{
std::complex<double> sum(0.0,0.0);
for(unsigned int j = 0; j < N; j++)
{
int integers = -2*j*k;
std::complex<double> my_exponent(0.0, M_PI/N*(double)integers);
sum += x_1[j] * std::exp(my_exponent);
}
std::cout << abs(sum)/N << std::endl;
}
return 0;
}
Savez-vous qui sont les valeurs de sortie pour l'entrée?
Oui, je les connais, et elles sont beaucoup plus élevées - Donc, je dois être mauvais. la 11ème valeur doit être autour de 0,48.
Oui, je les connais, et elles sont beaucoup plus élevées - Donc, je dois être mauvais. la 11ème valeur doit être autour de 0,48.
OriginalL'auteur Johannes | 2012-05-03
Vous devez vous connecter pour publier un commentaire.
Pourquoi êtes-vous en divisant par N?
Les coefficients sont sans division. Voir la wiki.
Ce sont les valeurs que j'obtiens avec Matlab:
et je vois plus ou moins les mêmes valeurs quand j'ai l'impression à l'aide
std::cout << sum << std::endl;
Merci d'essayer avec matlab, alors le calcul doit être correcte... Pourquoi est la première valeur (12.0)?
La valeur DC est la somme de toutes les valeurs. Si vous somme de toutes les valeurs, vous obtiendrez 12.
Est-ce à résoudre votre problème? Dans le cas où il le fait, vous pouvez peut-être voter et accepter la réponse? Merci 🙂
En fait, je ne sais pas quel est le problème avec mes résultats. Mais votre MATLAB sortie montre que mon code est correct. Je vais trouver plus par semaine, mais je pense que vous devriez obtenir un "accepter" 🙂
OriginalL'auteur BertR
Je pense que la ligne
integers = -2*j*k
ne devriez pas avoir de signe moins (-) parce que ce n'est pas la transformation inverseOriginalL'auteur Abzal Serekov