Salut a tous,
J'ai un soucis d'optimisation au niveau de l'affichage temps reel d'un signal audio.
Dans mon application, je veux afficher 10 secondes d'un signal audio acquis à 16KHz. Ca fait donc 160 000 points à afficher. Le signal s'affiche par un defilement de gauche à droite (buffeur circulaire). Pour le moment j'ai deux methodes pour afficher mes courbes mais aucune ne me donne satisfaction.
La première est la suivante:
En gros, à chaque refresh, je dessine 160 000 / xS points sur toute la largeur this.Width de mon image bitmap dans laquelle j'affiche la courbe du signal. Le problème de cette methode c'est qu'en plus du scintillement du au refresh, j'ai un scintillement au niveau de la courbe elle meme. La raison étant qu'à chaque fois que je redessine la courbe en entier, le downsampling d'un facteur xS et le buffeur circulaire du signal font qu'une valeur acquise à t0 n'a pas la meme faleur entre l'affichage à t et l'affichage à t + 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for (i = 0; i < this.Width - 1; i++) { g.DrawLine(P1, i, this.Height - 5 - (int)Math.Round((waveform1[(int)Math.Round(i / xS)] - maxmin1[1]) * yS), i + 1, this.Height - 5 - (int)Math.Round((waveform1[(int)Math.Round((i + 1) / xS)] - maxmin1[1]) * yS)); }
Et la seconde est celle-ci:
Cette fois, pas de downsampling, je dessine tous les points (timeWindow = 160 000), l'affichage est beaucoup plus stable car le signal acquis à t0 a la meme valeur entre 2 refresh consecutifs. Par contre, le refresh rate chute enormement à cause du nombre de points à dessiner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for (i = 0; i < timeWindow - 1; i++) { g.DrawLine(P1, (int)Math.Round(i * xS), this.Height - 5 - (int)Math.Round((waveform1[i] - maxmin1[1]) * yS), (int)Math.Round((i + 1) * xS), this.Height - 5 - (int)Math.Round((waveform1[i + 1] - maxmin1[1]) * yS)); }
Quelqu'un aurait-il une solution pour un affichage stable et rapide?
Merci de m'aider
Partager