Il y a quelque temps, j'essayais différentes façons de dessiner des formes d'onde numériques , et l'une des choses que j'ai essayées était, au lieu de la silhouette standard de l'enveloppe d'amplitude, de l'afficher plus comme un oscilloscope. Voici à quoi ressemble une onde sinusoïdale et carrée sur une lunette:
La façon naïve de le faire est:
- Divisez le fichier audio en un morceau par pixel horizontal dans l'image de sortie
- Calculer l'histogramme des amplitudes d'échantillonnage pour chaque bloc
- Tracer l'histogramme par luminosité sous forme de colonne de pixels
Cela produit quelque chose comme ceci:
Cela fonctionne bien s'il y a beaucoup d'échantillons par morceau et que la fréquence du signal n'est pas liée à la fréquence d'échantillonnage, mais pas autrement. Si la fréquence du signal est un sous-multiple exact de la fréquence d'échantillonnage, par exemple, les échantillons se produiront toujours exactement aux mêmes amplitudes dans chaque cycle et l'histogramme ne sera que de quelques points, même si le signal reconstruit réel existe entre ces points. Cette impulsion sinusoïdale devrait être aussi lisse que ci-dessus à gauche, mais ce n'est pas parce qu'elle est exactement de 1 kHz et que les échantillons se produisent toujours autour des mêmes points:
J'ai essayé le suréchantillonnage pour augmenter le nombre de points, mais cela ne résout pas le problème, aide simplement à lisser les choses dans certains cas.
Donc ce que j'aimerais vraiment, c'est un moyen de calculer le vrai PDF (probabilité vs amplitude) du signal reconstruit continu à partir de ses échantillons numériques (amplitude vs temps). Je ne sais pas quel algorithme utiliser pour cela. En général, le PDF d'une fonction est la dérivée de sa fonction inverse .
PDF de sin (x):
Mais je ne sais pas comment calculer cela pour des vagues où l'inverse est une fonction à valeurs multiples , ni comment le faire rapidement. Le diviser en branches et calculer l'inverse de chacune, prendre les dérivées et les additionner toutes ensemble? Mais c'est assez compliqué et il y a probablement un moyen plus simple.
Ce "PDF de données interpolées" est également applicable à une tentative que j'ai faite de faire une estimation de la densité du noyau d'une trace GPS. Il aurait dû être en forme d'anneau, mais parce qu'il ne regardait que les échantillons et ne tenait pas compte des points interpolés entre les échantillons, le KDE ressemblait plus à une bosse qu'à un anneau. Si les échantillons sont tout ce que nous savons, alors c'est le mieux que nous puissions faire. Mais les échantillons ne sont pas tout ce que nous savons. Nous savons également qu'il existe un chemin entre les échantillons. Pour le GPS, il n'y a pas de reconstruction parfaite de Nyquist comme pour le son à bande limitée, mais l'idée de base s'applique toujours, avec quelques suppositions dans la fonction d'interpolation.
la source
Réponses:
Interpoler à plusieurs fois le taux d'origine (par exemple, 8x suréchantillonné). Cela vous permet de supposer un signal linéaire par morceaux. Ce signal aura très peu d'erreur par rapport à la résolution infinie, interpolation sin (x) / x continue de la forme d'onde.
Supposons que chaque paire de valeurs suréchantillonnées ait une ligne continue d'une valeur à la suivante. Utilisez toutes les valeurs entre. Cela vous donne une fine tranche horizontale de y1 à y2 à accumuler dans un fichier PDF à résolution arbitraire. Chaque tranche rectangulaire de probabilité doit être mise à l'échelle à une zone de 1 / néchantillons.
L'utilisation de la ligne entre les échantillons plutôt que l'échantillon lui-même empêche un PDF "spikey", même dans le cas où il existe une relation fondamentale entre la période d'échantillonnage et la forme d'onde.
la source
Ce que j'irais avec est essentiellement le "rééchantillonneur aléatoire" de Jason R, qui à son tour est une implémentation basée sur le signal pré-échantillonné de l'échantillonnage stochastique de Yoda.
J'ai utilisé une simple interpolation cubique à un point aléatoire entre chaque deux échantillons. Pour un son de synthé primitif (décroissance d'un signal carré saturé non limité en bande + même des harmoniques à un sinus), il ressemble à ceci:
Comparons-le à une version plus échantillonnée,
et l'étrange avec le même échantillonnage mais sans interpolation.
Un artefact notable de cette méthode est le dépassement dans le domaine de type carré, mais c'est en fait ce à quoi ressemblerait le PDF du signal filtré sinc (comme je l'ai dit, mon signal n'est pas limité en bande) et représente bien mieux l'intensité sonore perçue que les pics, s'il s'agissait d'un signal audio.
Code (Haskell):
rand list
est une liste de variables aléatoires dans la plage [0,1].la source
stochasticAntiAlias
. Mais la version plus échantillonnée est en effet à taux uniforme dans les deux cas.Alors que votre approche est théoriquement correcte (et doit être légèrement modifiée pour les fonctions non monotones), il est extrêmement difficile de calculer l'inverse d'une fonction générique. Comme vous le dites, vous devrez faire face aux points de branchement et aux coupures de branche, ce qui est faisable, mais vous ne le voudriez vraiment pas.
Comme vous l'avez déjà mentionné, l'échantillonnage régulier échantillonne le même ensemble de points et, en tant que tel, est très sensible aux mauvaises estimations dans les régions où il n'échantillonne pas (même si le critère de Nyquist est satisfait). Dans ce cas, l'échantillonnage sur une période plus longue n'aide pas non plus.
En général, lorsqu'il s'agit de fonctions de densité de probabilité et d'histogrammes, c'est une bien meilleure idée de penser en termes d' échantillonnage stochastique que d'échantillonnage régulier (voir la réponse liée pour une introduction). En échantillonnant stochastiquement, vous pouvez vous assurer que chaque point a une probabilité égale d'être «touché» et est une bien meilleure façon d'estimer le pdf.
Vous pouvez facilement voir que bien qu'il soit bruyant, c'est une bien meilleure approximation du PDF réel que celui de droite qui montre des zéros à plusieurs intervalles et de grosses erreurs à plusieurs autres. En ayant un temps d'observation plus long, vous pouvez réduire la variance de celui de droite, pour finalement converger vers le PDF exact (ligne noire en pointillés) dans la limite des grandes observations.
la source
Estimation de la densité du noyau
Une façon d'estimer le PDF d'une forme d'onde est d'utiliser un estimateur de densité de noyau .
Mise à jour: informations supplémentaires intéressantes.
Supposons que vous ayez votre signal pour , alors --- comme vous dites --- vous pouvez également connaître sa DFT :x(n) n=0,1,...,N−1 X(k)
Pour que soit le coefficient de :X(k) eȷ2πnk/N
Donc, devinez ce que vous pourriez faire après la conversion de tous les PDF de chaque composant Fourier:
Plus de réflexion cependant!
la source
Comme vous l'avez indiqué dans l'un de vos commentaires, il serait intéressant de pouvoir calculer l'histogramme du signal reconstruit en utilisant uniquement les échantillons et le PDF de la fonction sinc qui interpole les signaux à bande limitée. Malheureusement, je ne pense pas que cela soit possible car l'histogramme du sinc ne contient pas toutes les informations que possède le signal lui-même; toutes les informations sur les positions du domaine temporel où chaque valeur est rencontrée sont perdues. Cela rend impossible de modéliser la façon dont les versions échelonnées et temporisées du sinc se résumeraient, ce qui est ce que vous voudriez afin de calculer l'histogramme de la version "continue" ou suréchantillonnée du signal sans réellement faire le suréchantillonnage.
Je pense que vous vous retrouvez avec l'interpolation comme la meilleure option. Vous avez indiqué quelques problèmes qui vous ont empêché de vouloir faire cela, qui, je pense, peuvent être résolus:
Dépenses de calcul: il s'agit bien sûr toujours d'une préoccupation relative, en fonction de l'application spécifique pour laquelle vous souhaitez l'utiliser. Sur la base du lien que vous avez publié dans la galerie de rendus que vous avez collectés, je suppose que vous souhaitez le faire pour la visualisation des signaux audio. Que cela vous intéresse pour une application en temps réel ou hors ligne, je vous encourage à créer un prototype d'interpolateur efficace et à voir s'il est vraiment trop coûteux. Le rééchantillonnage polyphasé est un bon moyen de le faire de manière flexible (vous pouvez utiliser n'importe quel facteur rationnel).
la source
Vous devez lisser l'histogramme (cela donnera des résultats similaires à l'utilisation d'une méthode du noyau). Exactement comment le lissage doit être effectué a besoin d'expérimentation. Peut-être que cela pourrait aussi se faire par interpolation. En plus du lissage, je pense que vous obtiendrez également de meilleurs résultats si vous suréchantillonnez votre forme d'onde de manière à ce que la fréquence d'échantillonnage soit «significativement plus élevée» que la fréquence la plus élevée de votre entrée. Cela devrait aider dans le cas «délicat» où une onde sinusoïdale est liée à la fréquence d'échantillonnage de telle manière que seuls quelques casiers de l'histogramme sont remplis. Si elle est prise à l'extrême, une fréquence d'échantillonnage suffisamment élevée devrait vous donner de belles parcelles sans lissage. Le suréchantillonnage combiné à une sorte de lissage devrait donc donner de meilleurs graphiques.
Vous donnez un exemple de tonalité à 1 kHz, où l'intrigue n'est pas celle que vous attendez. Voici ma proposition (code Matlab / Octave)
Pour votre ton 1000Hz, vous obtenez ceci
Ce que vous devez faire est de régler l'expression upsampling_factor selon vos préférences.
Toujours pas sûr à 100% de vos besoins. Mais en utilisant le principe de suréchantillonnage et de lissage ci-dessus, vous obtiendrez ceci pour la tonalité 1 kHz (faite avec Matlab). Notez que dans l'histogramme brut, il existe de nombreux bacs avec zéro hit.
la source