Ir al contenido

Modulación PDM

De Wikipedia, la enciclopedia libre

De las palabras inglesas Pulse Density Modulation (Modulación de señal por Densidad de Impulsos), es usado en la representación y conversión de señales analógicas al dominio digital (y a la inversa). A diferencia de la modulación PCM, la amplitud de una señal no se codifica asignándole unos valores de amplitud según el número de niveles de cuantización, sino que en el PDM la amplitud se representa por densidad o número de impulsos en función del tiempo.

Una aplicación básica para a este tipo de modulación la encontramos en la tecnología SACD, desarrollada por Sony y Philips Electronics en 1999.

Esta tecnología de audio de alta definición utiliza complejos sistemas de conversión, codificación, etc., tales como la Modulación Sigma-Delta y la codificación Direct Stream Digital (DSD) basados en PDM.

El PWM (Modulación por ancho de pulsos), sería un caso especial del PDM, donde todos los impulsos correspondientes a una muestra son contiguos en la señal digital.

Básico

[editar]

En la tasa de bits resultante de una modulación PDM, un 1 corresponde a un pulso de polaridad positiva (+A) y un 0 corresponde a un pulso de polaridad negativa (-A).

Matemáticamente esto se puede representar con la siguiente expresión:

* Donde x[n] es el pulso bipolar (-A o +A) y a[n] es la tasa binaria de bits resultante (0 o 1)

Una señal formada por un seguido de 1’s corresponde a la representación de amplitud máxima de la señal (máxima positiva).

Una señal formada por todo 0’s, en comparación, representaría la amplitud mínima (negativa).

Para un bitrate resultante de aplicar una modulación PDM (señal bipolar) podemos recuperar la señal original (analógica) aplicando un filtro paso Bajo a la misma.

Conversión analógico-digital

[editar]

Una tasa de bits PDM codifica una señal analógica a través de la modulación sigma-delta.

Este proceso utiliza un cuantificador de 1 bit que produce un 1 o un 0 dependiendo de la amplitud de la señal analógica.

Si tuviéramos un bitrate formado por todo 1, o bien por todo 0, estaríamos representando una señal la cual siempre tiene valores máximos positivos o negativos, respectivamente.

Dado que en el mundo real una señal analógica raramente tendrá valores máximos o mínimos durante toda la señal, este caso será considerado un error de cuantización.

Dentro del algoritmo del PDM, este error es realimentado negativamente en el bucle de manera que cada error influenciará a cada nueva muestra a cuantificar y su respectivo error (haciendo un promedio de los mismos).

Conversión digital-analógico

[editar]

El proceso de decodificación de la señal PDM para obtener la señal analógica original es bastante simple. Básicamente tenemos que filtrar la señal bipolar resultante con un filtro analógico paso Bajo, dado que esencialmente, un filtro paso bajo actúa como un promediador de señal.

Ejemplos

[editar]

Un único periodo de la función seno, representada con 100 muestras utilizando modulación PDM:

0101011011110111111111111111111111011111101101101010100100100000010000000000000000000001000010010101

* En la imagen se representa un periodo de la señal seno, modulado con PDM y representada con 100 muestras.

Los 1’s como pulsos de color azul, mientras que los 0’s como pulsos de color blanco.

Podemos observar como, en los picos de máxima amplitud (π/2) obtenemos pulsos azules (1’s) seguidos, y a medida que va disminuyendo la amplitud, se van intercalando 0’s hasta llegar a valores mínimos de amplitud (3 π/2) representado con un seguido de pulsos blancos (0’s).

En la alternación 101 encontramos Amplitud=0 de la señal original.

Dos periodos de una señal sinusoidal representada con PDM 100 muestras:

0101101111111111111101101010010000000000000100010011011101111111111111011010100100000000000000100101

* Al utilizar el mismo número de pulsos para crear el doble de muestras (teniendo el doble de frecuencia y el mismo número de puntos), vemos que los picos los representamos con densidades proporcionales.

Algoritmo

[editar]

El modelo digital de un modulador por densidad de impulsos se obtiene a partir del modelo digital de un modulador sigma-delta.

Modulador Sigma-delta de 1.er orden

Considerando una señal x[n] en el dominio discreto como la señal de entrar de un modulador sigma-delta de 1.er orden, y con una señal y[n] como su salida, obtenemos que, en el dominio frecuencial, el comportamiento del modulador sigma-delta se puede representar como:

Reorganizando los términos obtenemos:

* En este caso, E(z) es el error de cuantización del modulador sigma-delta en el dominio frecuencial.

* El factor representa un filtro paso alto, gracias al cual E(z) contribuirá en menor medida a la salida Y(z) en las frecuencias bajas, y más en las altas.

Esto ejemplifica el comportamiento del modulador en relación con el tratamiento del ruido residual: “ el ruido resultante de la cuantización se desplaza al rango de las altas frecuencias (no audibles por el Sistema Auditivo Humano) alejándolo de las bajas i perceptibles”.

Utilizando la inversa de la transformada Z, se consigue convertir esta ecuación en una ecuación diferencia, relacionando la entrada del modulador sigma-delta con su salida en el dominio temporal discreto:

Hay dos consideraciones adicionales a tener en cuenta: En primer lugar, cada muestra de la salida y[n] se seleccionará de manera que reduzca al mínimo el error de cuantización e[n] y en su lugar y[n] se representa con un solo bit, o lo que es lo mismo, que la salida solo podrá tener dos valores posibles, los cuales por conveniencia serán +-1:

Finalmente, se deduce una ecuación que relaciona la salida y[n] con la entrada x[n]. El error de cuantización de cada muestra se realimenta de nuevo en la entrada para complementar la siguiente muestra.

El siguiente pseudocódigo implementa este algoritmo para convertir una señal modulada con PCM a una por PDM:

// Codifica las muestras según la modulación por densidad de pulsos  
// utilizando un modulador sigma-delta de primer orden 
function pdm(real[0..s] x)
  var int[0..s] y
  var int[-1..s] qe
 qe[-1] := 0                  // el error inicial de funcionamiento será 0
  for n from 0 to s
      if x[n] >= qe[n-1]
          y[n] := 1
      else
          y[n] := -1
      qe[n] := y[n] - x[n] + qe[n-1]
  return y, qe                 //Devolvemos la salida i el error de funcionamiento