[Résolu] Lisser des tableaux de valeurs
Bonjour,
Je m'excuse de lancer une nouvelle discussion sur un sujet déjà abordé dans une autre, mais j'ai trouvé quel était mon problème, et l'ancienne discussion contient du coup des informations parfaitement inutiles.
Je travaille à un vocodeur utilisant la Fast Fourier Transform et la convolution. (J'utilise Core Audio sur mon iPad.)
J'envoie des tableaux de 1024 valeurs (des "double") à la méthode de FFT et à de convolution (multiplication de nombres complexes). Puis la invFFT (ou DFT) me renvoie un signal audio de 1024 samples également. Le problème est qu'il y a rupture de continuité dans la courbe des valeurs audio de sortie, ce qui génère un bruit. (voir capture d'écran de Logic Audio : les ruptures sont fléchées). Ceci provient du fait que les valeurs de sortie sont recalculées à partir de l'analyse en fréquence du signal entrant faite à deux instants différents (à 1024/44100 secondes d'intervalle). Aussi cette méthode "discrète" ne permet pas la continuité de la courbe de sortie. J'obtiens "différents instants" et non une courbe continue.
J'ai essayé de travailler avec des tableaux plus petits (256 valeurs par exemple), le bruit existe toujours, mais plus souvent.
Auriez-vous une idée pour lisser les tableaux de valeurs entre elles et assurer une continuité dans la courbe? Faire une moyenne des valeurs issues de la FFT par exemple? Franchement, je ne trouve pas d'issue encore. Toute aide est la bienvenue.
Merci!
Réponses
Tu ne peut pas lisser ta courbe en utilisant un filtre numérique ? Il doit y avoir des formules pour réaliser des filtres passe-haut ou passe-bas. Je me souviens vaguement avoir vu ça dans mes (très) lointaines études d'électronique.
Je n'y connais rien, j'suis mauvais en physique, et ces cours de FTT et Cie sont partis aussi vite de ma mémoire qu'ils n'y sont rentrés...
Du coup, mes questions peuvent paraà®tre idiotes, mais sans connaissances en la matière, j'ose en déduire que tes transformations ont quelques soucis aux limites des intervalles d'échantillons ?
Mais outre la possibilité de lisser via un truc magique, serait-il possible d'avoir des échantillons glissants ?
J'entends par là , avec un échantillonnage de 1024, 0-1024, 512-1536, 2048-3072, etc. ? Et de potentiellement effectuer un lissage à ce moment-là ?
En bref, n échantillons, un "pallier de sécurité" p, de n/2 (ou n/4), et ainsi [0,n], [n-p,2n-p], [n,2n], [2n-p,3n-p], etc.
Il faudrait peut-être ainsi moyenner les mesures qui se recoupent.
https://fr.wikipedia.org/wiki/Filtre_numérique
Merci Larme et Draken. En fait, le problème est un beau problème de mathématiques et de logique avant d'être un problème de son. Une belle "colle d'étudiant" en somme! Une belle prise de tête!
L'idée d'un filtre serait juste (et j'y pense) si les différences de niveau entre les deux "renvois audio" n'étaient pas si importants. S'il s'agit d'un "petit écrétage", d'une toute petite différence, un filtre passe-bas le gommera effectivement (Par rapport à une courbe audio, le filtre passe-bas gomme les petits détails, le passe-haut les privilégie au contraire en gommant les "grosses bosses". Ceci "façon de parler" bien sûr!)
L'idée de Larme va dans le sens de ce que je vais tenter, en espérant ne pas consommer trop de CPU. Je vais essayer de faire la FFT tous les 1/4 ou 1/8 de cycle en faisant faire une moyenne arithmétique des 4 ou 8 fois les 1024 nombres des tableaux post convolution (multiplication de complexes). De cette façon, les différents "rendus" devraient être plus proches (et filtrables). Le problème vient bien de ces tableaux là (cette multiplication induit un peu d'aléatoire, et donc du bruit!).
Je vous tiens au courant, mais merci encore de vous y intéresser.
Bon, le test est raté!
En quadruplant l'appel à la FFT, on lisse un peu la courbe audio, mais il reste un bruit que même un filtre à 12 kHz ne parvient pas à filtrer. De plus, le fait de jouer avec les parties imaginaires multiplie les rotations de phases, ce qui crée un effet de phaser bruyant. Bref, le résultat est inaudible (je vous en fais grâce...)
Là , j'avoue, je suis en panne! ???
J'ai l'impression que tu es en train de réinventer le traitement numérique du signal. ça me rappelle de très lointain cauchemars souvenirs.
Théoriquement, le produit de convolution de deux fonctions temporelles est équivalent au produit complexe de leurs transformées de Fourier. C'est la théorie, c'est des maths, y'a rien à redire à condition d'appliquer ça sur des fonctions continues.
Le problème est qu'un calculateur numérique travaille sur des fonctions échantillonnées, qu'elles soient temporelles ou fréquentielles. Et là ça change tout ! Ou plutôt il faut prendre en compte la théorie sur les fonctions échantillonnées.
Une FFT par exemple, fonctionne bien si elle est appliquée sur un signal périodique, et en plus pour lequel une période est égale à la durée du segment auquel on l'applique.
Si je comprends bien les posts précédents, ton signal n'est pas période et du coup ça fait des choses bizarres quand tu raboutes les morceaux.
Je suis de l'avis de Draken. Et je pense que tu n'as pas compris sa proposition. Il ne s'agit pas de filtrer le signal après le traitement.
Je pense que tu ferais mieux de convertir ton problème en un filtre numérique ; il y a une très volumineuse littérature sur le sujet. Au lieu de faire un aller-retour vers le domaine fréquentiel, il faudrait simplement convertir la fonction à laquelle tu veux convoquer ton signal en un filtre numérique.
Je suis également de l'avis de Draken et jpimbert.
Un filtre passe-bas est un moyenneur. Peut-être faut-il l'appliquer avant la multiplication pour ne pas dépasser la fréquence de Nyquist. C'est quelque chose qu'on fait couramment quand on rééchantillonne à une fréquence différente, par exemple.
Bon, merci pour vos posts. J'ai essayé sans succès "mes" solutions (des moyennes sur les valeurs de sortie) mais sans plus de succès.
JPImbert explique très bien le problème. Par contre, j'ai du mal à comprendre en retours ceci, et je m'en excuse :
Je m'en vais aussi faire des recherches sur la "fréquence de Nyquist" dont parle Céroce, et que je ne connais pas encore!
Merci pour vos posts, je devine que vous me mettez sur la bonne voie.
Un produit de convolution sur un signal temporel (ou un produit complexe dans le domaine fréquentiel) c'est un filtre.
Un filtre peut être modélisé par un filtre numérique (voir wikipedia).
Le problème est donc de transformer la fonction à laquelle tu veux convoluer (et pas convoquer !) en un filtre numérique ; il faut déterminer ses coefficients.
Ensuite l'algorithme est bête comme chou.
Merci JPImbert, c'est bien ce que j'avais compris. Je sais déjà programmer des filtres, et j'ai déjà programmé des vocodeurs avec des filtres RII.
Le vocodeur multiplie les filtres passe-bandes. Les vocodeurs classiques utilisent entre 11 et une trentaine de filtres : deux séries de ces filtres analysent ainsi, l'une l'entrée microphone (avec suiveur d'enveloppe en sortie des filtres) et l'autre l'entrée synthé (avec en sortie des amplificateurs commandés par les suiveurs d'enveloppes correspondants ). C'est comme cela que le synthé "parle" et produit des effets de voix robots, ou de choeurs.
Je sais déjà programmer cela, mais avec la FFT, je voulais avoir un vocodeur à 512 bandes. Les tests audios, même bruyants, sont prometteurs! La définition est surprenante. Et la FFT est tellement prometteuse en terme de recherches sonores que cela vaut le coup d'apprendre.
Pensez-vous qu'il faudrait utiliser le résultat de la FFT pour contrôler une série de filtres numériques IIR passe-bandes? Dans ce cas n'utiliseriez-vous que la partie réelle de l'analyse, ou bien bien une addition ou un produit de la partie réelle avec la partie imaginaire? Ou bien voyez-vous une solution utilisant la convolution?
PS : pardon pour les fautes de frappe, je corrige avant de poster, mais là , elle est passée quand même!
Les questions dépassent largement ma compétence.
FIR c'est presque fastoche. IIR je suis satellisé !
Il me semble que les filtres dont parle l'article Wikipedia sont des filtres IIR : les plus simples, de type :
avec calcul dans une méthode à part des paramètres. D'après ma doc, ce sont les IIR, les plus répandus, les plus rapides et les plus économes en ressources processeur et mémoire.
Bon, ceci dit, il est évident que je fais fausse route. L'opération pour moduler des filtres BPF serait sans doute d'utiliser Pythagore à partir de l'analyse FFT, mais j'ai envie d'autre chose. J'ai trouvé beaucoup de doc sur les "phase vocoder", je digère tout cela d'abord.
Merci à tous!
Rions un peu!
Par acquis de conscience, et d'autant plus que j'avais dans mes archives l'essentiel du code source, j'ai testé, "pour voir" et aussi pour entendre, la FFT modulant des filtres BPF en sortie du synthé polyphonique.
Passé 250 filtres, l'appli ne se lance pas : iOS en perd son AudioComponentDescription lors de l'initialisation de la classe audio deux fois sur trois. Lorsqu'elle se lance, l'OS n'a pas le temps de faire les calculs suffisamment vite pour éviter les décrochages dans la sortie audio (le buffer du FFT est limité à 1024 samples, soit 512 filtres. Je ne connaissais pas le nom du "nombre de Nyquist", mais j'en connaissais le principe).
Le rendu audio à 200 filtres est moyennement joli, pour ne pas dire moins, pas supérieur à celui de vocoders classiques à 24 bandes (comme celui de Logic par exemple, qui est une référence certainement).
Bon, ce n'est pas par là . Tout heureux de m'être initié à la FFT, j'aimerais en faire quelque chose, mais je vais de ce pas trouver de la doc.
Tiens, j'ai trouvé ces sites si cela vous intéresse :
https://www.dsprelated.com/freebooks/sasp/FFT_Implementation_Phase_Vocoder.html
(plein de doc sur le sujet)
ou bien :
https://cycling74.com/2006/11/02/the-phase-vocoder-–-part-i/#.Vx5AA2PmHM5
Merci en tous les cas pour cette discussion.
Je pourrais parler avec l'accent Orc ou Klingon en utilisant ton vocodeur ?
J'ai fini par trouver. La solution s'appelle "Hann windowing" (ou bien "Hamming windowing", mais j'ai préféré la première solution) et "Overlapp-add". Ce fût une bonne prise de tête pour synchroniser les horloges (4 buffers sont utilisés en même temps dont un passe à la moulinette de la FFT et de la convolution), mais le signal est maintenant parfaitement "lissé".
Ceci dit, le résultat n'est pas très musical (en lieu d'un vocoder, on entend la voix entrante à peine modulée, et fort peu la note du synthé : ceci est normal je pense étant donné le grand nombre de filtres) , je vais maintenant m'atteler à jouer avec les phases que l'on obtient à partir de la FFT. Mais ceci est un autre sujet.
Je peux être plus précis si le sujet intéresse, sinon merci à tous pour vos contributions.
PS : comment modifie t-on le titre de la discussion pour y marquer [résolu]??
Il faut modifier le premier message du sujet (avec l'éditeur avancé ? J'ai un doute).