Forum: Digitale Signalverarbeitung / DSP / Machine Learning I2S Datenmanipulation, wie?


von Matthias (matthiasm)


Lesenswert?

Guten Abend,

ich frage mich grad wie man I2S Audiodaten verändern und kombinieren 
kann?

Ich habe einen STM32f4 und kann damit ja I2S Daten erzeugen und 
einlesen.

Es handelt sich dabei um 16bit 48kHz Stream. Das bedeutet doch dass ich 
einen 16bit Wertebereich habe um Audiodaten zu erzeugen, korrekt?

Wie werden nun zwei I2S Daten miteinander kombiniert, ähnlich wie in 
einem Operationsverstärker? Kann ich um die Differenz aus zwei Streams 
zu bilden einfach sagen stream1-stream2?

Wie läuft das bei i2s ab?
Danke, Gruß
Matthias

: Verschoben durch Admin
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Matthias Machmal schrieb:
> Das bedeutet doch dass ich
> einen 16bit Wertebereich habe um Audiodaten zu erzeugen, korrekt?

Nö, der I2S Bus ist nicht zur Erzeugung, sondern zur Übertragung 
digitaler Audiosignale gedacht.

Matthias Machmal schrieb:
> Wie werden nun zwei I2S Daten miteinander kombiniert, ähnlich wie in
> einem Operationsverstärker? Kann ich um die Differenz aus zwei Streams
> zu bilden einfach sagen stream1-stream2?

Auch nein. I2S ist eine Busspezifikation wie SPI, I²C oder ISP. I2S 
ähnelt SPI und ist um ein Wordselect Signal erweitert, das 
typischerweise für die Unterscheidung von Daten des linken und des 
rechten Kanals genutzt wird.

Um 2 I2S Signale zu mischen, nutzt du entweder 2 I2S Eingänge an einem 
DSP/MC und summierst und skalierst die Daten oder wandelst sie mittels 
DA Wandlern um und mischst sie dann mit einem Analogmischer (Summierer). 
Die Differenz zwischen zwei Signalen geschieht genauso - eine einfache 
Übung für jeden DSP.

Mehr Informationen gibts in der Busbeschreibung der Firma Philips:
https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdf

von Matthias (matthiasm)


Lesenswert?

Matthias Sch. schrieb:
> Matthias Machmal schrieb:
>> Das bedeutet doch dass ich
>> einen 16bit Wertebereich habe um Audiodaten zu erzeugen, korrekt?
>
> Nö, der I2S Bus ist nicht zur Erzeugung, sondern zur Übertragung
> digitaler Audiosignale gedacht.

Na aber wenn ich in meinem STM32 µC einen 16bit Wert an die I2s 
Schnittstelle schicke dann wird doch ein bestimmter Ton erzeugt, oder 
irre ich?


> Matthias Machmal schrieb:
>> Wie werden nun zwei I2S Daten miteinander kombiniert, ähnlich wie in
>> einem Operationsverstärker? Kann ich um die Differenz aus zwei Streams
>> zu bilden einfach sagen stream1-stream2?
>
> Auch nein. I2S ist eine Busspezifikation wie SPI, I²C oder ISP. I2S
> ähnelt SPI und ist um ein Wordselect Signal erweitert, das
> typischerweise für die Unterscheidung von Daten des linken und des
> rechten Kanals genutzt wird.
>

Das ist mir klar.

> Um 2 I2S Signale zu mischen, nutzt du entweder 2 I2S Eingänge an einem
> DSP/MC und summierst und skalierst die Daten oder wandelst sie mittels
> DA Wandlern um und mischst sie dann mit einem Analogmischer (Summierer).
> Die Differenz zwischen zwei Signalen geschieht genauso - eine einfache
> Übung für jeden DSP.

Ok, aber wie wird digital summiert oder differenziert? Nehme ich die 
zwei Werte der Schnittstellen und addiere bzw. subtrahiere ich die von 
einander?

> Mehr Informationen gibts in der Busbeschreibung der Firma Philips:
> https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdf

Wird ich mir durchlesen.

Danke schonmal.

von Marco (Gast)


Lesenswert?

Matthias Machmal schrieb:
> Matthias Sch. schrieb:
>> Matthias Machmal schrieb:
>>> Das bedeutet doch dass ich
>>> einen 16bit Wertebereich habe um Audiodaten zu erzeugen, korrekt?
>>
>> Nö, der I2S Bus ist nicht zur Erzeugung, sondern zur Übertragung
>> digitaler Audiosignale gedacht.
>
> Na aber wenn ich in meinem STM32 µC einen 16bit Wert an die I2s
> Schnittstelle schicke dann wird doch ein bestimmter Ton erzeugt, oder
> irre ich?

Der Ton wird erzeugt weil der DAC I2S versteht und dir daraus ein 
analoges Signal erzeugt welches ein Lautsprecher hörbar macht. Dieser 
DAC versteht halt zufällig I2S. Es gibt aber auch DACs die I2C, SPI, CAN 
oder was weiß Gott sonst was versteht. Man muss auch keine Audiodaten 
über I2S übertragen. Kannst auch dein Auto von CAN zu I2S umbauen wenn 
du dadrauf stehtst.

Matthias Machmal schrieb:
>> Um 2 I2S Signale zu mischen, nutzt du entweder 2 I2S Eingänge an einem
>> DSP/MC und summierst und skalierst die Daten oder wandelst sie mittels
>> DA Wandlern um und mischst sie dann mit einem Analogmischer (Summierer).
>> Die Differenz zwischen zwei Signalen geschieht genauso - eine einfache
>> Übung für jeden DSP.
>
> Ok, aber wie wird digital summiert oder differenziert? Nehme ich die
> zwei Werte der Schnittstellen und addiere bzw. subtrahiere ich die von
> einander?

