Arduino GIGA R1 WiFi | Audio Loopback Beispiel-Code

Diese Artikel zeigt ein einfaches Codebeispiel für den Arduino GIGA R1 WiFi für Audio DSP-Experimente. Der gezeigte Sketch nutzt die Advanced Analog-Bibliothek um ein Audio-Signal von einem ADC Eingang zu einem DAC-Ausgang durchzuschleifen.

General Overview

Der neue Arduino GIGA R1 WiFi bietet sich als flexible Plattform für Audio-DSP-Experimente förmlich an. Elektor hat mir freundlicherweise ein Rezessionsexemplar zur Verfügung gestellt [1]. Mit 12 16-Bit ADC-Kanälen, zwei 12-Bit DAC-Kanälen und Unmengen an Speicher bietet der Giga ausreichend Resourcen für Experimente in der interessanten Welt der digitalen Signalverarbeitung. Der offensichtliche Startpunkt ist ein sogenannter loopback / passthru Test. Hierbei wird ein am ADC angelegtes Audio-Signal direkt auf einen DAC-Kanal unverändert wieder ausgegeben. Da ich bei meiner Recherche keine Codebeispiele im Netz gefunden habe, habe ich mit Hilfe der Advanced Analog Bibliothek einen eigenen Beispielsketch geschrieben.

Arduino GIGA R1 WiFi wird auf seine Eignung als DSP-Plattform getestet.

Arduino GIGA R1 WiFi wird auf seine Eignung als DSP-Plattform getestet

Arduino Sketch

/*
 * Arduino Giga R1 WiFi - Audio Loopback Example
 *
 * Copyright (C) 2022 Westerhold, S. (AI5GW) 
 * ORCID: https://orcid.org/0000-0001-7965-3140
 * Web (EN): https://baltic-lab.com
 * Web (DE): https://baltic-labor.de
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 */

#include <Arduino_AdvancedAnalog.h>

// Initializierung von ADC 0 (Pin A0) and DAC 0 (Pin A12)
AdvancedADC ADC0(A0);
AdvancedDAC DAC0(A12);

void setup() {
  Serial.begin(9600);

  // ADC0 starten, im Fehlerfall Programm stoppen
  // Auflösung, Abtastrate, Anzahl der Samples pro Kanal, queue depth.
  if (!ADC0.begin(AN_RESOLUTION_12, 44100, 128, 128)) {
    Serial.println("ADC fail...");
    while (1);
  }

  // DAC0, starten, im Fehlerfall Programm stoppen
  // Resolution, sample rate, number of samples per channel, queue depth.
  if (!DAC0.begin(AN_RESOLUTION_12, 44100, 128, 128)) {
    Serial.println("Failed to initialize DAC 1");
    while (1);
  }
}

void loop() {

  if (ADC0.available()) {
    // Get handle for the input buffer
    SampleBuffer inBuf = ADC0.read();
    // Get handle for the output buffer
    SampleBuffer outBuf = DAC0.dequeue();

    for (int i = 0; i < inBuf.size(); i++) {
      // Copy contents of input buffer to the output buffer
      outBuf.data()[i] = inBuf[i];
    }

    // Write contents of the output buffer to the DAC
    DAC0.write(outBuf);

    // Release the input buffer 
    inBuf.release();
  }
}

Testergebnisse

After compiling the code and flashing the Arduino GIGA R1 WiFi, a signal generator was connected to the A0 input pin. The DAC0 output pin was monitored using an oscilloscope. The first test was performed by applying a 800 Hz sine wave signal with an amplitude of 1 Vpp and an offset-voltage of 500 mV. The offset voltage is necessary because the DACs of the Arduino Giga R1 WiFi are not capable of generating negative voltages.

Der Beispielcode wird kompiliert und auf den Arduino Giga R1 WiFi geschrieben. Ein Signalgenerator wird mit dem A0-Eingangspin verbunden. Der DAC0-Ausgang wird mit dem Oszilloskop beobachtet. Für einen ersten Test wird ein 800 Hz Sinussignal mit einer Amplitude von 1 Vpp und einer Offset-Spannung von 500 mV an den Audio-Eingang gelegt. Die Offset-Spannung ist notwendig, da die ADCs des Arduino Giga R1 WiFi nicht in der Lage sind negative Spannungen zu quantisieren. Daher ist die 3,5mm Klinkenbuchse meiner Meinung nach auch ziemlich sinnbefreit.

800 Hz Sinussignal am Eingang des ADC (unten), Ausgang vom DAC0 (oben)

800 Hz Sinussignal am Eingang des ADC (unten), Ausgang vom DAC0 (oben)

Etwas näher herangezoomt zeigen sich die einzelnen Quantisierungsstufen des DAC. Für hochqualitative Audioanwendungen sollte das Signal selbstverständlich gefiltert werden. Es soll angemerkt werden, dass hier die Standardkonfiguration des DAC verwendet wurde und keine Rücksicht auf mögliche Optimierungen der Parameter genommen wurde.

Nahaufnahme des 800 Hz Sinussignales aus dem vorherigen Experiment

Nahaufnahme des 800 Hz Sinussignales aus dem vorherigen Experiment

Als nächstes wird der Versuch mit einem 1 kHz Rechtecksignal wiederholt. Die Amplitude und Offset-Spannung bleiben unverändert.

Test mit einem 1 kHz Rechtecksignal. Eingangssignal (unten) und Ausgangssignal (oben). width=

Test mit einem 1 kHz Rechtecksignal. Eingangssignal (unten) und Ausgangssignal (oben)

Zuletzt wurde der Versuch mit einem symmetrischen Rampensignal bei einer Frequenz von 1 kHz, einer Amplitude von 1 1 Vpp und einer Offset-Spannung von 500 mV wiederholt. Auch hier folgt der Ausgang dem Eingangssignal wie erwartet.

Test mit 1 kHz Rampensignal. Eingang (unten), Ausgang (oben)

Test mit 1 kHz Rampensignal. Eingang (unten), Ausgang (oben)

Fazit

Der gezeigte Sketch bietet einen guten Startpunkt für eigene Audio DSP-Experimente mit dem neuen Arduino Giga R1 WiFi. Anstatt den Eingangspuffer einfach in den Ausgangspuffer zu kopieren, ist es sehr leicht hier eigene DSP-Funktionen einzubauen, beispielsweise Filter oder Mischer. In einem weiteren Versuch soll die Implementierung eines ± 45 ° FIR-Filters als Hilbert-Transformator für die DSP-gestützte SSB-Modulation getestet werden.

Links und Quellen:

[1] Arduino Giga R1 WiFi, Elektorstore: https://www.elektor.com/arduino-giga-r1-wifi

Bitte zitieren als:
S. Westerhold: Arduino GIGA R1 WiFi | Audio Loopback Beispiel-Code (2023), in: Baltic Labor Blog für Hochfrequenz- und Messtechnik, ISSN (Online): 2751-806X, URL: https://baltic-labor.de/2023/07/arduino-giga-r1-wifi-audio-loopback-beispiel-code/ (Stand: 27.04.2024).

2 thoughts on “Arduino GIGA R1 WiFi | Audio Loopback Beispiel-Code

    • Hallo Bernhard, sehr gerne. Als Hinweis: Auf meinem englischsprachigen Kanal gibt es bereits Beispiele für DSP-Effekte, wie Verzerrung und Tremolo. Bin nur leider bisher nicht dazu gekommen das Ganze zu übersetzen. Die Artikel mit Sketch und YouTube-Videos habe ich hier in der Antwort verlinkt.

Leave a comment

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert