Forum: Mikrocontroller und Digitale Elektronik ESP8266Audiolib: Knacken zu Beginn und am Ende eines Streams


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich befasse mich gerade mit dem Beispiel "streaming MP3 from HTTP" und 
der I2C-DAC-Emulation(Wemos D1 in der Arduino IDE), was im Prinzip auch 
funktioniert.

Leider ertönen immer zu Beginn eines Streams zwei und am Ende ein lauter 
Knackton. Das sind keine Übertragungsstörungen, der eigentliche Sound 
ist - im Rahmen des Möglichen - rel. sauber.

Das Soundfile wird jeweils über 3s ein- und ausgeblendet. Das Knacken 
muss mit der Initialisierung des RX-Pin als Ausgabepin zusammenhängen. 
Hat hier jemand so viel Durchblick um eine Idee zu äußern, wie man auch 
dei PWM soft ein- und ausblenden könnte?

Die Funktion out->SetGain(x) zum Einstellen der Lautstärke funktioniert 
zwar, hat aber nur Einfluss auf den Stream, nicht auf die Knackser.

Danke für Tips.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

ich habe mich damit nicht befasst, bei mir hängt ein I2S-DAC dran.

Wenn beim Streamstart die PWM gestartet wird geht der Pegelvon 0 auf den 
Mittelwert des Audiosignals, das wird knacken, beim Stop genauso.
Es dürfte zumindest etwas Aufwand machen, beim Start der Ausgabe die PWM 
von nahe 0% (oder 100% falls es von H-Pehel am Pin ausgeht) auf den 
mittleren Ausgabepegel des Soundanfangs zu fahren oder zumindest auf 
50%.
Beim Abschalten passiert es ähnlich, da müßte man also auch zaubern.

Mit einem I2S-DAC passiert das prinzipiell nicht, der will ein passendes 
Frame damit hinten was rauskommt.

Gruß aus Berlin
Michael

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Michael U. schrieb:
> Hallo,
>
> ich habe mich damit nicht befasst, bei mir hängt ein I2S-DAC dran.
>
> Wenn beim Streamstart die PWM gestartet wird geht der Pegelvon 0 auf den
> Mittelwert des Audiosignals, das wird knacken, beim Stop genauso.
> Es dürfte zumindest etwas Aufwand machen, beim Start der Ausgabe die PWM
> von nahe 0% (oder 100% falls es von H-Pehel am Pin ausgeht) auf den
> mittleren Ausgabepegel des Soundanfangs zu fahren oder zumindest auf
> 50%.
> Beim Abschalten passiert es ähnlich, da müßte man also auch zaubern.
>
> Mit einem I2S-DAC passiert das prinzipiell nicht, der will ein passendes
> Frame damit hinten was rauskommt.

Die Ursache denke ich mir auch so. Im Prinzip kann es aber kein so 
großes Problem sein, beim Initialisieren der PWM in einem Loop von z.B. 
200ms "soft" auf 50%& zu fahren.

Ich habe mir mal Debug-ausgaben mit jeweils einer Wartezeit von 2s in 
den Code eingesetzt. Ich weiss nun, dass es jeweils an den markierten 
Stellen knackt (s. Code).

Leider ist das Lib-Bundle ziemlich umfangreich und ich weiss nicht so 
recht, wo anfangen.
1
#include <Arduino.h>
2
#include <ESP8266WiFi.h>
3
#include "AudioFileSourceICYStream.h"
4
#include "AudioFileSourceBuffer.h"
5
#include "AudioGeneratorMP3.h"
6
#include "AudioOutputI2SNoDAC.h"
7
8
const char *SSID =      "WNK-DIGITAL";
9
const char *PASSWORD =  "1248-WNK-1632";
10
const char *URL=        "http://192.168.200.8/mtest/audio.mp3";
11
12
AudioGeneratorMP3 *mp3;
13
AudioFileSourceICYStream *file;
14
AudioFileSourceBuffer *buff;
15
AudioOutputI2SNoDAC *out;
16
17
void setup()
18
{
19
  WiFi.disconnect();
20
  WiFi.softAPdisconnect(true);
21
  WiFi.mode(WIFI_STA);
22
  WiFi.begin(SSID, PASSWORD);
23
24
  while (WiFi.status() != WL_CONNECTED) {blinx(50);}
25
26
  file = new AudioFileSourceICYStream(URL);
27
  buff = new AudioFileSourceBuffer(file, 8192);
28
29
  out = new AudioOutputI2SNoDAC(); //<----------------- erster Knacks
30
31
  mp3 = new AudioGeneratorMP3();
32
  mp3->begin(buff, out);           //<----------------- zweiter Knacks
33
  out->SetGain(3);
34
}
35
36
void loop()
37
{  
38
  if (mp3->isRunning())
39
  {
40
    if (!mp3->loop()){mp3->stop();} //<--------------- dritter Knacks
41
  }
42
  else{blinx(1000);}
43
}
44
45
void blinx(int t)
46
{
47
  pinMode(LED_BUILTIN, OUTPUT);
48
  digitalWrite(LED_BUILTIN, LOW); delay(t);
49
  digitalWrite(LED_BUILTIN, HIGH); delay(t);  
50
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.