Bit Multiplexing, integer vs float
Verfasst: 4. Januar 2012, 00:36
Hallo ihr lieben Leute,
eigentlich wollte ich hier eine Frage zum Bit Multiplexing stellen, aber beim vielen rumprobieren hat sich (leider) eine Erkenntnis eingeschlichen
Diese möächte ich hier gerne teilen, und vielleicht habe ich ja dann doch noch eine Frage
Ich fang mal so an:
Aufgabenstellung:
Bit-multiplexe 5 Event-Leitungen in einer Audio Core Zelle auf eine Leitung, um diese dann mittels GLists AudioCoreEventOutput nach draußen, also nach Primary zu führen.
Wozu das ganze? Ich bin ja (ehr-)geizig und will CPU sparen. GLists Lösung bedarf 3 Ports an der Audio Core Cell und zwei AtoE anstelle von den jetzigen 5 Ports + 5 AtoEs. Eigentlich sind es sogar 7 Ports, da für eine Eventleitung der AudioCoreEventOutput unabdinglich ist (Events mit ausschließlich Wert 0 und das auch noch zeitkritisch). Außerdem sollen die Werte sowieso idealerweise sofort, also im "jetzigen" Sampletick in Primary zur Verfügung stehen.
Idee:
man nehme die 32 zur Verfügung stehenden Bits einer Zahl und schütte da die einzelnen EventWerte rein, die in meinem Fall meißt nur 1 bit (0/1)oder auch mal 8bit (0-255) benötigen. Zusammen mit den 5 Flag Bits, die dem Demuxer mitteilen, ob ein Event für den entsprechenden Ausgang anliegt oder nicht, paßt auf jeden Fall alles in 32bit rein.
OK, soweit so gut, Multiplexer und Demultiplexer funktionieren, aber jetzt kommts:
1) bit 32 gehört bei integer nicht mehr zum Wert, sondern stellt das Vorzeichen dar --> nur noch 31bit zur Verfügung (bit 0-30)
2) verläßt meine schöne gemuxte Zahl die AudioCoreCell wird sie nach FLOAT gewandelt.
zurück nach Integer im Demuxer sind Bitwerte im unteren Bereich (0-8 oder so) futsch, sobald im Muxer Bits oberhalb des 23ten Bits auf 1 gesetzt werden.
schwer zu erklären, deshalb ist ein Beispiel Ensemble angehängt.
http://de.wikipedia.org/wiki/Gleitkomma erklärt mir, daß bei float das oberste bit (31) also für das Vorzeichen zuständig ist. Dann kommen 8bit Exponent und die restlichen 23bit sind Mantisse.
Bei der Umwandlung von Integer nach Float findet ein Verlust der Genauigkeit zugunsten von großen Zahlen statt. Wieder zurück nach Integer fehlen dann also bitwerte im unteren Bereich.
Fazit:
Ein Bitmuxer / Demuxer innerhalb Core kann 31bit eines Wertes verwenden.
Ein Bitmuxer / Demuxer von Core nach Primary funktioniert mit nur 23 genutzten bits
Für meine konkrete Anwendung nutzt das jetzt nicht mehr allzu viel. Muß dann wohl doch es so lassen wie es ist, oder 2 AudioCoreEventOuts verwenden (mit BitMux). Geil wäre natürlich wenn Primary auch Integer könnte, oder es möglich wäre irgendwie eine Integerleitung durch Primary hindurchzutunneln.
Eine andere Variante wäre natürlich, die 5 Eventleitungen ganz "normal" zu muxen (mit Puffer), und über einen AudioCoreEventOut rauszuschicken. Funktioniert aber für mich nicht, da ein zeitliches Delay von mindestens einem Sampletick nicht vertretbar ist (1.Tick: idx, 2.Tick: value)!
Wie macht ihr das denn eigentlich so? Wie führt ihr eure lieben Events aus der AudioCell raus?
ciao
eigentlich wollte ich hier eine Frage zum Bit Multiplexing stellen, aber beim vielen rumprobieren hat sich (leider) eine Erkenntnis eingeschlichen
Diese möächte ich hier gerne teilen, und vielleicht habe ich ja dann doch noch eine Frage
Ich fang mal so an:
Aufgabenstellung:
Bit-multiplexe 5 Event-Leitungen in einer Audio Core Zelle auf eine Leitung, um diese dann mittels GLists AudioCoreEventOutput nach draußen, also nach Primary zu führen.
Wozu das ganze? Ich bin ja (ehr-)geizig und will CPU sparen. GLists Lösung bedarf 3 Ports an der Audio Core Cell und zwei AtoE anstelle von den jetzigen 5 Ports + 5 AtoEs. Eigentlich sind es sogar 7 Ports, da für eine Eventleitung der AudioCoreEventOutput unabdinglich ist (Events mit ausschließlich Wert 0 und das auch noch zeitkritisch). Außerdem sollen die Werte sowieso idealerweise sofort, also im "jetzigen" Sampletick in Primary zur Verfügung stehen.
Idee:
man nehme die 32 zur Verfügung stehenden Bits einer Zahl und schütte da die einzelnen EventWerte rein, die in meinem Fall meißt nur 1 bit (0/1)oder auch mal 8bit (0-255) benötigen. Zusammen mit den 5 Flag Bits, die dem Demuxer mitteilen, ob ein Event für den entsprechenden Ausgang anliegt oder nicht, paßt auf jeden Fall alles in 32bit rein.
OK, soweit so gut, Multiplexer und Demultiplexer funktionieren, aber jetzt kommts:
1) bit 32 gehört bei integer nicht mehr zum Wert, sondern stellt das Vorzeichen dar --> nur noch 31bit zur Verfügung (bit 0-30)
2) verläßt meine schöne gemuxte Zahl die AudioCoreCell wird sie nach FLOAT gewandelt.
zurück nach Integer im Demuxer sind Bitwerte im unteren Bereich (0-8 oder so) futsch, sobald im Muxer Bits oberhalb des 23ten Bits auf 1 gesetzt werden.
schwer zu erklären, deshalb ist ein Beispiel Ensemble angehängt.
http://de.wikipedia.org/wiki/Gleitkomma erklärt mir, daß bei float das oberste bit (31) also für das Vorzeichen zuständig ist. Dann kommen 8bit Exponent und die restlichen 23bit sind Mantisse.
Bei der Umwandlung von Integer nach Float findet ein Verlust der Genauigkeit zugunsten von großen Zahlen statt. Wieder zurück nach Integer fehlen dann also bitwerte im unteren Bereich.
Fazit:
Ein Bitmuxer / Demuxer innerhalb Core kann 31bit eines Wertes verwenden.
Ein Bitmuxer / Demuxer von Core nach Primary funktioniert mit nur 23 genutzten bits
Für meine konkrete Anwendung nutzt das jetzt nicht mehr allzu viel. Muß dann wohl doch es so lassen wie es ist, oder 2 AudioCoreEventOuts verwenden (mit BitMux). Geil wäre natürlich wenn Primary auch Integer könnte, oder es möglich wäre irgendwie eine Integerleitung durch Primary hindurchzutunneln.
Eine andere Variante wäre natürlich, die 5 Eventleitungen ganz "normal" zu muxen (mit Puffer), und über einen AudioCoreEventOut rauszuschicken. Funktioniert aber für mich nicht, da ein zeitliches Delay von mindestens einem Sampletick nicht vertretbar ist (1.Tick: idx, 2.Tick: value)!
Wie macht ihr das denn eigentlich so? Wie führt ihr eure lieben Events aus der AudioCell raus?
ciao