Procesadores Digitales de Señal · Capítulo 1
Introducción a los Procesadores Digitales de Señal (DSP)
Qué es un DSP, por qué existe y qué lo distingue de un microcontrolador. El capítulo recorre la cadena completa desde la señal analógica hasta la salida, los fundamentos de muestreo y cuantización, la restricción de tiempo real y la arquitectura construida alrededor de una sola operación: multiplicar y acumular.
Capítulo 1Presentación del capítulo
Un ingeniero en Electrónica sale de la carrera sabiendo diseñar un filtro activo con amplificadores operacionales, programar un microcontrolador y analizar un sistema con la transformada de Laplace. El procesamiento digital de señales une esas tres habilidades: el filtro se convierte en una ecuación, la ecuación en un programa y el programa corre en un procesador diseñado específicamente para ejecutarla a gran velocidad.
Este capítulo no pretende enseñar toda la teoría del procesamiento digital. Su propósito es construir el mapa mental: entender qué hace cada bloque de un sistema con DSP, de dónde salen sus limitaciones y qué preguntas hacerse al elegir o evaluar uno. Cada tema queda planteado para estudiarse después con mayor profundidad.
- Definir qué es un DSP y explicar en qué se diferencia de un microcontrolador de propósito general.
- Describir la función de cada bloque de la cadena analógico → digital → analógico, incluidos los filtros anti-aliasing y de reconstrucción.
- Aplicar el teorema de Nyquist y calcular la frecuencia de alias de un tono muestreado.
- Calcular la resolución (LSB) y la relación señal a ruido de cuantización de un convertidor de N bits.
- Estimar el presupuesto de ciclos por muestra y la carga de CPU de un algoritmo en tiempo real.
- Explicar por qué la operación MAC y la arquitectura Harvard modificada son el núcleo de un DSP.
- Distinguir entre aritmética de punto fijo (formato Q15) y de punto flotante, y reconocer sus riesgos.
- Comparar un DSP con un MCU, una FPGA y una GPU para seleccionar la plataforma adecuada.
Convenciones del texto
- Notación: x(t) es una señal continua; x[n] es su versión discreta, donde n es el índice de muestra. fs es la frecuencia de muestreo y Ts = 1/fs el periodo de muestreo.
- Términos en inglés: se indican en cursiva la primera vez que aparecen, porque son los que encontrará en hojas de datos y notas de aplicación. El glosario al final reúne ambos idiomas.
- Recuadros: Ejemplo para cálculos resueltos, En el banco de pruebas para mediciones prácticas y Error frecuente para fallas típicas.
¿Qué es un DSP?
Las siglas DSP tienen dos significados que conviene separar desde el principio:
- Digital Signal Processing (procesamiento digital de señales): la disciplina matemática que estudia cómo filtrar, transformar, analizar o sintetizar señales representadas como secuencias de números.
- Digital Signal Processor (procesador digital de señal): el circuito integrado diseñado para ejecutar esos algoritmos de forma eficiente. Este capítulo trata principalmente sobre él.
Un procesador digital de señal es un microprocesador cuya arquitectura, conjunto de instrucciones y periféricos están optimizados para un tipo particular de cálculo: aplicar repetidamente operaciones aritméticas sencillas (sobre todo multiplicaciones y sumas) a un flujo continuo de muestras, terminando cada cálculo dentro de un plazo fijo.
Funcionalmente, el DSP recibe una secuencia de números que representan una señal, la transforma según un algoritmo y entrega otra secuencia. Lo que lo distingue de un procesador de propósito general no es qué puede calcular (cualquier CPU puede ejecutar un filtro digital), sino cuánto tarda, con cuánta energía y con qué certeza de cumplir el plazo.
Un microcontrolador está optimizado para tomar decisiones (condiciones, saltos, manejo de periféricos). Un DSP está optimizado para hacer aritmética repetitiva sobre datos que llegan sin parar. La mayoría de los sistemas reales necesitan ambas cosas, por eso los DSP modernos incluyen funciones de control y muchos microcontroladores incluyen instrucciones DSP.
Tres características definen a un DSP:
- Una multiplicación-acumulación por ciclo (o varias): la operación a ← a + b·c se ejecuta en un solo ciclo de reloj, junto con la lectura de los dos operandos siguientes.
- Acceso a memoria en paralelo: varios buses independientes permiten leer la instrucción y dos datos en el mismo ciclo.
- Ejecución determinista: el número de ciclos de un algoritmo es predecible. Esto permite garantizar que el cálculo termine antes de que llegue la siguiente muestra.
Procesamiento analógico frente a digital
Un filtro paso bajas puede construirse con un amplificador operacional, dos resistencias y dos capacitores (topología Sallen-Key), o con un ADC, un DSP y un DAC. ¿Por qué tomar el camino aparentemente más complicado?
| Criterio | Procesamiento analógico | Procesamiento digital |
|---|---|---|
| Repetibilidad | Depende de la tolerancia de componentes (±1 %, ±5 %); dos unidades nunca son idénticas | Dos unidades con el mismo programa dan resultados idénticos bit a bit |
| Deriva | Varía con la temperatura y el envejecimiento | Los coeficientes no cambian con la temperatura ni con el tiempo |
| Flexibilidad | Cambiar la respuesta exige cambiar componentes | Cambiar la respuesta es cambiar coeficientes, incluso en operación |
| Funciones posibles | Limitadas a lo que se puede construir con R, L, C y amplificadores | Filtros de fase lineal, filtros adaptativos, FFT, compresión, decisiones lógicas |
| Ancho de banda | Hasta GHz con componentes adecuados | Limitado por fs y por la capacidad de cálculo |
| Latencia | Prácticamente nula (solo el retardo de grupo del filtro) | Siempre existe: conversión + cálculo + buffers |
| Ruido y rango dinámico | Limitados por ruido térmico y voltajes de alimentación | Limitados por la cuantización (número de bits) y por los convertidores |
| Costo y consumo | Bajos para funciones simples | Más altos para funciones simples; mucho más bajos para funciones complejas |
Tabla 1.1. Comparación entre procesamiento analógico y digital.
La conclusión práctica es que el procesamiento digital gana cuando la función es compleja, debe ser reproducible o debe poder cambiarse. El procesamiento analógico sigue siendo indispensable en los extremos de la cadena: ningún sistema digital elimina la necesidad de un buen filtro anti-aliasing, de una referencia de voltaje estable o de un amplificador de bajo ruido en la entrada.
La cadena de procesamiento de señal
Casi todas las señales de interés (voz, vibración, corriente de un motor, electrocardiograma) son analógicas. Para que un DSP las procese, la señal debe atravesar una cadena de bloques como la de la Figura 1.1.
Cada bloque tiene una función específica y aporta sus propias limitaciones:
- Filtro anti-aliasing (anti-aliasing filter): filtro analógico paso bajas que elimina las componentes por encima de fs/2 antes del muestreo. Si no se eliminan, aparecen como frecuencias falsas que ningún procesamiento posterior puede separar de la señal (ver "Muestreo y teorema de Nyquist").
- Convertidor analógico-digital (ADC): toma muestras a intervalos regulares Ts y asigna a cada una un código de N bits. Introduce el error de cuantización (ver "Cuantización y resolución").
- DSP: ejecuta el algoritmo sobre cada muestra o sobre bloques de muestras. Necesita memoria de programa (el algoritmo) y memoria de datos (muestras, coeficientes y resultados intermedios).
- Convertidor digital-analógico (DAC): convierte cada número en un voltaje y lo mantiene constante hasta la siguiente muestra (retenedor de orden cero, zero-order hold). El resultado es una señal escalonada.
- Filtro de reconstrucción (también llamado anti-imagen): suaviza la señal escalonada y elimina las réplicas espectrales (imágenes) que aparecen alrededor de fs, 2fs, etc.
- Host: la computadora o el procesador principal que carga el programa, ajusta parámetros y supervisa la operación.
No todos los sistemas usan la cadena completa. Un analizador de vibraciones tiene ADC pero no DAC (su salida es un resultado numérico o una pantalla). Un sintetizador de audio tiene DAC pero no ADC. Un módem tiene ambos. En los controladores digitales de motores y fuentes conmutadas, la "salida analógica" es en realidad una señal PWM que maneja transistores de potencia.
Muestreo y teorema de Nyquist
Muestrear es medir el valor de una señal continua en instantes equiespaciados. La secuencia resultante es:
La pregunta fundamental es: ¿cuántas muestras por segundo se necesitan para que los puntos representen la señal original sin ambigüedad? La respuesta la da el teorema de muestreo de Nyquist-Shannon:
Una señal cuyo espectro está limitado a fmáx puede reconstruirse exactamente a partir de sus muestras si la frecuencia de muestreo es mayor que el doble de fmáx. La frecuencia fs/2 se llama frecuencia de Nyquist y es el límite superior de lo que el sistema puede representar.
Aliasing: cuando no se cumple Nyquist
Si la señal contiene componentes por encima de fs/2, el sistema no falla de forma evidente: las muestras simplemente coinciden con las de otra frecuencia más baja. A ese fenómeno se le llama aliasing (traslape o solapamiento espectral). La frecuencia aparente es:
En el dominio de la frecuencia, el muestreo replica el espectro de la señal alrededor de cada múltiplo de fs. Si el ancho de banda de la señal supera fs/2, las réplicas se enciman y la información se mezcla de forma irreversible (Figura 1.4).
Pensar que basta con que la señal útil esté por debajo de fs/2. El ruido, las armónicas, la interferencia de fuentes conmutadas y cualquier componente fuera de banda también se pliega hacia la banda útil. Por eso el filtro anti-aliasing no es opcional, aunque la señal de interés sea de baja frecuencia.
El precio del filtro anti-aliasing y la ventaja del sobremuestreo
En la práctica, fs se elige bastante por encima de 2fmáx, porque ningún filtro real pasa de "dejar pasar todo" a "bloquear todo" en una frecuencia exacta. La distancia entre la banda útil y la primera frecuencia que se plegaría sobre ella define cuán abrupto debe ser el filtro.
Se digitaliza audio con banda útil de 20 kHz y un ADC de 16 bits (≈ 96 dB de rango dinámico). Una componente en f se pliega hacia la banda útil si f > fs − 20 kHz. Se busca la atenuación de 96 dB en esa frecuencia con un filtro Butterworth, cuya pendiente asintótica es de 20·n dB/década.
Por eso los ADC de audio modernos (tipo sigma-delta) muestrean internamente a varios MHz con un filtro analógico sencillo y luego reducen la tasa con un filtro digital muy abrupto (decimación). La complejidad se traslada del dominio analógico al digital, donde es barata y repetible.
| Aplicación | Banda útil | fs típica |
|---|---|---|
| Telefonía de voz | 300 Hz – 3.4 kHz | 8 kHz |
| Audio de alta calidad | 20 Hz – 20 kHz | 44.1 / 48 kHz |
| Audio profesional | hasta 40 kHz o más | 96 / 192 kHz |
| Electrocardiograma (ECG) | 0.05 – 150 Hz | 500 Hz – 1 kHz |
| Análisis de vibraciones | hasta 20 kHz | 51.2 kHz |
| Lazo de corriente de motor o fuente conmutada | según ancho de banda del lazo | 10 kHz – 1 MHz |
Tabla 1.2. Frecuencias de muestreo habituales por aplicación.
Cuantización y resolución
El muestreo discretiza el tiempo; la cuantización discretiza la amplitud. Un ADC de N bits divide su rango de entrada a escala completa VFS en 2N niveles. La separación entre niveles es el bit menos significativo (LSB):
Si la señal es suficientemente "activa" (cambia varios LSB entre muestras y no está correlacionada con fs), el error de cuantización se comporta como ruido blanco uniforme con valor eficaz LSB/√12. Para una senoide a escala completa, la relación señal a ruido de cuantización es:
Cada bit adicional aporta aproximadamente 6 dB de rango dinámico, es decir, duplica la resolución.
| N (bits) | Niveles | 1 LSB con VFS = 3.3 V | SNRq ideal | Uso típico |
|---|---|---|---|---|
| 8 | 256 | 12.9 mV | 49.9 dB | Video, señales de baja calidad |
| 12 | 4 096 | 0.806 mV | 74.0 dB | ADC integrados en MCU, control de motores |
| 16 | 65 536 | 50.4 µV | 98.1 dB | Audio de CD, instrumentación |
| 24 | 16 777 216 | 0.197 µV | 146.2 dB | Audio profesional, sismología, básculas |
Tabla 1.3. Resolución y SNR de cuantización ideal según el número de bits.
Resolución nominal frente a resolución efectiva
Un ADC de 24 bits nunca alcanza 146 dB: el ruido térmico, el ruido de la referencia, el jitter del reloj y la distorsión limitan el desempeño real. Por eso las hojas de datos reportan el número efectivo de bits (ENOB), calculado a partir de la SINAD medida (señal a ruido más distorsión):
Para medir el ENOB de un canal de adquisición se inyecta una senoide de muy baja distorsión cerca de la escala completa, se capturan varios miles de muestras, se calcula la FFT con una ventana adecuada y se obtiene la SINAD. Por ejemplo, una SINAD medida de 85 dB corresponde a un ENOB ≈ (85 − 1.76)/6.02 ≈ 13.8 bits. Si el resultado está muy por debajo de la hoja de datos, la causa raíz suele estar en el diseño (referencia ruidosa, tierra compartida con potencia, reloj con jitter o filtro de entrada inadecuado), no en el convertidor.
Tiempo real: presupuesto de ciclos y latencia
Un sistema opera en tiempo real cuando garantiza que cada resultado se produce antes de un plazo fijo. En un sistema que procesa muestra por muestra, ese plazo es el periodo de muestreo: todo el cálculo asociado a la muestra n debe terminar antes de que llegue la muestra n + 1. Tiempo real no significa "rápido", sino "a tiempo, siempre".
La herramienta básica para dimensionar un sistema es el presupuesto de ciclos por muestra:
Un DSP a 200 MHz debe aplicar un filtro FIR de 256 coeficientes a dos canales de audio muestreados a 48 kHz. El procesador ejecuta un MAC por ciclo y la sobrecarga por llamada al filtro (entrada y salida de la rutina, lectura del ADC, escritura al DAC) es de unos 20 ciclos.
Sobra capacidad para otros procesos. El mismo filtro en un microcontrolador sin MAC de un ciclo, que necesite unos 4 ciclos por coeficiente (carga del dato, carga del coeficiente, multiplicación, suma), consumiría 2 × (4·256 + 20) = 2 088 ciclos, es decir, ≈ 50 % de la CPU. Esa diferencia es, en esencia, la razón de existir de un DSP.
Procesamiento por muestra y por bloques
Procesar muestra por muestra da la mínima latencia, pero obliga a atender una interrupción por cada muestra. La alternativa común es acumular un bloque de N muestras con DMA (por ejemplo, con la técnica de doble buffer o ping-pong) y procesarlo completo. Esto reduce la sobrecarga y permite usar algoritmos que requieren bloques, como la FFT, a cambio de más latencia:
Con N = 64 y fs = 48 kHz, cada bloque dura 1.33 ms y la latencia por buffers es ≈ 2.7 ms, sin contar el retardo de grupo de los filtros digitales internos de los convertidores. Para monitoreo de audio en vivo es aceptable; para un lazo de control de corriente de una fuente conmutada sería inaceptable.
La forma más sencilla y confiable de medir la carga real es poner en alto una salida GPIO al entrar a la rutina de procesamiento y en bajo al salir. Con un osciloscopio se mide el ancho del pulso (tiempo de cálculo) y su periodo (Ts o tbloque). El ciclo de trabajo es la carga de CPU. Con persistencia infinita se observa además el peor caso, que es el que realmente importa en tiempo real.
La operación MAC y el filtro FIR
El algoritmo más representativo del procesamiento digital es el filtro de respuesta finita al impulso (FIR). Su salida es una suma ponderada de las últimas M muestras de entrada:
Los h[k] son los coeficientes del filtro: definen su respuesta en frecuencia y se calculan en la etapa de diseño. Cada término de la suma requiere exactamente tres operaciones: leer una muestra, leer un coeficiente y multiplicar-acumular. La Figura 1.7 muestra la estructura.
La operación que se repite es la multiplicación-acumulación (MAC). No aparece solo en los filtros FIR: la correlación, la convolución, la transformada discreta de Fourier, los productos matriz-vector y las capas de las redes neuronales se reducen a largas secuencias de MAC. Optimizar esa única operación acelera prácticamente todo el procesamiento de señales.
Anatomía de una unidad MAC
Tres detalles de la Figura 1.8 marcan la diferencia frente a una ALU convencional:
- Multiplicador en hardware de un ciclo: en un procesador sin multiplicador dedicado, una multiplicación de 16 × 16 bits por software toma decenas de ciclos.
- Acumulador extendido con bits de guarda: la suma intermedia puede crecer más allá del rango final sin perder información; solo importa que el resultado final quepa.
- Saturación: si el resultado excede el rango, se fija en el máximo (o mínimo) representable en lugar de "dar la vuelta" como en la aritmética entera normal. En audio, un desbordamiento sin saturación produce un chasquido fuerte; con saturación produce un recorte leve.
Arquitectura de un DSP
Para que la MAC se ejecute en un solo ciclo, el procesador debe obtener en ese mismo ciclo la instrucción, la muestra y el coeficiente. Con un único bus de memoria eso es imposible. De ahí la diferencia arquitectónica más visible entre un DSP y un procesador clásico.
Además de la MAC y de los buses múltiples, un DSP incorpora hardware que elimina la sobrecarga de "administración" en los ciclos de cálculo. La Figura 1.10 muestra los bloques de un DSP típico y la Tabla 1.4 resume qué problema resuelve cada uno.
| Recurso | Qué hace | Qué problema resuelve |
|---|---|---|
| MAC de un ciclo | Multiplica y acumula en un ciclo, a veces dos o más en paralelo | La operación básica deja de ser el cuello de botella |
| Buses y bancos de memoria múltiples | Lee instrucción y dos operandos simultáneamente | Alimenta la MAC en cada ciclo |
| Generadores de direcciones (AGU) | Calculan la siguiente dirección en paralelo con la aritmética | Los punteros avanzan sin instrucciones extra |
| Direccionamiento circular (módulo) | El puntero regresa al inicio del buffer automáticamente | Implementa la línea de retardo sin mover datos ni comparar índices |
| Direccionamiento de bits invertidos | Genera el orden bit-reversed que requiere la FFT | Elimina el reordenamiento por software en la FFT |
| Lazos sin sobrecarga | El hardware cuenta iteraciones y salta sin penalización | Un lazo de M MAC cuesta ≈ M ciclos, no 3M |
| Saturación y redondeo en hardware | Limitan el resultado al rango representable | Evitan desbordamientos catastróficos sin código adicional |
| Desplazador de barril | Desplaza cualquier número de bits en un ciclo | Escalamiento rápido en aritmética de punto fijo |
| DMA | Transfiere datos entre periféricos y memoria | La CPU no pierde ciclos copiando muestras |
| SIMD / VLIW | Una instrucción opera sobre varios datos, o varias unidades ejecutan en paralelo | Multiplica el rendimiento sin subir la frecuencia de reloj |
Tabla 1.4. Recursos de hardware característicos de un DSP.
El buffer circular
Un filtro FIR necesita conservar las últimas M muestras. Desplazar todo el arreglo en cada muestra (como en la Figura 1.7, tomada literalmente) costaría M movimientos de memoria adicionales. El buffer circular resuelve el problema moviendo el puntero en lugar de los datos:
Aritmética: punto fijo y punto flotante
Los DSP se dividen en dos grandes grupos según cómo representan los números, y esa elección afecta el costo, el consumo y, sobre todo, el esfuerzo de programación.
Punto fijo y el formato Q15
Un DSP de punto fijo de 16 bits trabaja con enteros en complemento a dos, pero el programador los interpreta como fracciones. En el formato Q15 (o Q1.15), el bit más significativo es el signo y los 15 restantes son la parte fraccionaria:
La resolución es 2−15 ≈ 3.05 × 10−5. La ventaja de trabajar con fracciones es que el producto de dos números menores que 1 también es menor que 1, de modo que la multiplicación por sí sola nunca desborda. El producto de dos Q15 es un Q30 de 32 bits; para regresar a Q15 se desplaza 15 bits a la derecha (con redondeo). Las sumas sí pueden desbordar, y para eso existen los bits de guarda y la saturación.
Punto flotante
Un DSP de punto flotante (típicamente IEEE 754 de 32 bits: signo, exponente de 8 bits y mantisa de 24 bits efectivos) ajusta automáticamente la escala de cada número. El rango dinámico es enorme y el programador prácticamente no se preocupa por desbordamientos ni por escalamiento.
| Aspecto | Punto fijo (16/32 bits) | Punto flotante (32 bits) |
|---|---|---|
| Rango dinámico | Limitado; requiere escalamiento manual | Muy amplio; escalamiento automático |
| Desarrollo | Más laborioso: hay que analizar rangos, escalar y validar desbordamientos | Más directo: el código se parece al modelo de MATLAB o Python |
| Costo, área y consumo | Menores | Mayores (aunque la diferencia se ha reducido) |
| Riesgos típicos | Desbordamiento, ciclos límite en IIR, pérdida de precisión por escalamiento | Comparaciones de igualdad, acumulación de error en sumas muy largas |
| Usos típicos | Telecomunicaciones, control de motores, productos de muy alto volumen o bajo consumo | Audio profesional, radar, instrumentación, prototipos |
Tabla 1.5. Comparación entre aritmética de punto fijo y de punto flotante.
Diseñar un filtro en MATLAB con coeficientes de doble precisión, cuantizarlos a Q15 "al final" y descubrir en el hardware que el filtro oscila o que su respuesta cambió. Los filtros IIR de orden alto son especialmente sensibles a la cuantización de coeficientes. La solución es implementarlos como cascada de secciones de segundo orden (biquads) y verificar el modelo de punto fijo antes de programar (ver "Programación y flujo de desarrollo").
Programación y flujo de desarrollo
Un DSP puede programarse en lenguaje ensamblador o en C/C++. Cada familia tiene su propio conjunto de instrucciones y su entorno de desarrollo proporcionado por el fabricante, que incluye compilador, depurador, simulador y bibliotecas optimizadas.
- C/C++: es el lenguaje principal hoy. Los compiladores para DSP son capaces de generar lazos MAC muy eficientes si el código se escribe de forma que el compilador lo reconozca.
- Intrínsecos (intrinsics): funciones de C que el compilador traduce directamente a una instrucción especial (por ejemplo, MAC con saturación o SIMD). Dan casi el rendimiento del ensamblador conservando la legibilidad.
- Ensamblador: se reserva para los núcleos críticos donde cada ciclo cuenta.
- Bibliotecas optimizadas: FIR, IIR, FFT, operaciones matriciales y funciones matemáticas ya escritas y verificadas por el fabricante (por ejemplo, CMSIS-DSP para núcleos Arm Cortex-M o las bibliotecas DSPLIB de Texas Instruments). Antes de escribir un filtro desde cero, conviene revisar si ya existe.
- Generación automática de código: herramientas como MATLAB/Simulink (Embedded Coder) y LabVIEW pueden generar código para un DSP a partir de un modelo.
Ejemplo: filtro IIR de 4.º orden en MATLAB
El siguiente código implementa un filtro IIR en forma directa II. Los coeficientes están en los vectores num (numerador, bk) y den (denominador, ak), ambos de 5 elementos para un filtro de 4.º orden. Observe que el algoritmo solo usa sumas, multiplicaciones y almacenamiento en memoria (el vector de estados w), exactamente las operaciones para las que está optimizado un DSP.
MATLAB · iir_df2.m
% Filtro IIR de 4.º orden en forma directa II % num = [b0 b1 b2 b3 b4], den = [a0 a1 a2 a3 a4] num = num / den(1); den = den / den(1); % normalizar para que a0 = 1 w = zeros(1,5); % estados: w(5) = w[n], w(1) = w[n-4] y = zeros(1,length(entrada)); for i = 1:length(entrada) w(5) = entrada(i) - den(2)*w(4) - den(3)*w(3) - den(4)*w(2) - den(5)*w(1); y(i) = num(1)*w(5) + num(2)*w(4) + num(3)*w(3) + num(4)*w(2) + num(5)*w(1); w(1:4) = w(2:5); % desplazar la línea de retardo end % Verificación contra la función nativa (debe dar ~1e-15): % max(abs(y - filter(num, den, entrada)))
Omitir el último término del numerador (num(5)*w(1)). Un filtro de orden 4 tiene 5 coeficientes en el numerador y 5 en el denominador. Si se omite uno, el código corre sin errores pero la respuesta es incorrecta. Con un Butterworth paso bajas de 4.º orden, la diferencia contra filter() llega a 0.08 en una señal de amplitud unitaria. De ahí la importancia de la última línea: siempre compare su implementación contra una referencia confiable.
Ejemplo: filtro FIR en C con aritmética Q15
Esta versión reúne los conceptos del capítulo: formato Q15, acumulador ancho, buffer circular, redondeo y saturación. Está escrita en C portable para que pueda compilarse en una PC y compararse contra el modelo. En un DSP real, el compilador o los intrínsecos convertirán el lazo en instrucciones MAC con direccionamiento circular.
C · fir_q15.c
#include <stdint.h> #define NTAPS 32 static int16_t h[NTAPS]; /* coeficientes en Q15 (desde el diseño) */ static int16_t xbuf[NTAPS]; /* línea de retardo (buffer circular) */ static unsigned idx = 0; /* posición de la muestra más reciente */ int16_t fir_q15(int16_t x) { int64_t acc = 0; /* acumulador ancho: bits de guarda */ unsigned j = idx; xbuf[idx] = x; /* la muestra nueva sobrescribe la más antigua */ for (unsigned k = 0; k < NTAPS; k++) { acc += (int32_t)h[k] * xbuf[j]; /* MAC: Q15 × Q15 = Q30 */ j = (j == 0) ? NTAPS - 1 : j - 1; /* direccionamiento circular */ } idx = (idx + 1) % NTAPS; acc = (acc + (1 << 14)) >> 15; /* Q30 → Q15 con redondeo */ if (acc > 32767) acc = 32767; /* saturación */ if (acc < -32768) acc = -32768; return (int16_t)acc; }
Este código se verificó en PC contra un modelo de doble precisión: el error máximo fue menor a 1 LSB, atribuible a la cuantización de los coeficientes. (El desplazamiento a la derecha de un entero negativo depende del compilador en C estándar; todos los compiladores habituales lo implementan como desplazamiento aritmético.)
Una estrategia robusta de verificación tiene tres niveles: (1) prueba bit-exact, en la que se alimenta el DSP con un archivo de vectores de entrada y su salida se compara con la del modelo de punto fijo; (2) prueba de respuesta en frecuencia, con un barrido senoidal o ruido blanco y la comparación de la magnitud medida contra la de diseño; y (3) prueba de casos extremos: entrada a escala completa, escalón, impulso y silencio, para revelar desbordamientos, ciclos límite y ruido residual.
Aplicaciones
Los DSP están presentes en cualquier sistema que procese señales en tiempo real, aunque muchas veces no como un chip independiente sino como un núcleo dentro de un sistema en chip (SoC). La Tabla 1.6 agrupa las aplicaciones más comunes.
| Sector | Aplicaciones | Algoritmos típicos |
|---|---|---|
| Audio | Ecualizadores, crossovers, cancelación activa de ruido, efectos, bocinas inteligentes | Biquads IIR, FIR, filtros adaptativos, compresores de rango dinámico |
| Telecomunicaciones | Cancelación de eco, módems, WiFi, radio definida por software | Filtros adaptativos (LMS), FFT/OFDM, codificación de canal |
| Control de motores | Variadores, servomotores, vehículos eléctricos | Control por orientación de campo (FOC), transformadas de Clarke y Park, controladores PI |
| Conversión de potencia | Fuentes conmutadas con control digital, inversores solares, cargadores | Compensadores digitales, PFC digital, PWM de alta resolución |
| Medicina | ECG, ultrasonido, prótesis auditivas, oximetría | Filtros de 50/60 Hz, formación de haz (beamforming), detección de patrones |
| Automotriz | Radar, cancelación de ruido en cabina, audio, sensores | FFT 2D para radar FMCW, filtros adaptativos |
| Instrumentación y pruebas | Analizadores de espectro, osciloscopios digitales, medición de THD, analizadores de vibración | FFT con ventanas, decimación, detección de picos, promediado |
| Industria | Mantenimiento predictivo, visión, ultrasonido no destructivo | Análisis de envolvente, FFT, correlación |
| Imagen y video | Cámaras, compresión, mejoramiento de imagen | Transformadas 2D, filtros espaciales, estimación de movimiento |
Tabla 1.6. Aplicaciones de los DSP por sector.
DSP frente a otras plataformas
Hoy el procesamiento de señales no es exclusivo de los DSP. Saber cuándo usar uno, y cuándo no, es tan importante como saber programarlo.
| Plataforma | Fortalezas | Limitaciones | Cuándo elegirla |
|---|---|---|---|
| MCU sin extensiones DSP | Bajo costo, fácil de programar | Multiplicación y acumulación lentas | Filtrado ligero a baja fs |
| MCU con extensiones DSP (Arm Cortex-M4/M7/M33/M55, dsPIC33) | Buen equilibrio entre control y cálculo; ecosistema amplio | Menor rendimiento sostenido que un DSP dedicado | Audio embebido, control de motores y potencia, sensores |
| DSP dedicado | Máximo rendimiento por watt en cálculo secuencial; latencia determinista | Herramientas específicas por familia; menor ecosistema | Audio multicanal, telecomunicaciones, instrumentación |
| FPGA | Paralelismo masivo, latencia de pocos ciclos, fs de cientos de MHz | Desarrollo en HDL más complejo; mayor costo | Radar, RF, video, muestreo de muy alta velocidad |
| GPU | Enorme rendimiento en lotes de datos | Latencia alta e impredecible; alto consumo | Procesamiento fuera de línea, IA, imágenes médicas |
| Núcleo DSP licenciable dentro de un SoC | Integrado junto a CPU, NPU y periféricos | Solo accesible para quien diseña o elige el SoC | Teléfonos, audífonos inalámbricos, asistentes de voz |
Tabla 1.7. Plataformas para procesamiento de señales.
Un criterio práctico de selección consiste en responder, en este orden: ¿cuál es la fs y cuántos canales hay?, ¿cuántos MAC por muestra requiere el algoritmo?, ¿cuál es la latencia máxima aceptable?, ¿punto fijo o flotante?, ¿qué periféricos se necesitan?, y finalmente ¿cuál es el presupuesto de costo, consumo y tiempo de desarrollo? Con las tres primeras respuestas se calcula el rendimiento necesario en MMAC/s (millones de MAC por segundo), que es la cifra con la que se comparan las opciones.
Historia y fabricantes
Antes de que existieran los DSP en un solo chip, el procesamiento digital de señales se hacía con computadoras grandes o con tarjetas construidas con procesadores bit-slice y multiplicadores independientes. A finales de los años setenta, la integración a gran escala permitió reunir todo en un circuito integrado.
- 1978–1979, los precursores. AMI presentó el S2811, un periférico de procesamiento de señales para el microprocesador Motorola 6800 que no llegó a producirse en volumen. Intel lanzó el 2920, que integraba ADC y DAC pero carecía de multiplicador en hardware. En Bell Labs se desarrolló el DSP-1 para los sistemas de conmutación telefónica de AT&T.
- 1980, los primeros DSP completos. NEC (µPD7720) y AT&T/Bell Labs (DSP1) presentaron sus procesadores en la International Solid-State Circuits Conference (ISSCC). Ambos nacieron de necesidades de la telefonía.
- 1983, la popularización. Texas Instruments lanzó el TMS32010, con arquitectura Harvard modificada, multiplicador de 16 × 16 bits que operaba en 200 ns y acumulador de 32 bits. Inició la familia TMS320, todavía vigente en sus descendientes.
- Segunda y tercera generación (≈ 1985–1992). Más buses, memoria en chip y, después, punto flotante integrado. Destacan el TMS320C25, la familia Motorola DSP56000 y la Analog Devices ADSP-2100.
- Paralelismo (desde 1997). Las arquitecturas VLIW, como la TMS320C62x, ejecutan varias instrucciones por ciclo en unidades funcionales paralelas.
- Integración (desde los 2000). El DSP deja de ser solo un chip y se convierte también en un núcleo licenciable dentro de SoC para teléfonos y dispositivos de consumo, y en un conjunto de instrucciones dentro de microcontroladores de propósito general.
Fabricantes y familias representativas
| Fabricante | Familias | Enfoque |
|---|---|---|
| Texas Instruments | TMS320C2000 · C5000 · C6000 | Control en tiempo real (motores, potencia); bajo consumo; alto rendimiento multinúcleo |
| Analog Devices | SHARC / SHARC+ · Blackfin · SigmaDSP | Audio de punto flotante; procesamiento embebido; audio configurable gráficamente |
| NXP (antes Motorola y Freescale) | DSP56xxx · MCU i.MX RT con núcleos DSP integrados | Audio y procesamiento embebido |
| Microchip | dsPIC33 (DSC) | Controladores digitales de señal para motores y conversión de potencia |
| Arm (licencia de núcleos) | Cortex-M4/M7/M33 (extensión DSP) · Cortex-M55/M85 (Helium) | Instrucciones DSP y SIMD en microcontroladores de muchos fabricantes (ST, NXP, Renesas, Infineon, etc.) |
| Cadence (Tensilica) · CEVA | Núcleos HiFi, Vision y similares | Núcleos DSP licenciables integrados en SoC de terceros |
| Qualcomm | Hexagon | DSP integrado en los SoC Snapdragon |
| AMD (Xilinx) · Altera | Bloques DSP dentro de FPGA | Multiplicadores-acumuladores dedicados para procesamiento paralelo en FPGA |
Tabla 1.8. Fabricantes y familias representativas. Antes de iniciar un diseño, verifique en el sitio del fabricante el estado del ciclo de vida de cada dispositivo (activo, no recomendado para diseños nuevos u obsoleto).
En la literatura antigua aparecen empresas que hoy tienen otro nombre: la división de semiconductores de Motorola se convirtió en Freescale en 2004, que se fusionó con NXP en 2015; SGS-Thomson adoptó el nombre STMicroelectronics en 1998; la microelectrónica de AT&T pasó a Lucent y después a Agere Systems. Al buscar documentación de un dispositivo antiguo, conviene usar ambos nombres.
Resumen del capítulo
- Un DSP es un procesador optimizado para aplicar operaciones aritméticas repetitivas a un flujo continuo de muestras, con tiempo de ejecución predecible.
- La cadena típica es: filtro anti-aliasing → ADC → DSP → DAC → filtro de reconstrucción. Los extremos analógicos siguen siendo críticos.
- Nyquist: fs > 2fmáx. Las componentes por encima de fs/2 se pliegan en falias = |f − k fs| y no pueden eliminarse después del muestreo. El sobremuestreo simplifica el filtro analógico.
- Cuantización: 1 LSB = VFS/2N; SNRq ≈ 6.02N + 1.76 dB. El desempeño real se expresa con el ENOB.
- Tiempo real: ciclos disponibles = fclk/fs. El procesamiento por bloques reduce la sobrecarga a cambio de latencia.
- La operación MAC es el núcleo del procesamiento de señales. El DSP la ejecuta en un ciclo gracias al multiplicador en hardware, al acumulador con bits de guarda, a la arquitectura Harvard modificada, a las AGU con direccionamiento circular y a los lazos sin sobrecarga.
- Punto fijo (Q15) es eficiente pero exige controlar rangos y desbordamientos; punto flotante simplifica el desarrollo.
- Toda implementación debe verificarse contra un modelo de referencia, idealmente bit a bit.
- El DSP compite y convive con MCU con extensiones DSP, FPGA, GPU y núcleos integrados en SoC; la elección depende de MMAC/s, latencia, aritmética, periféricos y costo.
Ejercicios
Un sistema muestrea a fs = 8 kHz. ¿En qué frecuencia aparecerán tonos de 5 kHz, 9 kHz y 15.5 kHz que lleguen al ADC sin filtrar?
Ver solución
Con falias = |f − k fs|: 5 kHz → |5 − 8| = 3 kHz; 9 kHz → |9 − 8| = 1 kHz; 15.5 kHz → |15.5 − 16| = 0.5 kHz. Las tres caen dentro de la banda de voz y serían indistinguibles de señal real.
Calcule el valor de 1 LSB y la SNR de cuantización ideal de un ADC de 14 bits con rango de 0 a 2.5 V.
Ver solución
1 LSB = 2.5 V / 214 = 2.5 / 16 384 ≈ 152.6 µV. SNRq ≈ 6.02(14) + 1.76 = 86.0 dB.
La hoja de datos de un ADC de 16 bits reporta SINAD = 88 dB. ¿Cuál es su ENOB? ¿Cuántos bits "se pierden" respecto al valor nominal?
Ver solución
ENOB = (88 − 1.76)/6.02 ≈ 14.3 bits. Se pierden ≈ 1.7 bits por ruido y distorsión.
Un DSP de 300 MHz procesa 8 canales a 96 kHz. ¿Cuántos ciclos hay disponibles por muestra de cada canal? Si el algoritmo usa 300 ciclos por muestra y por canal, ¿cuál es la carga de CPU?
Ver solución
Ciclos por periodo de muestreo: 300 MHz / 96 kHz = 3 125. Por canal: 3 125 / 8 ≈ 390 ciclos. Carga = (8 × 300) / 3 125 = 2 400 / 3 125 ≈ 77 %, en el límite superior recomendado.
Un sistema procesa bloques de 256 muestras a 48 kHz con doble buffer. Estime la latencia debida a los buffers. ¿Sería adecuado para un audífono médico, donde se buscan latencias menores a 10 ms?
Ver solución
tbloque = 256/48 000 = 5.33 ms; latencia ≈ 2 × 5.33 = 10.7 ms, más el retardo de los convertidores. No cumple; habría que reducir el bloque (por ejemplo, a 32 muestras: ≈ 1.3 ms).
Represente 0.75 y −0.6 en formato Q15 (decimal y hexadecimal) y calcule su producto en Q15.
Ver solución
0.75 × 32 768 = 24 576 (0x6000). −0.6 × 32 768 = −19 660.8 → −19 661 (0xB333). Producto Q30 = 24 576 × (−19 661) = −483 188 736; con redondeo, (−483 188 736 + 16 384) >> 15 = −14 746 → −14 746/32 768 ≈ −0.45001 (el valor exacto es −0.45; la diferencia se debe a la cuantización de −0.6).
¿Por qué un acumulador de 40 bits permite sumar hasta 256 productos de 16 × 16 bits sin desbordarse?
Ver solución
Cada producto ocupa como máximo 32 bits. Sumar 2g valores de 32 bits puede requerir hasta 32 + g bits. Con 40 bits quedan g = 8 bits de guarda, es decir, 28 = 256 sumas en el peor caso (todas de magnitud máxima con el mismo signo).
Explique con sus palabras qué ventaja aporta el direccionamiento circular en un filtro FIR de 128 coeficientes.
Ver solución
Sin direccionamiento circular habría que desplazar 127 muestras en memoria por cada muestra nueva, o bien comparar y corregir el índice en cada iteración. Con direccionamiento circular, la AGU actualiza el puntero en paralelo con la MAC y el regreso al inicio no cuesta ciclos, de modo que el filtro completo se ejecuta en ≈ 128 ciclos más una sobrecarga fija.
Se requiere un filtro FIR de 512 coeficientes sobre una señal muestreada a 10 MHz, con latencia menor a 1 µs. ¿Qué plataforma recomendaría y por qué?
Ver solución
Se necesitan 512 × 10 M = 5 120 MMAC/s, con latencia de unos cuantos ciclos de muestreo. Un DSP de un solo núcleo con 2 MAC por ciclo necesitaría más de 2.5 GHz. La opción natural es una FPGA, que puede instanciar cientos de multiplicadores en paralelo (o una arquitectura multifase) y cumplir la latencia en hardware.
Diseñe en MATLAB o Python un filtro Butterworth paso bajas de 4.º orden con frecuencia de corte de 1 kHz a fs = 48 kHz. Implemente el código de la sección "Programación y flujo de desarrollo" y verifique que coincide con
filter()(oscipy.signal.lfilter). Después elimine el términonum(5)*w(1)y mida el error.Ver solución
Con
[num,den] = butter(4, 1000/24000)la implementación completa coincide confilter()con un error del orden de 10−15 (precisión numérica). Al eliminar el término, el error se vuelve del orden de 10−2 o mayor, según la señal. Esto ilustra por qué siempre se compara contra una referencia.
Glosario ES / EN
- Acumulador accumulator
- Registro donde se suman los productos sucesivos de una MAC.
- Aliasing aliasing
- Aparición de una frecuencia falsa por muestrear por debajo de Nyquist.
- Bits de guarda guard bits
- Bits extra del acumulador que absorben el crecimiento de las sumas intermedias.
- Buffer circular circular buffer
- Arreglo donde el índice regresa al inicio al llegar al final (aritmética módulo N).
- Carga de CPU CPU load
- Fracción del tiempo disponible que consume el algoritmo.
- Coeficientes coefficients / taps
- Valores h[k], bk y ak que definen la respuesta de un filtro.
- Cuantización quantization
- Asignación de cada muestra a uno de 2N niveles discretos.
- Decimación decimation
- Reducción de la frecuencia de muestreo, precedida de un filtro paso bajas.
- Direccionamiento de bits invertidos bit-reversed addressing
- Modo de direccionamiento que genera el orden de datos requerido por la FFT.
- Filtro anti-aliasing anti-aliasing filter
- Filtro analógico previo al ADC que elimina componentes por encima de fs/2.
- Filtro de reconstrucción reconstruction / anti-imaging filter
- Filtro posterior al DAC que elimina las imágenes espectrales.
- FIR / IIR finite / infinite impulse response
- Filtros sin y con realimentación, respectivamente.
- Frecuencia de Nyquist Nyquist frequency
- Mitad de la frecuencia de muestreo, fs/2.
- Generador de direcciones address generation unit (AGU)
- Hardware que calcula direcciones de memoria en paralelo con la aritmética.
- Latencia latency
- Retardo entre la entrada de una muestra y su efecto en la salida.
- Lazo sin sobrecarga zero-overhead loop
- Repetición controlada por hardware sin ciclos extra por iteración.
- MAC multiply-accumulate
- Operación a ← a + b·c, base del procesamiento de señales.
- Muestreo sampling
- Medición de una señal continua en instantes equiespaciados.
- Número efectivo de bits ENOB
- Resolución real de un convertidor obtenida de su SINAD.
- Punto fijo / flotante fixed-point / floating-point
- Representación numérica con escala implícita fija o con exponente explícito.
- Retenedor de orden cero zero-order hold
- Mantiene la salida del DAC constante durante un periodo de muestreo.
- Saturación saturation
- Limitar un resultado al valor máximo o mínimo representable en lugar de desbordar.
- Sobremuestreo oversampling
- Muestrear muy por encima de 2fmáx para simplificar el filtrado analógico o ganar resolución.
- Tiempo real real time
- Garantía de que cada resultado se produce antes de un plazo fijo.
Bibliografía
Textos básicos
- Lyons, R. G. Understanding Digital Signal Processing, 3.ª ed. Prentice Hall, 2011.
- Smith, S. W. The Scientist and Engineer's Guide to Digital Signal Processing. California Technical Publishing, 1997. Disponible gratuitamente en dspguide.com.
- Proakis, J. G., y Manolakis, D. G. Tratamiento digital de señales, 4.ª ed. Pearson Educación, 2007.
- Oppenheim, A. V., y Schafer, R. W. Discrete-Time Signal Processing, 3.ª ed. Pearson, 2010.
Procesadores y tiempo real
- Kuo, S. M., Lee, B. H., y Tian, W. Real-Time Digital Signal Processing: Fundamentals, Implementations and Applications, 3.ª ed. Wiley, 2013.
- Welch, T. B., Wright, C. H. G., y Morrow, M. G. Real-Time Digital Signal Processing from MATLAB to C with the TMS320C6x DSPs, 3.ª ed. CRC Press, 2017.
- Kester, W. (ed.). Mixed-Signal and DSP Design Techniques. Analog Devices / Newnes, 2003.
- Eyre, J., y Bier, J. "The Evolution of DSP Processors". IEEE Signal Processing Magazine, vol. 17, n.º 2, 2000.
Documentación técnica y recursos en línea
- Arm. CMSIS-DSP Software Library. arm-software.github.io/CMSIS-DSP
- Arm. Introduction to Helium (documento 102102). developer.arm.com
- Texas Instruments. TMS32010 / TMS320C1x Digital Signal Processors, hoja de datos SPRS009. Referencia histórica de la primera familia TMS320.
- Computer History Museum. "1979: Single Chip Digital Signal Processor Introduced". computerhistory.org
- IEEE Spectrum. "Chip Hall of Fame: Texas Instruments TMS32010 Digital Signal Processor". spectrum.ieee.org