Blame view

src/Parameters/fonctions/fourier/DiscreteFourierTransform.hh 3.07 KB
977f8ee1   Menouard AZIB   Creation of DFT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

#ifndef _DISCRETEFOURIERTRANSFORM_H
#define _DISCRETEFOURIERTRANSFORM_H

#include <math.h>
#include <vector>

#define PI 3.14159265

using namespace std;

template <class T, class E>

/**
 * @brief Une classe qui reprèsente une transformée de Fourier discrète (DFT) à appliquer pour
 * un signal numérique donné. Pour calculer la TFD, il est nécessaire d’avoir une bonne notation, et de bien comprendre tous les éléments qui entrent en jeu :
    Le nombre total d’échantillons (points qu’on a mesurés) est noté nbEchantillons (N)
    Pour avoir des échantillons, il faut une fréquence d’échantillonnage fe (Fe)
    On note s(k) la valeur du signal échantillonné pour le point k
    Nous pouvons, au maximum, calculer nbEchantillons valeurs de Fourier. Le nom choisi pour ces valeurs (allant de 0 à N) est k.
    Et à chacune de ces valeurs correspond une fréquence noté fk
    La valeur de Fourier pour un k donné est noté S(k) (et il s’agit d’un nombre complexe)

    @see http://gobgob-technology.fr/cours/tfd/, https://www.geeksforgeeks.org/discrete-fourier-transform-and-its-inverse-using-c/
 *
 */
class DiscreteFourierTransform
{

public:
    /**
     * @brief Construct a new Discrete Fourier Transform object
     *
     * @param nbEchantillons_ Le nombre total d’échantillons
     * @param signal_ Le signal à échantillonner
     * @param frequenceEchantillonnage_ La fréquence d’échantillonnage
     */
    DiscreteFourierTransform(int nbEchantillons_, vector<T> signal_, double frequenceEchantillonnage_);

    /**
     * @brief Calcul de la TFD
     *
     */
    void compute();

    /**
     * @brief Get the Amplitudes object
     *
     * @return vector<E>
     */
    vector<E> getAmplitudes()
    {
        return amplitudes;
    }

    /**
     * @brief Get the Frequences object
     *
     * @return vector<E>
     */
    vector<E> getFrequences()
    {
        return frequences;
    }

    /**
     * @brief Get the Phases object
     *
     * @return vector<E>
     */
    vector<E> getPhases()
    {
        return phases;
    }

    /**
     * @brief Get the Periodes object
     *
     * @return vector<E>
     */
    vector<E> getPeriodes()
    {
        return periodes;
    }

private:
    /**
     * @brief Le nombre total d’échantillons (points qu’on a mesurés)
     *
     */
    int nbEchantillons;
    /**
     * @brief le signal numérique dont on cherche à calculer la DFT
     *
     */
    vector<T> signal;
    /**
     * @brief Pour avoir des échantillons, il faut une fréquence d’échantillonnage Fe
     *
     */
    double frequenceEchantillonnage;
    /**
     * @brief L’amplitude fréquentielle (la valeur qui nous intéresse) est le module de la valeur complexe : ∥S(k)∥
     *
     */
    vector<E> amplitudes;
    /**
     * @brief La phase fréquentielle est l'argument de la valeur complexe : S(k)
     *
     */
    vector<E> phases;
    /**
     * @brief Les valeurs des fréquences fk
     *
     */
    vector<E> frequences;
    /**
     * @brief Les valeurs des periodes 1/fk
     *
     */
    vector<E> periodes;
};

#endif