Das digitale Summieren ist eine einfach Operation die jeder 
Mikrocontroller oder DSP beherrscht.

z.B.
Kanal1 = 126
Kanal2 = 68
Kanal1 + Kanal2 = 126 + 68 = 194

Die 194 werden dann im DAC in ein analoges Signal gewandelt und ergeben 
dann am Lautsprecher in Sequenz mit folgenden Werten die Musik.

von Matthias (matthiasm)


Lesenswert?

Marco schrieb:
> Der Ton wird erzeugt weil der DAC I2S versteht und dir daraus ein
> analoges Signal erzeugt welches ein Lautsprecher hörbar macht. Dieser
> DAC versteht halt zufällig I2S. Es gibt aber auch DACs die I2C, SPI, CAN
> oder was weiß Gott sonst was versteht. Man muss auch keine Audiodaten
> über I2S übertragen. Kannst auch dein Auto von CAN zu I2S umbauen wenn
> du dadrauf stehtst.

Das ist mir klar. Mir ging es eigentlich eher darum:

Das digitale Summieren ist eine einfach Operation die jeder
Mikrocontroller oder DSP beherrscht.

z.B.
Kanal1 = 126
Kanal2 = 68
Kanal1 + Kanal2 = 126 + 68 = 194

Angenommen ich möchte ein Signal welches über I2S reinkommt "halbieren", 
also in der Amplitude um die hälfte leiser machen dann könnte ich jedes 
Frame nehmen und durch 2 teilen? Dieses Signal dann über I2S wieder 
ausgeben (ja zu einem ADC)?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Matthias Machmal schrieb:
> Angenommen ich möchte ein Signal welches über I2S reinkommt "halbieren",
> also in der Amplitude um die hälfte leiser machen dann könnte ich jedes
> Frame nehmen und durch 2 teilen? Dieses Signal dann über I2S wieder
> ausgeben (ja zu einem ADC)?

Ja, so läuft das, allerdings wird die Ausgabe ein DAC sein und kein ADC. 
Signalprozessoren tun den ganzen Tag nichts anderes, als mit Audiodaten 
herumzurechnen, haben allerdings oft bestimmte Vorkehrungen, um z.B. bei 
Überläufen nicht in falsche Wertebereiche umzuschlagen ( z.B. ein 
'graceful' Overflow).
Ein digitaler Mischer addiert 2 solche Samples und schickt sie dann 
wieder raus. Oft haben DSPs auch einen sehr viel grösseren Wertebereich 
als die Daten, die sie verarbeiten, damit bei dem vielen hin- und 
herrechnen nichts beschnitten wird und der Werteumfang erhalten bleibt.
Ein Beispiel: der TAS3108, der in meinem Bassamp läuft, bekommt 20-bit 
Daten vom AD Wandler und besitzt einen internen 48-bit Datenbus mit 
entsprechendem Rechenwerk.

: Bearbeitet durch User
von jemand (Gast)


Lesenswert?

Matthias Machmal schrieb:
> Na aber wenn ich in meinem STM32 µC einen 16bit Wert an die I2s
> Schnittstelle schicke dann wird doch ein bestimmter Ton erzeugt, oder
> irre ich?

Nein, ein Wert ergibt nicht ein Ton sondern nur ein Sample und viele 
Samples ergeben einen Ton.

von Matthias (matthiasm)


Lesenswert?

Wie läuft das denn dann genau mit den Samples ab? Ich habe z.B. eine 
Abtastrate von 192kHz bei einer framesize von 128.

Das entspricht doch 128 bit je Abtastung, oder? Ingesamt 24.576Mhz.

Sind dann die 128bit das Sample? Das wären 8 x 16bit Variablen.

Wird dann das gesamte Sample zwischengespeichert und mit einem anderen 
Sample verglichen oder geht das Byte für Byte?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Matthias Machmal schrieb:
> Wird dann das gesamte Sample zwischengespeichert und mit einem anderen
> Sample verglichen oder geht das Byte für Byte?

Ein 'Sample' ist, wie das Wort sagt, nur eine 'Stichprobe', also ein 
einziger Zahlenwert. Erst viele Samples aneinandergereiht ergeben z.B. 
Audio. Bei einem 48kHz/16 bit Datenstrom sind also pro Sekunde 48000 
Samples mit einer Bittiefe von 16 bit hintereinander gereiht und ergeben 
1 Sekunde Musik. Fütterst du also diese 48000 Samples innerhalb einer 
Sekunde in einen 16 bit DA Wandler, erscheint am Ausgang wieder deine 
Musik.

Verglichen werden die Samples nicht, es sei denn, du möchtest damit 
weiterrechnen, z.B. mit einem Kompressor oder Limiter. Bei einem Limiter 
z.B. wird das Sample mit einem festen begrenzenden Wert verglichen und 
wenn das Sample diesen Wert überschreitet, wird es mit einem Wert < 1 
multipliziert, um es klein zu kriegen. (Simpel gesprochen, auch hier 
sind Ansprechzeiten usw. wichtig, Limiter haben normalerweise eine 
Attack und Decay Zeit, damit sie nicht zu abrupt regeln).

von Matthias (matthiasm)


Lesenswert?

Vielen Dank für die ausführliche Antwort.

Ich werde mir mal eine Testumgebung aufbauen und ein wenig 
herumexperimentieren.

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.