ce qui est lissant en termes très basiques

17

Qu'est-ce que le lissage et comment puis-je le faire?

J'ai un tableau dans Matlab qui est le spectre de magnitude d'un signal de parole (la magnitude de 128 points de FFT). Comment lisser cela en utilisant une moyenne mobile? D'après ce que je comprends, je devrais prendre une taille de fenêtre d'un certain nombre d'éléments, prendre la moyenne, et cela devient le nouveau 1er élément. Déplacez ensuite la fenêtre vers la droite d'un élément, prenez la moyenne qui devient le 2e élément, et ainsi de suite. Est-ce vraiment ainsi que cela fonctionne? Je ne suis pas sûr moi-même car si je fais cela, dans mon résultat final, j'aurai moins de 128 éléments. Alors, comment ça marche et comment ça aide à lisser les points de données? Ou existe-t-il un autre moyen de lisser les données?

EDIT: lien vers la question de suivi

Communauté
la source
pour un spectre que vous voulez probablement faire la moyenne ensemble (dans la dimension temporelle) de plusieurs spectres plutôt qu'une moyenne courante le long de l'axe des fréquences d'un seul spectre
endolithe
@endolith les deux sont des techniques valides. La moyenne dans le domaine fréquentiel (parfois appelée périodogramme Danielle) est la même que le fenêtrage dans le domaine temporel. La moyenne de plusieurs périodogrammes ("spectres") est une tentative d'imiter la moyenne d'ensemble requise du vrai périodogramme (c'est ce qu'on appelle le périodogramme de Welch). De plus, pour des raisons de sémantique, je dirais que le "lissage" est un filtrage passe-bas non causal. Voir Filtrage de Kalman vs lissage de Kalman, filtrage de Wiener contre lissage de Wiener, etc. Il existe une distinction non triviale et dépend de l'implémentation.
Bryan

Réponses:

23

Le lissage peut se faire de plusieurs façons, mais en termes très basiques et généraux, cela signifie que vous égalisez un signal, en mélangeant ses éléments avec leurs voisins. Vous salissez / brouillez un peu le signal afin de vous débarrasser du bruit. Par exemple, une technique de lissage très simple serait de recalculer chaque élément de signal f(t)à 0,8 de la valeur d'origine, plus 0,1 de chacun de ses voisins:

f'(t) = 0.1*f(t-1) + 0.8*f(t) + 0.1*f(t+1)

Notez comment les facteurs de multiplication, ou poids, s'additionnent à un. Donc, si le signal est assez constant, le lissage ne le change pas beaucoup. Mais si le signal contenait un changement saccadé soudain, alors la contribution de ses voisins aidera à dissiper un peu ce bruit.

Les poids que vous utilisez dans cette fonction de recalcul peuvent être appelés un noyau . Une fonction gaussienne unidimensionnelle ou tout autre noyau de base devrait faire l'affaire dans votre cas.

Bel exemple d'un type particulier de lissage:

En haut: signal non
lissé En bas: signal lissé

entrez la description de l'image ici

Exemples de quelques noyaux:

entrez la description de l'image ici

Junuxx
la source
est-ce donc une moyenne mobile pondérée? Est-ce que cela s'appelle avoir une taille de fenêtre de 3? Qu'en est-il du 1er et du dernier élément? Et comment cela serait-il modifié si j'ai un tableau de 128 éléments et que je veux utiliser une fenêtre de 16 ou 32 éléments?
@ user13267: Oui, on pourrait dire qu'un noyau de lissage est une moyenne mobile pondérée. Si vous utilisez un noyau uniforme (voir la deuxième image), il s'agit simplement d'une moyenne mobile simple. Vous avez raison sur la taille de la fenêtre. Pour traiter les bords, il existe trois approches de base: 1) le remplissage nul de vos données, 2) la répétition de la dernière valeur, 3) la mise en miroir du signal. Dans tous les cas, vous faites des données factices pour que votre noyau ne tombe pas dans le néant.
Junuxx du
le remplissage nul ne serait-il pas considéré comme tombant dans le néant? À la fin du processus de moyenne mobile, mon nouvel ensemble de données "moyenné" devrait avoir le même nombre de données que l'original, n'est-ce pas? alors si je le remets à zéro au début ou à la fin, ou si je répète les dernières données, cela ne biaisera-t-il pas la valeur moyenne aux bords du tableau? Et comment la mise en miroir du signal aiderait-elle en termes de nombre de termes de données? Existe-t-il un didacticiel simple à ce sujet qui montre comment se déroule le processus pour, disons, 32 points de données et une taille de fenêtre de 4 ou 5?
2
Si vous souhaitez que votre jeu de données lissé ait la même longueur que le jeu de données d'origine, vous devez «créer» des données aux points de terminaison. Tout choix que vous faites pour créer ces données biaise la moyenne d'une manière ou d'une autre. Le traitement des données hors limites comme un miroir de l'ensemble de données réel (c'est-à-dire en supposant que l'échantillon N + 1 est le même que N-1, N + 2 = N-2, etc.) conservera les caractéristiques du spectre de fréquences du parties finales du signal, alors qu'en supposant une répétition nulle ou non nulle, il semblerait que toutes les fréquences roulent aux extrémités.
Russell Borogove
8

