Transformée de Fourier discrète

J'essaie actuellement d'écrire un algorithme de Transformée de fourier. J'ai commencé avec un algorithme DFT simple comme décrit dans la définition mathématique:

public class DFT {
    public static Complex[] Transform(Complex[] input) {
        int N = input.Length;

        Complex[] output = new Complex[N];

        double arg = -2.0 * Math.PI / (double)N;
        for (int n = 0; n < N; n++) {
            output[n] = new Complex();
            for (int k = 0; k < N; k++)
                output[n] += input[k] * Complex.Polar(1, arg * (double)n * (double)k);
        }
        return output;
    }
}

J'ai donc testé cet algorithme avec le code suivant:

    private int samplingFrequency = 120;
    private int numberValues = 240;

    private void doCalc(object sender, EventArgs e) {
        Complex[] input = new Complex[numberValues];
        Complex[] output = new Complex[numberValues];

        double t = 0;
        double y = 0;
        for (int i = 0; i < numberValues; i++) {
            t = (double)i / (double)samplingFrequency;
            y = Math.Sin(2 * Math.PI * t);
            input[i] = new Complex(y, 0);
        }

        output = DFT.Transform(input);

        printFunc(input);
        printAbs(output);
    }

La transformation fonctionne bien, mais seulement si numberValues est un nombre multiple de la fréquence d'échantillonnage (dans ce cas: 120, 240, 360,...). C'est mon résultat pour 240 valeurs:

Http://s1.directupload.net/images/110928/n3m8hqg6.jpg

La transformation a bien fonctionné.

Si j'essaie de calculer 280 valeurs, j'obtiens ce résultat:

Http://s7.directupload.net/images/110928/qizoiqbt.jpg

Pourquoi j'obtiens un résultat incorrect si je change le nombre de mes valeurs calculées? Je ne suis pas sûr si mon problème ici est un problème avec mon code ou un malentendu de la définition mathématique de la DFT. De toute façon, quelqu'un peut-il m'aider avec mon problème? Grâce.

26
demandé sur Daniel Hilgarth 2011-09-28 15:46:32

2 réponses

Ce que vous rencontrez s'appelle fuite spectrale .

Ceci est dû au fait que les mathématiques sous-jacentes de la Transformée de Fourier supposent une fonction continue de-infini À + infini. Ainsi, la gamme d'échantillons que vous fournissez est effectivement répétée un nombre infini de fois. Si vous n'avez pas un nombre complet de cycles de la forme d'onde dans la fenêtre les extrémités ne s'aligneront pas et vous obtiendrez une discontinuité qui se manifeste comme la fréquence qui s'étalera sur de chaque côté.

La manière normale de gérer ceci est appelée fenêtrage . Cependant, cela présente un inconvénient car cela provoque un léger décalage des amplitudes. C'est le processus de multiplier toute la fenêtre d'échantillons que vous allez traiter par une fonction qui tend vers 0 aux deux extrémités de la fenêtre provoquant l'alignement des extrémités mais avec une certaine distorsion d'amplitude car ce processus abaisse la puissance totale du signal.

Donc, pour résumer il n'y a pas d'erreur dans votre code, et le résultat est comme prévu. Les artefacts peuvent être réduits en utilisant une fonction de fenêtre, mais cela affectera la précision des amplitudes. Vous devrez étudier et déterminer quelle solution correspond le mieux aux exigences de votre projet.

29
répondu Charles Keepax 2011-09-28 12:05:33

Vous n'obtenez pas le résultat incorrect pour une sinusoïde non périodique. Et ce ne sont pas seulement des "artefacts". Votre résultat est en fait le résultat DFT plus complet que vous ne voyez pas avec une sinusoïde périodique. Ces autres valeurs non nulles contiennent des informations utiles qui peuvent être utilisées, par exemple, pour interpoler la fréquence d'une seule sinusoïde non périodique dans l'ouverture.

Un DFT peut être considéré comme convolving une fenêtre rectangulaire avec votre Onde sinusoïdale. Cela produit (quelque chose de très proche de) une fonction Sinc, qui a une étendue infinie, mais qui se trouve être nulle à chaque fréquence de bin DFT autre que son bin DFT central pour toute sinusoïde centrée exactement sur un bin DFT. Cela ne se produit que lorsque la fréquence est exactement périodique dans l'ouverture FFT, pas pour tout autre. La fonction Sinc a beaucoup de "bosses" qui sont tous cachés dans votre première parcelle.

5
répondu hotpaw2 2014-06-17 15:53:21