3.3 Ejemplos de uso de DDS. Ejercicios

3.3.1 Arquitectura software:

La figura 3-7 muestra el esquema de la arquitectura software que utilizaremos. Se parte del diseño realizado en la práctica 2 y se añade como nueva funcionalidad la generación de señal.

La función lab3n() se encarga de calcular los valores de amplitud de las señales y enviarlas al codec vía I2S.

fig4

Figura 3-7. Arquitectura software.

El microprocesador debe ejecutar 5 tareas (t₁→t₅), cada una asociada a una condición de inicio (trig₁→trig₃). Las condiciones de inicio se evalúan de forma cíclica y, si se cumplen, se ejecuta la tarea correspondiente. Cada tarea tiene un periodo de ejecución; si el periodo mínimo es mayor que la suma de los tiempos de todas las tareas, la aplicación funcionará correctamente.

La función lab3n() debe ejecutarse cuando el buffer de transmisión del periférico I2S tiene posiciones disponibles. Cuando esto sucede, la función I2S_isTxBufferFree() devuelve true:

// En el ejecutivo cíclico:
// Si hay posiciones libres en el buffer de transmisión, se ejecuta lab3n()
if (I2S_isTxBufferFree())
{
    lab3n();
}
...

En el archivo de recursos se incluye una plantilla de la función lab3n() en src/ejercicios.c:

void lab3n(void)
{
    // Canales de salida del codec
    int16_t chL, chR;

    // Cálculo de los valores de amplitud de las dos señales
    //   >>> Incluir aquí el código <<<

    // Pasa datos al codec
    FM4_WM8731_wr(chL, chR);
}

3.3.2 Ejercicio1: Señales en cuadratura:

El propósito de este ejercicio es generar dos señales senoidales de 1 kHz en cuadratura: segnal_i y segnal_q`. La señal segnal_i corresponde al componente en fase (coseno), asignado al canal izquierdo del códec, mientras que segnal_q representa el componente en cuadratura (seno), dirigido al canal derecho. Ambas señales se obtienen mediante síntesis digital directa (DDS).

Ejercicio1: Señales en cuadratura:
  1. Configuración del proyecto.

    • Copia a shared/include y shared/src los archivos pulsaciones.h y pulsaciones.c del proyecto lab2.

    • Abre el proyecto lab3.

    • Selecciona el target lab3.

    • Estudia el código incluido en src/main.c y modifícalo para que utilice la función lab31().

  2. Tareas a realizar.

    • Escribe el código de la función lab31() en el archivo src/ejercicios.c.

    • La función debe generar dos señales senoidales de 1 kHz en cuadratura utilizando la clase DDS16Bits.

  3. Test y Resultados esperados.

    • Utiliza el osciloscopio para verificar que las señales generadas en los canales izquierdo y derecho del códec están en cuadratura (90° de desfase) y tienen una frecuencia de 1 kHz.

      fig29
    • Ponlo en modo XY para observar la trayectoria circular característica de las señales en cuadratura.

      fig29

3.3.3 Ejercicio2: Síntesis FM para Efecto de Sirena:

Fundamento teórico:

En este ejercicio, implementaremos un efecto de sonido clásico: una sirena. Para ello, utilizaremos una técnica anzada conocida como Síntesis por Modulación de Frecuencia (FM).

El objetivo de la síntesis FM es crear timbres complejos y dinámicos. En lugar de generar un tono estático, usaremos dos generadores DDS que trabajan juntos:

  1. Señal Portadora: Es un generador DDS que produce la señal audible que finalmente escucharemos. Su frecuencia base determina el tono central de la sirena.

  2. Señal Moduladora: Es un segundo generador DDS que funciona como un Oscilador de Baja Frecuencia (LFO). Su salida no se escucha directamente. En su lugar, se utiliza para alterar o «modular» la frecuencia de la portadora en tiempo real.

El parámetro clave que controla este efecto es la profundidad (depth) de la modulación. Este valor actúa como un factor de escala que determina la intensidad del cambio de frecuencia:

  • Una profundidad pequeña produce un cambio de frecuencia sutil, resultando en un efecto de vibrato.

  • Una profundidad grande produce un cambio de frecuencia drástico y amplio, creando el característico barrido de frecuencia de una sirena.

Cálculos:

  • Parámetros del sistema:

    • Frecuencia de muestreo: Fs = 48 kHz

    • Anchura del Acumulador de fase: N = 16 bits

    • Codificación de la amplitud: M = 16 bits

  • Objetivo Sonoro y la Frecuencia de la Portadora:

    Para un sonido de sirena reconocible, se necesita un barrido de frecuencia amplio, por ejemplo, de ±500 Hz, la frecuencia de la portadora debe ser mayor que la desviación.

    • Frecuencia Portadora (f_c): Elegimos una frecuencia base de ~600 Hz.

    • Frecuencia de la Señal Moduladora (f_m): Seleccionamos una frecuencia baja de 5 Hz para la moduladora, lo que permite un barrido lento y perceptible.

    • Rango del Sonido: La sirena barrerá entre 100 Hz (600 - 500) y 1100 Hz (600 + 500).

    • Cálculo del Incremento de Fase de la Portadora:

    El valor del incremento de fase se modifica en cada muestra, se calcula utilizando la expresión:

    \[inc\_fase\_portadora = \frac{f_c \cdot 2^N}{F_s} + salida\_moduladora \cdot depth\]

    La salida de la señal moduladora varía entre -32767 y +32767 (rango de 16 bits con signo), para que la frecuencia de la portadora varíe hasta ±500 Hz, se calcula el factor de profundidad (depth) como:

    \[depth = \frac{500 \cdot 2^N}{F_s \cdot 2^{15}} = 0.0208 \approx \frac{85}{2^{12}}\]
Ejercicio2: Síntesis FM para Efecto de Sirena
  1. Configuración del proyecto.

    • Selecciona el target lab3.

    • Estudia el código incluido en src/main.c y modifícalo para que utilice la función lab32().

  2. Tareas a realizar.

    • Escribe el código de la función lab32() en el archivo src/ejercicios.c.

    • La función debe generar el sonido de una sirena por canal izquierdo, y el canal derecho debe permanecer en silencio (valor 0).

  3. Test y Resultados esperados.

    • Utiliza el osciloscopio para verificar las señales generadas:
      • Canal izquierdo: Señal de audio con barrido de frecuencia (efecto sirena).

        fig29
      • Canal derecho: Señal en 0 V (silencio).

    • Utiliza unos auriculares para escuchar el efecto de sirena.

Ejercicio 3: Exploración personal
  • Utiliza el pulsador para activar o desactivar el efecto de sirena.

    • Una pulsación larga activa/desactiva la sirena.

  • Ejercicios opcionales:

    1. Utiliza el contador para seleccionar la frecuencia de la portadora.

      • 0: sirena desactivada (silencio)

      • 1: 600 Hz

      • 2: 700 Hz

      • 3: 800 Hz

      • 4: 900 Hz

      • 5: 1000 Hz

      • 6: 1100 Hz

      • 7: 1200 Hz

    2. Sintetizador musical:

    La señal generada corresponde con una nota musical en función del valor del contador:

    • 0: silencio

    • 1: do (523.25 Hz)

    • 2: re (587.33 Hz)

    • 3: mi (659.26 Hz)

    • 4: fa (698.46 Hz)

    • 5: sol (783.99 Hz)

    • 6: la (880.00 Hz)

    • 7: si (987.77 Hz)

fig1