Existe-t-il un terme technique pour cette méthode simple de lissage d'un signal?


26

Premièrement, je suis nouveau dans le DSP et je n'ai pas vraiment d'éducation, mais je développe un programme de visualisation audio et je représente un réseau FFT sous forme de barres verticales comme dans une visualisation de spectre de fréquence typique.

Le problème que j'avais était que les valeurs du signal audio changeaient trop rapidement pour produire une sortie visuelle agréable si je mappais directement les valeurs FFT:

entrez la description de l'image ici

J'applique donc une fonction simple aux valeurs afin de "lisser" le résultat:

// pseudo-code
delta = fftValue - smoothedFftValue;
smoothedFftValue += delta * 0.2; 
// 0.2 is arbitrary - the lower the number, the more "smoothing"

En d'autres termes, je prends la valeur actuelle et la compare à la dernière, puis j'ajoute une fraction de ce delta à la dernière valeur. Le résultat ressemble à ceci:

entrez la description de l'image ici

Ma question est donc:

  1. Est-ce un modèle ou une fonction bien établi pour lequel un terme existe déjà? Est-ce le cas, quel est le terme? J'utilise le "lissage" ci-dessus mais je suis conscient que cela signifie quelque chose de très spécifique dans DSP et peut ne pas être correct. En dehors de cela, cela semblait peut-être lié à une enveloppe de volume, mais pas tout à fait la même chose.

  2. Existe-t-il de meilleures approches ou une étude plus approfondie des solutions à ce problème que je devrais examiner?

Merci pour votre temps et excuses si c'est une question stupide (en lisant d'autres discussions ici, je suis conscient que mes connaissances sont bien inférieures à la moyenne, il semble).


1
Maintenant, je me demande ce que vous obtenez si vous prenez la FFT lissée et la FFT inverse.
user253751

Serait-il plus simple de simplement faire la première réponse dans un ordre différent? current_value = current_value * decay; if (new_value> current_value) {current_value = new_value; }
Richard Forster

@immibis Cela devrait être une réverbération de ma compréhension. Corrige moi si je me trompe.
Andreas

Bien sûr, et un compilateur d'optimisation produira la même implémentation. Le point clé était d'obtenir le résultat correct lorsque (valeur_actuelle * décroissance) <nouvelle_valeur <valeur_actuelle.
Richard Forster

2
J'aime vraiment cette question. C'est l'un de ceux où quelqu'un qui essaie quelques choses se découvre accidentellement au fond d'un énorme arbre de connaissances (filtres Infinite Impulse Response, en particulier). Pendant ce temps, les gens qui grimpent déjà dans l'arbre peuvent décrire toutes les choses sympas qu'ils ont déjà découvertes parmi les branches ...
DrMcCleod

Réponses:


37

Ce que vous avez mis en œuvre est un filtre passe-bas unipolaire, parfois appelé intégrateur qui fuit . Votre signal a l'équation de différence:

y[n]=0.8y[n1]+0.2x[n]

où est l'entrée (la valeur de bin non lissée) et est la valeur de bin lissée. Il s'agit d'une manière courante de mettre en œuvre un filtre passe-bas simple et de faible complexité. J'ai écrit à leur sujet plusieurs fois auparavant dans les réponses précédentes; voir [1] [2] [3] .y [ n ]x[n]y[n]


4
Merci beaucoup pour cela. Donc, tellement utile. Googler tout seul, c'est comme être perdu en mer quand il s'agit de DSP. Le simple fait d'avoir quelques termes à rechercher me donne quelque chose à saisir.
Michael Bromley

3
Je me demande. Je pense que l'OP applique ce filtre sur la série de valeurs dans les casiers individuels dans le domaine fréquentiel. Un passe-bas normal est appliqué à la série d'échantillons dans le domaine temporel. L'effet est-il le même (je ne pense pas, car les parties hautes fréquences sont toujours dans le signal, mais… leur intensité change plus lentement?)? Sinon, pourriez-vous préciser ce que le filtre fait réellement au signal dans le domaine temporel?
Jonas Schäfer

3
@JonasWielicki Je pense que l'objectif consiste à lisser chaque valeur de bac individuel, afin qu'elle ne change pas très rapidement. le filtre passe-bas (comme expliqué dans la réponse) est également applicable à toute série temporelle quel que soit son domaine (temps ou fréquence ou autre).
Arpit Jain

