Hace un tiempo estaba intentando diferentes formas de dibujar formas de onda digitales , y una de las cosas que intenté fue, en lugar de la silueta estándar de la envolvente de amplitud, mostrarla más como un osciloscopio. Así es como se ve una onda sinusoidal y cuadrada en un osciloscopio:
La forma ingenua de hacer esto es:
- Divida el archivo de audio en un fragmento por píxel horizontal en la imagen de salida
- Calcule el histograma de amplitudes de muestra para cada fragmento
- Trace el histograma por brillo como una columna de píxeles
Produce algo como esto:
Esto funciona bien si hay muchas muestras por fragmento y la frecuencia de la señal no está relacionada con la frecuencia de muestreo, pero no de otra manera. Si la frecuencia de la señal es un submúltiplo exacto de la frecuencia de muestreo, por ejemplo, las muestras siempre se producirán exactamente a las mismas amplitudes en cada ciclo y el histograma solo tendrá unos pocos puntos, aunque la señal reconstruida real exista entre estos puntos. Este pulso sinusoidal debe ser tan suave como el anterior a la izquierda, pero no es porque sea exactamente 1 kHz y las muestras siempre ocurren alrededor de los mismos puntos:
Intenté el muestreo para aumentar el número de puntos, pero no resuelve el problema, solo ayuda a suavizar las cosas en algunos casos.
Entonces, lo que realmente me gustaría es una forma de calcular el PDF verdadero (probabilidad vs amplitud) de la señal reconstruida continua a partir de sus muestras digitales (amplitud vs tiempo). No sé qué algoritmo usar para esto. En general, el PDF de una función es la derivada de su función inversa .
PDF de sin (x):
Pero no sé cómo calcular esto para ondas donde la inversa es una función de valores múltiples , o cómo hacerlo rápido. Divídalo en ramas y calcule el inverso de cada uno, tome las derivadas y sume todas. Pero eso es bastante complicado y probablemente haya una forma más simple.
Este "PDF de datos interpolados" también es aplicable a un intento que hice para hacer una estimación de la densidad del núcleo de una pista GPS. Debería haber sido en forma de anillo, pero debido a que solo miraba las muestras y no consideraba los puntos interpolados entre las muestras, el KDE parecía más una joroba que un anillo. Si las muestras son todo lo que sabemos, entonces esto es lo mejor que podemos hacer. Pero las muestras no son todo lo que sabemos. También sabemos que hay un camino entre las muestras. Para GPS, no hay una reconstrucción perfecta de Nyquist como la hay para audio de banda ilimitada, pero la idea básica aún se aplica, con algunas conjeturas en la función de interpolación.
fuente
Respuestas:
Interpolar varias veces la tasa original (por ejemplo, 8x sobremuestreado). Esto le permite asumir una señal lineal por partes. Esta señal tendrá muy poco error en comparación con la resolución infinita, interpolación sin (x) / x continua de la forma de onda.
Suponga que cada par de valores sobremuestreados tiene una línea continua de un valor al siguiente. Use todos los valores entre. Esto le proporciona un corte horizontal delgado de y1 a y2 para que se acumule en un PDF de resolución arbitraria. Cada segmento rectangular de probabilidad debe escalarse a un área de muestras 1 / n.
El uso de la línea entre muestras en lugar de la muestra misma evita un PDF "puntiagudo", incluso en el caso de que haya una relación fundamental entre el período de muestreo y la forma de onda.
fuente
Con lo que me gustaría ir es esencialmente el "remuestreador aleatorio" de Jason R, que a su vez es una implementación basada en señales previamente muestreadas del muestreo estocástico de Yoda.
He usado interpolación cúbica simple a un punto aleatorio entre cada dos muestras. Para un sonido de sintetizador primitivo (descomposición de una señal cuadrada saturada sin límite de banda + incluso armónicos a un seno) se ve así:
Comparémoslo con una versión de muestra más alta,
y el extraño con la misma frecuencia de muestreo pero sin interpolación.
El artefacto notable de este método es el sobreimpulso en el dominio cuadrado, pero en realidad es así como se vería el PDF de la señal filtrada sinc (como dije, mi señal no tiene límite de banda) y representa mucho mejor el volumen percibido. que los picos, si esto fuera una señal de audio.
Código (Haskell):
rand list
es una lista de variables aleatorias en el rango [0,1].fuente
stochasticAntiAlias
de esto. Pero la versión de muestra más alta es de hecho una tasa uniforme en ambos casos.Si bien su enfoque es teóricamente correcto (y debe modificarse ligeramente para funciones no monótonas), es extremadamente difícil calcular el inverso de una función genérica. Como dices, tendrás que lidiar con los puntos de ramificación y los cortes de ramificación, lo cual es factible, pero en serio no querrás hacerlo.
Como ya mencionó, el muestreo regular muestrea el mismo conjunto de puntos y, como tal, es altamente susceptible a estimaciones pobres en regiones donde no se muestrea (incluso si se cumple el criterio de Nyquist). En este caso, el muestreo por un período más largo tampoco ayuda.
En general, cuando se trata de funciones de densidad de probabilidad e histogramas, es una idea mucho mejor pensar en términos de muestreo estocástico que el muestreo regular (vea la respuesta vinculada para una introducción). Al tomar muestras estocásticamente, puede asegurarse de que cada punto tenga la misma probabilidad de ser "alcanzado" y que sea una forma mucho mejor de estimar el pdf.
Puede ver fácilmente que, aunque es ruidoso, es una aproximación mucho mejor al PDF real que el de la derecha que muestra ceros en varios intervalos y grandes errores en varios otros. Al tener un tiempo de observación más largo, puede reducir la varianza en el de la derecha, eventualmente convergiendo al PDF exacto (línea negra discontinua) en el límite de observaciones grandes.
fuente
Estimación de densidad del núcleo
Una forma de estimar el PDF de una forma de onda es usar un estimador de densidad del núcleo .
Actualización: información adicional interesante.
Por lo tanto, adivine qué es lo que puede ser para involucrar todos los archivos PDF de cada componente de Fourier:
¡Sin embargo, se requiere más pensamiento!
fuente
Como indicó en uno de sus comentarios, sería atractivo poder calcular el histograma de la señal reconstruida utilizando solo las muestras y el PDF de la función sinc que interpola las señales de límite de banda. Desafortunadamente, no creo que esto sea posible porque el histograma del sinc no tiene toda la información que tiene la señal; toda la información sobre las posiciones en el dominio del tiempo donde se encuentra cada valor se pierde. Esto hace que sea imposible modelar cómo se sumarían las versiones escaladas y retardadas de tiempo de la sinc, que es lo que desearía para calcular el histograma de la versión "continua" o muestreada hacia arriba de la señal sin hacer realmente el muestreo ascendente.
Creo que te queda la interpolación como la mejor opción. Indicaste un par de problemas que te impidieron querer hacer esto, lo que creo que puede abordarse:
Gastos computacionales: Por supuesto, esto es siempre una preocupación relativa, dependiendo de la aplicación específica para la que desea usar esto. Según el enlace que publicó en la galería de representaciones que ha recopilado, supongo que desea hacer esto para visualizar las señales de audio. Ya sea que esté interesado en esto para una aplicación en tiempo real o fuera de línea, le animo a que realice un prototipo de un interpolador eficiente y vea si es realmente demasiado costoso. El remuestreo polifásico es una buena manera de hacer esto que es flexible (puede usar cualquier factor racional).
fuente
Necesita suavizar el histograma (esto arrojará resultados similares a los de usar un método kernel). Exactamente cómo se debe realizar el alisado necesita experimentación. Tal vez también podría hacerse por interpolación. Además del suavizado, creo que también obtendrá mejores resultados si sube la muestra de su forma de onda de tal manera que la frecuencia de muestreo sea 'significativamente mayor' que la frecuencia más alta en su entrada. Esto debería ayudar en el caso 'complicado' en el que una onda sinusoidal está relacionada con la frecuencia de muestreo de tal manera que solo se rellenan unos pocos contenedores en el histograma. Si se lleva al extremo, una frecuencia de muestreo lo suficientemente alta debería proporcionar buenas parcelas sin suavizar. Por lo tanto, el muestreo ascendente combinado con algún tipo de suavizado debería producir mejores parcelas.
Usted da un ejemplo de un tono de 1 kHz, donde la trama no es la esperada. Aquí está mi propuesta (código Matlab / Octave)
Para tu tono de 1000Hz obtienes esto
Lo que debe hacer es ajustar la expresión upsampling_factor a su preferencia.
Todavía no estoy 100% seguro exactamente cuáles son sus requisitos. Pero utilizando el principio anterior de muestreo y suavizado obtendrá esto para el tono de 1 kHz (hecho con Matlab). Tenga en cuenta que en el histograma sin formato hay muchos contenedores con cero aciertos.
fuente