Interpolation/resampling d'un signal en python
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Interpolation/resampling d'un signal en python



  1. #1
    Yoghourt
    Animateur Habitat

    Interpolation/resampling d'un signal en python


    ------

    Bonsoir,

    Quand on trace un jeu de données (Xn,Yn), on cherche souvent les valeurs Y'n pour d'autres abscisses en faisant une hypothèse éclairée sur la tête de la courbe support.
    Sur internet, on va ainsi trouver très facilement 2 choses :
    - les interpolations classiques pour un espacement quelconque des Xn (en escalier, linéaire par morceaux, polynomiale, spline). A l'ouest pour les fonctions périodiques, discutable pour les pseudo-signaux, gros souci de convergence en général pour l'interpolation polynomiale de plus de 20 points et pour les splines d'ordre>2.
    - le resampling où l'on passe d'une équirépartition à une autre. Technique issue du traitement du signal et de l'information, qui adresse correctement les problématiques d'aliasing/crénelage. Points faibles : la contrainte d'équirépartition, et le risque de décalage en x entre signal resamplé et signal d'origine

    Pour le codage en python, dans le 1er cas, ça semble facile : numpy pour l'interpolation linéaire, scipy pour le reste.
    https://fr.wikibooks.org/wiki/Python...ion_et_lissage

    Dans le 2e cas, je n'ai trouvé que panda.resample(). Déjà, panda juste pour faire un peu de calcul, c'est lourdingue. De plus, la méthode resample() est à l'ouest : en upsampling par ça insère des NaN qu'il faut ensuite interpoler. La méthode d'interpolation 'time', on ne sait pas ce qu'elle fait. Les autres méthodes d'interpolation sont en fait des méthodes...d'interpolation classique, donc pas licite en théorie du signal! Soit on introduit des erreurs de crénelage, fantome... Soit on invente carrément de l'information, là.
    En théorie du signal (cas à moyenne nulle pour simplifier), un upsampling par N insère N zéros entre chaque sample d'origine, puis il faut filtrer à la fréquence normalisée 1/N pour virer les spectres image. Pour panda en downsampling par P, si j'ai bien compris, panda se borne à regrouper les données et démerden sie sich pour traiter chaque paquet de P données. Généralement les gens font une simple moyenne. Ca revient à calculer une moyenne mobile puis garder 1 sample sur P, celui du milieu.
    En théorie du signal, il faut filtrer passe-bas à fréquence 1/P puis décimer. Au passage, la moyenne sur P samples est très très loin d'un filtre passe-bas parfait à 1/P, et prendre la moyenne d'un paquet de 3 introduit irrémédiablement un décalage du signal en x.

    Du coup, je n'imagine même pas le gloubiboulga à base de panda pour le cas général "facile" du resampling par N/P, encore moins celui du resampling par un facteur quelconque!
    Quelqu'un a forcément déjà codé le resampling tout nickel dans les librairies python. On trouve ça où?

    Par ailleurs, j'ai compris à la lecture de quelques articles qu'il existe un théorème général de reconstruction de série temporelle Xn,Yn qui fait les choses proprement (conforme théorie du signal, comble les trous éventuels, pas de contrainte d'équirépartition, pas de déphasage introduit, resampling propre au passage). Apparemment, c'est hyper bateau, tellement bateau que je n'ai jamais trouvé de quoi il s'agit précisemment. Et donc, ça doit forcément exister prêt à l'emploi dans une librairie python. Mais où???


    Chuss,
    Y.

    -----
    éco-rénovation: l'aïkido du BTP

  2. #2
    albanxiii
    Modérateur

    Re : Interpolation/resampling d'un signal en python

    Bonjour,

    J'ai déplacé en Programmation, puisque ce problème n'a pas suscité beaucoup de réponses en mathématiques où il était précédemment.

    albanxiii, pour la modération.
    Not only is it not right, it's not even wrong!

  3. #3
    Yoghourt
    Animateur Habitat

    Re : Interpolation/resampling d'un signal en python

    Merci Alban
    éco-rénovation: l'aïkido du BTP

  4. #4
    Yoghourt
    Animateur Habitat

    Re : Interpolation/resampling d'un signal en python

    Hello,
    Faut chercher de ce coté?
    https://en.wikipedia.org/wiki/Singul...ctrum_analysis
    éco-rénovation: l'aïkido du BTP

  5. A voir en vidéo sur Futura
  6. #5
    jojo150393

    Re : Interpolation/resampling d'un signal en python

    Salut,
    je me permet de répondre étant donnée qu'il n'y a personne et que ça m’intéresse. Je ne maîtrise pas du tout le sujet mais bon. Qu'est-ce que ça donne si tu utilises scipy.signal.decimate en t'arrangeant pour que ton signal sous-échantillonné passe par par ton Xn ?

    Je suis probablement a l'ouest avec le problème.

  7. #6
    Yoghourt
    Animateur Habitat

    Re : Interpolation/resampling d'un signal en python

    Bonjour Jojo,
    Scipy decimate fait uniquement du downsampling (sous-échantillonage) d'un facteur entier. Scipy resample fait uniquement de l'upsampling (suréchantillonage) d'un facteur entier. Scipy resample_poly fait du resampling (rééchantillonage) fractionnaire.

    J'essplike.

    On est en traitement du "signal numérique", Fourier est notre ami, Nyquist notre garde-chiourme. En fait de signal numérique, ici, c'est pas tant la considération du nombre de bits par échantillon, mais la considération qu'on travaille sur un vrai signal (analogique) dont on ne voit qu'une forme discrète, échantillonnée de façon régulière. On parle aussi de signal support et d'échantillonnée.
    Le spectre de Fourier d'un signal discret ne se borne pas à son spectre en bande de base [-Fnyq,Fnyq]. Cette bande de base est répliquée à l'infini. C'est un aspect théorique dont on se fout totalement en pratique. Du moins jusqu'à ce qu'on fasse du rééchantillonnage!

    Pour regarder le même signal analogique avec plus de points (toujours équirépartis) que ce qu'on a échantillonné, il faut :
    (0) suréchantillonner = ajouter des Yl=0 pour tous les nouveaux points l. Ca augmente la fréquence de Nyquist du signal suréchantillonné sans toucher son spectre de Fourier.
    (1) Virer tous les réplicants qui n'ont rien à fiche dans la nouvelle bande de base. C'est à dire passer par un filtre passe-bas à la fréquence de Nyquist du signal avant suréchantillonnage. Ca s'appelle un filtre interpolateur.
    Le résultat est une suréchantillonnée d'un facteur entier.
    En temps réel ou sur un signal très très long, on va utiliser un filtre au sens habituel = qui fait des calculs à la volée sur les échantillons. C'est un filtrage passe-bas forcément imparfait, et il faut savoir tailler le filtre selon ce sur quoi on bosse. C'est ce que propose scipy resample, le très mal nommé!
    Sinon, on a tout intérêt à passer dans le domaine fréquentiel et filtrer avec un grand coup de hache => filtrage passe-bas parfait, aucune question philosophique à se poser!
    Si on ne filtre pas ou mal, on obtient des phénomènes de crénelage (pixelisation) ou, pire, de suroscillation (ringing).
    https://en.wikipedia.org/wiki/Upsampling

    Au passage, tous les films et séries où l'informaticien(ne) augmente la netteté d'une image en 1 clic après un gros zoom bien pixelisé (upsampling foiré) ou bien flou (upsampling correct), c'est du gros mensonge, de l'invention pure et simple d'une information qui n'est pas dans le signal d'origine! Alors, oui, des réseaux de neurones peuvent rendre ce service avec plein de pub google autour, mais ça reste un gros mytho façon "j'en sais rien mais je parie que ça doit ressembler à ceci-cela". Y'a pas de magie qui ferait qu'une technique quelconque emplafonne la théorie qui l'encadre.

    Pour regarder le même signal analogique avec moins de points (toujours équirépartis) que ce qu'on a échantillonné, il faut s'assurer qu'on n'emplafonne pas la nouvelle fréquence de Nyquist :
    (1) On vire "tout ce qui dépasse", c'est à dire filtrage passe-bas à la nouvelle fréquence de Nyquist. Ca s'appelle un filtre décimateur.
    (2) On vire ensuite simplement les Yp pour tous les points p qui ne nous intéressent pas. C'est la décimation.
    Le résultat est une sous-échantillonnée d'un facteur entier.
    Idem comme ci-dessus, on peut faire ça avec un filtre temporel, c'est ce qui est proposé par scipy decimate avec la part d'artisanat pour tailler le filtre, ou bien en travaillant directement sur le spectre du signal.
    Si on ne filtre pas, on se tape divers phénomènes : moiré, effet d'escalier... Le terme anglais qui regroupe toutes ces blagues est "aliasing".
    https://en.wikipedia.org/wiki/Downsa...al_processing)

    De là, on peut jouer à ré-échantillonner par une fraction quelconque L/P. Dans ce cas, on enchaine tout simplement les étapes 0, 1, 2. On interpole par L, on filtre, on décime par P.
    Une façon efficace de faire tout ça dans le domaine temporel est d'utiliser ce qu'on appelle un filtre polyphase, en gérant le rythme des entrées et sorties des échantillons.
    C'est ce que propose scipy resample_poly.

    --
    Ces 3 fonctions scipy ont les 4 écueils classiques des techniques correspondantes :
    - ça ne sait pas gérer les trous dans l'échantillonnée d'origine
    - plus généralement, ça ne sait pas gérer un signal discret dont les points ne sont pas équidistants
    - ça demande du savoir-faire pour tailler proprement le filtre
    - comme ça travaille en temporel, ça ne sait pas extrapoler correctement un signal dont la période n'est pas alignée sur la durée

    Dans panda, c'est un peu démerden sie sich : il faut fournir une fonction magique, et panda se borne à faire le boulot facile (ajouter des 0 ou une valeur constante, supprimer des points). De ce que j'ai vu, les gens se bornent à utiliser une interpolation linéraire ou une petite moyenne mobile. C'est à dire le plus basique et le plus mauvais des filtres passe-bas dans le domaine temporel. Pour un rééchantillonnage classique, c'est mauvais. Pour un signal à échantillonnage irrégulier ou à trous, j'ai un très gros doute sur la validité théorique de l'approche. Et ne parlons pas de l'extrapolation, ou le résultat sera forcément du grand n'importe quoi pour un signal censé être périodique.

    Vala vala
    éco-rénovation: l'aïkido du BTP

  8. #7
    polo974

    Re : Interpolation/resampling d'un signal en python

    Bonjour,
    J'ai un petit pb avec la demande: je ne la saisis pas...

    Bon, comme ça parle beaucoup traitement du signal, et resample, donc échantillonnage à intervalle régulier, je pense ffmpeg et donc les binding qui pourraient exister...

    https://ffmpeg.org/ffmpeg-resampler.html
    https://pypi.org/project/myffmpeg/

    Maintenant, si c'est une demande purement théorique sur un outil mathématique universel, je jouerai juste le rôle du spectateur...
    Jusqu'ici tout va bien...

Discussions similaires

  1. Transformée de fourier, traitement de signal, python
    Par zo28 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 03/01/2020, 08h31
  2. [PYTHON] Transformée de Fourrier discrète sur un signal déjà échantillonné
    Par Shantorian dans le forum Programmation et langages, Algorithmique
    Réponses: 20
    Dernier message: 17/10/2017, 09h39
  3. Traitement de signal sous python
    Par Shantorian dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 29/06/2017, 08h51
  4. [Matlab] Interpolation d'un signal par transformée de Fourier
    Par Disciple_Antennes dans le forum Physique
    Réponses: 4
    Dernier message: 18/04/2016, 17h16
  5. Resampling dans les règles de l'art ?
    Par adrienlucca dans le forum Physique
    Réponses: 6
    Dernier message: 29/11/2012, 11h28