@arpitjain Je comprends cela. J'aimerais simplement savoir s'il y a une compréhension (pas nécessairement par vous, l'OP ou le répondeur) de la façon dont cela affecte le domaine temporel lorsque vous faites cela.
Jonas Schäfer

@JonasWielicki L'opération est une convolution dans le domaine fréquentiel, donc elle se traduit par une multiplication (des transformées de Fourier (inverses) correspondantes) dans le domaine temporel.
MBaz

17

Attention: incluez un peu d'histoire, de vieux papiers (je les aime) et des cartes perforées!

a=0.2

y(n)=y(n1)+a[x(n)y(n1)],
y(n)=ax(n)+(1a)y(n1).

La première version ci-dessus est moins naturelle, mais elle évite une multiplication et est en quelque sorte plus efficace. Les deux formules produisent un filtre de réponse impulsionnelle linéaire , causale et infinie . L'histoire remonte à et à travers Poisson, Kolmogorov-Zurbenko Adaptive Filters , Brown (Statistical Forecasting for Inventory Control. McGraw-Hill, 1959), Holt (1957) et Winters (1960). Il est implémenté comme un schéma de filtrage récursif connu sous différents noms dans la littérature:

L'exponentielle dans le nom est liée à la réponse impulsionnelle avec la progression géométrique, qui échantillonne une décroissance exponentielle: .h[n]=(1a)u[n]an

Pour une note historique, Robert G. Brown et Arthur D. Little ont utilisé cette méthode en 1956 dans le lissage exponentiel pour prédire la demande , apparemment pour l'industrie du tabac. Un peu plus d' histoire et d' explications se trouvent dans la prévision Holt-Winters pour les nuls (ou développeurs) - Partie I . Peter Zehna propose une revue critique dans Some remarques sur le lissage exponentiel , 1966. Un chapitre de R. Brown dans Encyclopedia of Operations Research and Management Science (Google books) remonte à 1944, les pages lisibles sont reproduites ici:

Lissage exponentiel, p.  205, Encyclopédie de la recherche opérationnelle et des sciences de la gestion

Lissage exponentiel, p.  206, Encyclopédie de la recherche opérationnelle et des sciences de la gestion

De nombreuses méthodes étendent ce lissage, qui manque de validité lorsque les données ont une tendance ou une saisonnalité. Certains d'entre eux sont connus sous le nom de lissage exponentiel double ou triple et de filtres Holt-Winters .

Vous pouvez également vérifier: Comment fonctionne ce «filtre simple»?


1
Merci, c'est excellent. Comme mentionné, je suis totalement nouveau dans ce domaine, donc certaines de vos réponses nécessiteront des recherches supplémentaires pour que je les apprécie pleinement, mais cela répond certainement à ma question et à d'autres. Dans le cas contraire pour l'autre, réponse précédente, c'est aussi digne de cours d'acceptation comme la réponse.
Michael Bromley

1
Petite correction, Winters 1 (960) devrait être Winters (1960) Je suppose
SGR

9

Existe-t-il de meilleures approches ou une étude plus approfondie des solutions à ce problème que je devrais examiner?

L'approche normale pour les audiomètres est un "détecteur de crête avec perte".

if new_value > current_value
  current_value = new_value;
else
 current_value = current_value * decay;  

Cela réagit immédiatement à tout nouveau ou pic ou transitoire dans le signal, mais il persiste pendant un certain temps afin de créer une image beaucoup moins agitée. La décroissance doit être une constante entre 0 et 1. Elle contrôle la vitesse à laquelle les barres se font, 0 étant instantané et 1 jamais.


Je note que cela présente des similitudes avec une affectation que j'ai faite à l'université, un MIDI très fin (créé dans une affectation précédente) a été amélioré en convoluant (et en mettant à l'échelle pour correspondre aux pics et aux durées) les signaux de note (complètement rectangulaires) avec un triangle signal qui a augmenté très fortement (mais pas instantanément), puis s'est dégradé progressivement, pour produire une note aiguë qui s'est éteinte «naturellement». Vaste amélioration du son de la chanson (Fur Elise dans ce cas).
KRyan

Je suppose que vous voudriez le conserver new_values'il est supérieur àcurrent_value * decay
user276648

6

Dans les cercles des entrepreneurs du DoD américain, ce filtre particulier est souvent appelé «filtre alpha», car il peut être caractérisé avec un paramètre qui est traditionnellement appelé «alpha».

Il est directement analogue à un filtre passe-bas RC analogique simpe.

Ils sont extrêmement simples, ont de sérieuses limites, mais ils ont l'avantage indéniable sur des filtres plus complexes (et compliqués!) Que, si vous vous éloignez de leurs zones problématiques, ils font le travail.


3

Comme mentionné dans d'autres réponses, il s'agit d'un filtre récursif unipolaire, un type de filtre à réponse impulsionnelle infinie (IIR).

Le guide du scientifique et de l'ingénieur sur le traitement numérique du signal de Steven W. Smith est une excellente ressource pour obtenir des informations sur cette fonctionnalité et d'autres fonctionnalités DSP : réponse impulsionnelle infinie (IIR)

... chaque point du signal de sortie est trouvé en multipliant les valeurs du signal d'entrée par les coefficients "a", en multipliant les valeurs précédemment calculées à partir du signal de sortie par les coefficients "b" et en additionnant les produits ensemble. qu'il n'y a pas de valeur pour b0, car cela correspond à l'échantillon calculé. L'équation 19-1 est appelée équation de récursivité, et les filtres qui l'utilisent sont appelés filtres récursifs. Les valeurs "a" et "b" qui définissent le filtre sont appelées coefficients de récursivité.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.