web-dev-qa-db-fra.com

À quoi sert la fenêtre Hamming?

Je travaille avec du code qui fait une transformation de Fourier (pour calculer le cepstre d'un échantillon audio). Avant de calculer la transformée de Fourier, il applique une fenêtre de Hamming à l'échantillon:

for(int i = 0; i < SEGMENTATION_LENGTH;i++){
    timeDomain[i] = (float) (( 0.53836 - ( 0.46164 * Math.cos( TWOPI * (double)i  / (double)( SEGMENTATION_LENGTH - 1 ) ) ) ) * frameBuffer[i]);
}

Pourquoi ça fait ça? Je ne trouve aucune raison de le faire dans le code ou en ligne.

32
fredley

Chaque fois que vous effectuez une transformée de Fourier finie, vous l'appliquez implicitement à un signal à répétition infinie. Ainsi, par exemple, si le début et la fin de votre échantillon fini ne correspondent pas, cela ressemblera à une discontinuité dans le signal et apparaîtra comme beaucoup de non-sens haute fréquence dans la transformée de Fourier, ce que vous ne faites pas vraiment envie. Et si votre échantillon se trouve être une belle sinusoïde mais qu'un nombre entier de périodes ne correspond pas exactement à l'échantillon fini, votre FT affichera une énergie appréciable dans toutes sortes d'endroits, loin de la fréquence réelle. Vous ne voulez rien de tout cela.

Le fenêtrage des données permet de s'assurer que les extrémités correspondent tout en gardant tout raisonnablement lisse; cela réduit considérablement le type de "fuite spectrale" décrit dans le paragraphe précédent.

40
Gareth McCaughan

C'est une vieille question, mais je pensais que la réponse pourrait être améliorée.

Imaginez que le signal que vous souhaitez transformer en Fourier soit une onde sinusoïdale pure. Dans le domaine des fréquences, vous vous attendez à ce qu'il présente un pic aigu uniquement à la fréquence du sinus. Cependant, si vous preniez la transformée de Fourier, votre pic pointu de Nice serait remplacé par quelque chose comme ceci:

Sinc function

Pourquoi donc? Les vraies ondes sinusoïdales s'étendent à l'infini dans les deux sens. Les ordinateurs ne peuvent pas faire de calculs avec un nombre infini de points de données, donc tous les signaux sont "coupés" à chaque extrémité. Cela provoque l'ondulation de chaque côté du pic que vous voyez. La fenêtre de brouillage réduit cette ondulation, vous donnant une idée plus précise du spectre de fréquences du signal d'origine.

Plus de théorie, pour les intéressés: lorsque vous coupez votre signal à chaque extrémité, vous multipliez implicitement votre signal par une fenêtre carrée. La transformée de Fourier d'une fenêtre carrée est l'image ci-dessus, connue sous le nom de fonction sinc. Chaque fois que vous faites une transformation de Fourier sur un ordinateur, que cela vous plaise ou non, vous choisissez toujours some window. La fenêtre carrée est la valeur implicite par défaut, mais pas un très bon choix. Il existe une variété de fenêtres que les gens ont imaginées, selon certaines caractéristiques que vous souhaitez optimiser. La fenêtre de hamming est l'une des fenêtres standard.

39
David

Avec ce que je sais sur le son et la recherche rapide, il semble que Hamming Window est là pour minimiser le lobe côté signal (rayonnement indésirable). Améliorant ainsi la qualité ou les harmoniques du son. Je comprends également ce type de fonction de fenêtre convient bien à DTFT.

Vous trouverez de bonnes explications techniques sur une page de chercheur de stanford ou wikipedia et aussi dans un article de Harris si vous êtes prêt pour les mathématiques: D .

11
M'vy

Le FT d'un segment de sinusoïde de longueur finie convolue la transformée de Fourier de la fenêtre contre le pic de fréquence de la sinusoïde, car une propriété de la FFT est que la multiplication vectorielle dans un domaine est une convolution dans l'autre. Le FT d'une fenêtre rectangulaire (c'est ce que toute longueur finie non modifiée d'échantillons dans une FFT implique) est la fonction Sinc d'aspect désordonné qui éclabousse tout signal qui n'est pas exactement périodique dans la fenêtre sur tout le spectre de fréquences.

Le FT d'une fenêtre en forme de Hamming concentre cette "éclaboussure" beaucoup plus près du pic de fréquence après la convolution (qu'une fonction Sinc), résultant en un pic de fréquence plus gros mais plus lisse, mais beaucoup moins d'éclaboussures sur des fréquences éloignées du pic de fréquence. Il en résulte non seulement un spectre d'apparence plus propre, mais aussi moins d'interférences de fréquences lointaines sur n'importe quel signal d'intérêt.

Cette interprétation (par opposition à l'interprétation "répétée à l'infini") explique plus clairement pourquoi des fenêtres de forme différente que Hamming peuvent vous donner de meilleurs résultats avec encore moins de "fuites". En particulier, une fenêtre de Hamming réduira la taille du premier lobe latéral de Sinc de "fuite" juste à côté du pic de fréquence en échange de plus de "fuite" (ou éclaboussure de convolution) loin de la fréquence d'intérêt. D'autres fenêtres peuvent être plus appropriées si vous souhaitez un compromis différent. L'article de Harris ( pdf ici ) lié dans une autre réponse ci-dessus donne plusieurs exemples de ces différentes fenêtres.

9
hotpaw2