En plus de la belle réponse de Junuxx, je voudrais déposer quelques notes.

  • Le lissage est lié au filtrage ( article Wikipédia malheureusement assez vague ) - vous devez choisir le lisseur en fonction de ses propriétés.

  • L'un de mes favoris est le filtre médian . Ceci est un exemple de filtre non linéaire. Il possède des propriétés intéressantes, il préserve les "bords" et est assez robuste sous bruit important.

  • Si vous avez un modèle, la façon dont votre signal se comporte avec un filtre de Kalman vaut le détour. Son lissage est en fait une estimation bayésienne du maximum de vraisemblance du signal basée sur des observations.


la source
4

Le lissage implique l'utilisation d'informations provenant d'échantillons voisins afin de modifier la relation entre les échantillons voisins. Pour les vecteurs finis, aux extrémités, il n'y a pas d'information voisine d'un côté. Vos choix sont les suivants: ne pas lisser / filtrer les extrémités, accepter un vecteur lissé résultant plus court, créer des données et lisser avec cela (dépend de la précision / utilité de toutes les prédictions sur les extrémités), ou peut-être utiliser différents noyaux de lissage asymétrique à les extrémités (ce qui finit par raccourcir le contenu de l'information dans le signal).

hotpaw2
la source
3

Vous pouvez trouver l'intégralité du code matlab pour lisser le filtre moyen mobile pour différentes longueurs de prises. www.gaussianwaves.com/2010/11/moving-average-filter-ma-filter-2/

humour
la source
1

D'autres ont mentionné comment vous effectuez le lissage, je voudrais mentionner pourquoi le lissage fonctionne.

Si vous suréchantillonnez correctement votre signal, il variera relativement peu d'un échantillon à l'autre (échantillon = points temporels, pixels, etc.), et il devrait avoir une apparence globale lisse. En d'autres termes, votre signal contient peu de hautes fréquences, c'est-à-dire des composantes de signal qui varient à un taux similaire à votre taux d'échantillonnage.

Pourtant, les mesures sont souvent corrompues par le bruit. Dans une première approximation, nous considérons généralement que le bruit suit une distribution gaussienne avec un zéro moyen et un certain écart-type qui est simplement ajouté au-dessus du signal.

Pour réduire le bruit dans notre signal, nous faisons généralement les quatre hypothèses suivantes: le bruit est aléatoire, n'est pas corrélé entre les échantillons, a une moyenne de zéro et le signal est suffisamment suréchantillonné. Avec ces hypothèses, nous pouvons utiliser un filtre de moyenne mobile.

Considérons, par exemple, trois échantillons consécutifs. Étant donné que le signal est fortement suréchantillonné, le signal sous-jacent peut être considéré comme changeant de façon linéaire, ce qui signifie que la moyenne du signal sur les trois échantillons serait égale au vrai signal sur l'échantillon du milieu. En revanche, le bruit a une moyenne de zéro et n'est pas corrélé, ce qui signifie que sa moyenne devrait tendre à zéro. Ainsi, nous pouvons appliquer un filtre de moyenne mobile à trois échantillons, où nous remplaçons chaque échantillon par la moyenne entre lui-même et ses deux voisins adjacents.

Bien sûr, plus nous élargissons la fenêtre, plus le bruit sera égal à zéro, mais moins notre hypothèse de linéarité du vrai signal est vraie. Nous devons donc faire un compromis. Une façon d'essayer d'obtenir le meilleur des deux mondes est d'utiliser une moyenne pondérée, où nous donnons des échantillons plus éloignés de plus petits poids, de sorte que nous faisons la moyenne des effets de bruit à partir de plus grandes gammes, tout en ne pondérant pas trop le signal vrai là où il s'écarte de notre linéarité supposition.

La façon dont vous devez mettre les poids dépend du bruit, du signal et de l'efficacité de calcul, et, bien sûr, du compromis entre l'élimination du bruit et la coupure du signal.

Notez qu'il y a eu beaucoup de travail au cours des dernières années pour nous permettre d'assouplir certaines des quatre hypothèses, par exemple en concevant des schémas de lissage avec des fenêtres de filtre variables (diffusion anisotrope), ou des schémas qui n'utilisent pas vraiment de fenêtres pas du tout (moyens non locaux).

Jonas
la source