Das Gerät war nach 42 Jahren Betrieb in einem hervorragenden Zustand, sodass die Restaurierung im Wesentlichen aus einer akribischen Reinigung bestand. Trotzdem mussten ein paar Kleinigkeiten gerichtet werden.
einer der großen Drehknöpfe war nicht mehr original
die Skalenbeleuchtung war defekt
Quietschgeräusche beim Abstimmen
abgebrochene Plastik-Ecke an der Skalenhalterung
Einen neuen originales Drehknopf habe ich im Internet gefunden für unverschämte 10 Euro oder so. Bei der Skalenbeleuchtung habe ich die 6x30mm 8V Pilotlämpchen durch 12V Versionen ersetzt. Die Beleuchtung ist dadurch zwar dunkler, hält aber ewig und die Plastikteile werden nicht mehr so durch Wärme gestresst. Außerdem habe ich den unkonventionellen Umbau auf E10 Glühlampen rückgängig gemacht. Der Quietschgeräusche bin ich durch den Einsatz von Ballistol an den Umlenkrollen Herr geworden. Und die abgebrochene Plastikecke habe ich mit ziemlich giftigem Dichlormethan wieder angeklebt. Die Potentiometer hatten nur ein leichtes Kratzen, weshalb hier noch nichts unternommen wurde. Das wird dann in 30 Jahren repariert.
Während der Reinigung habe ich einen 78XX Spannungsregler mit Kühlkörper zu stark bewegt. Dadurch hat sich neben der Lötstelle ein Haarriss gebildet und der Receiver lief natürlich nicht mehr. Der Fehler war aber schnell gefunden und behoben.
Ein wenig Familiengeschichte war auch noch dabei, da das Gerät Ende der 70er Jahre mit der Familie meiner Freundin nach Buenos Aires gereist ist. Nach einigen Jahren dort und mindestens einer Reparatur ist der Receiver als Teil der Familie wieder mit nach Deutschland gekommen. Vom Aufenthalt in Argentinien zeugt noch ein Aufkleber der Servicewerkstatt „Maxwell Electronica“. Zumindest Google Maps findet die Firma noch an angegebener Adresse.
Die Werkstatt hat anscheinend damals die Skalenbeleuchtung repariert und statt der Pilotlämpchen Glühlampen mit E10 Sockel adaptiert. Die hatten aber ein zu große Leistung wodurch die Plastikteile zu warm geworden sind. Zum Glück sind die dadurch entstandenen Verfärbungen nur von hinten zu sehen.
Nun aber die Fotos, ohne Kommentar. Einmal der Ausgangszustand und Teil zwei mit Bildern nach der Instandsetzung.
Endlich war mal wieder ein freier Tag am Wochenende. Diesmal wollte ich den nutzen, um eine seit Jahren anstehende Wartung an meinem Digital-Oszilloskop Tektronix TDS754C durchzuführen. Der Plan war, die beiden ICs von „Dallas Semiconductor“ mit integrierter Lithium-Batterie auszutauschen. Und zwar bevor sie ausfallen und alle Daten verlieren. Nach 24 Jahren war es höchste Zeit dafür.
Vorbereitung
Die Vorbereitung zu dieser Wartung hat schon vor Jahren begonnen und sich lange hingezogen, wie das eben bei Hobbys so ist. Zwei Dinge musste ich im Vorfeld erledigen:
Erweiterung meines Eigenbau-Programmers auf 4MBit und um die Fähigkeit, FRAM und NVRAM Chip-Typen zu lesen und zu schreiben.
Bau eines Ersatzes für DS1250Y bzw. DS1650Y Chips.
Die Erweiterung meines Programmers hatte ich schon 2018 fertig. Den zweiten Punkt konnte ich dieses Frühjahr abhaken und habe das hier genau beschrieben.
Im Gerät sind zwei dieser tickenden Zeitbomben verbaut, Dallas Chips mit integrierter Lithium-Batterie. Die Problematik mit diesen Bauteilen habe ich ebenfalls in diesem Artikel genauer beschrieben. Konkret handelt es sich um eine DS1486 RTC+1MBit NVRAM und einen DS1650Y 4MBit NVRAM, die beide auf dem CPU-Board fest eingelötet sind.
Im Fall des Oszilloskops hier würde ein Ausfall der beiden ICs bedeuten, dass Kalibrierungsdaten und Informationen über freigeschaltete Zusatzfunktionen verloren gehen. Immerhin haben die eingebauten Batterien von 1997 bis 2021 gehalten. Bei zehn Jahren garantierter Lebensdauer ist das fast die zweieinhalbfache Zeit.
Datensicherung
Als erstes ist es eine gute Idee, eine Datensicherung vom Inhalt des NVRAMs zu machen. Das Gerät hat ein eingebautes 1,44MB HD Floppy-Laufwerk. Glücklicherweise hat jemand ein paar Scripte geschrieben und hier veröffentlicht, die es erlauben, den NVRAM auf eine Diskette zu sichern.
Bei mir hat das ganze tadellos beim ersten Versuch funktioniert. Dabei habe ich das Tool „tdsNvramFloppyDumper“ benutzt. Die Daten habe ich dann später mit dem Programmer in die Austausch-Chips geschrieben.
Auslöten
Nun ging es ans Auslöten der alten Teile. Das Oszilloskop ist sehr servicefreundlich aufgebaut. Um das CPU-Board zu entfernen, ist meiner Meinung nach keine Anleitung notwendig. Das Entlöten selbst mache ich immer mit dieser etwas größeren manuellen Entlötpumpe und einem ganz normalen Elektronik-Lötkolben.
Wichtig ist dabei, dass man benachbarte dünne Leiterzüge mit Kapton-Tape schützt. Der Rückstoß der Pumpe schleudert die Lötspitze ein kleines Stück weg beim Auslösen. Dadurch werden gelegentlich dünne Leiterzüge neben den Lötpads zerstört. Das Tape verhindert das zuverlässig nach meiner Erfahrung. Das Auslöten hat prima funktioniert, ich hatte auch nur einen Versuch.
Austauschteile
DS1486
Die RTC ist ja der schwierigere Part. Ich hatte Glück und konnte sowohl eine fertige Bauanleitung im Netz finden als auch einen Restposten-Verkäufer aus China, der den obsoleten für den Ersatz notwendigen DS1384G vertreibt. Trotzdem Vorsicht beim Kauf, auch von diesem IC werden allerlei Fakes gehandelt.
Der Nachbau des kleinen Moduls war einfach. Beim Test habe ich gelernt, dass beide Batterien angeschlossen sein müssen, damit die RTC arbeitet. Zunächst hatte ich das nur mit der primären Batterie getestet.
Erwähnenswert ist noch die Auswahl der Batterien. Es gibt sechs verschiedene verbreitete Lithium-Batterie Technologien und noch einige weitere exotische. Alle haben verschiedene Spannungen, Vor- und Nachteile. In diesem Fall hier ist es wichtig, dass die Selbstentladung niedrig und die Kapazität hoch ist. Dadurch ist eine lange Lebensdauer garantiert. Der hier eingesetzte Typ „BR1632A/HAN“ von Panasonic ist eine Lithium-Kohlenstoffmonofluorid-Batterie, welche diese Anforderungen erfüllt.
DS1650Y
Den Ersatz auf Basis eines FRAM für den 4MBit NVRAM DS1650Y habe ich selbst entwickelt Anfang dieses Jahres. Im Artikel ist das ausführlich beschrieben. Im TDS754C ist zwar ein DS1650Y verbaut, das Schreibschutz-Feature des Bauteils wird aber nicht genutzt. Der Ersatz mit dem FRAM-Modul ist deshalb möglich.
Einbau
Die neuen Bauteile werden praktischerweise gesockelt. Damit kann man z.B. zum Austausch der Batterien die Module leicht entfernen. Außerdem war ungewiss, ob der Austausch funktioniert. Bei Problemen hätte ich einfach die beiden ausgelöteten Teile wieder in den Sockel einsetzen können.
Als Sockel verwende ich welche mit einem niedrigen Profil. Die Kontakte sind teilweise in der Platine versenkt. Dadurch ist das Ersatzteil mit Sockel nur unwesentlich höher als das Original.
Die beiden Sockel waren schnell eingelötet. Ärgerlich war, dass die Stiftleisten der beiden Ersatzmodule ein Minimum zu dick geraten sind. Dadurch passen sie nicht komplett in den Sockel und lassen sich relativ schwierig stecken und entfernen. Da hätte ich vorher besser auch die Datenblätter der mechanischen Bauteile lesen sollen.
Inbetriebnahme
Zunächst meldete das Gerät einen NVRAM CRC-Fehler nach dem Einschalten. Evtl. wurde der Speicher während des Backups geschrieben was zu einer ungültigen Prüfsumme führt. Der Versuch, das Backup mit den oben verlinkten „tdsNvramFloppyTools“ wiederherzustellen war aber dann von Erfolg gekrönt. Das Gerät startet nun wieder wie gewohnt und zumindest die beiden ersetzten Teile werden viele Jahre ihren Dienst tun.
Dieses Projekt ist zwar nicht sehr groß aber trotzdem etwas Besonderes. Zum Einen ist es Teil einer jahrelang vorbereiteten Restaurierung zum Anderen ist anscheinend noch niemand bis jetzt auf die Idee gekommen, einen 5V NVRAM durch einen 3,3V FRAM zu ersetzen bzw. das zu veröffentlichen.
Problembauteile NVRAM
Wer alte Geräte lange Zeit erhalten will, trifft immer wieder auf Chips mit integrierter Lithium-Batterie von „Dallas Semiconductor“, die im Jahr 2001 von „Maxim Integrated“ gekauft wurden, die wiederum 2021 von „Analog Devices“ gekauft wurden. Dabei handelt es sich meist um NVRAMs (non-volatile RAM) oder RTCs (Real-Time-Clocks) mit NVRAM. Die im Chip-Gehäuse integrierte Batterie ermöglicht, dass die Daten im RAM auch nach Abschaltung der Betriebsspannung erhalten bleiben und die RTC weiterläuft. Ein ebenfalls integrierter NVRAM-Controller sorgt für die Umschaltung zwischen Batterie und Betriebsspannung sowie für Datenschutz beim Ein- und Ausschalten.
Grundsätzlich ist das eine sehr praktische Lösung, da man ein einzelnes Bauteil verwenden kann anstatt einer ganzen Schaltung nebst Batterie. Fatal ist allerdings, wenn nach erfahrungsgemäß etwa 20 Jahren die eingebaute Batterie erschöpft ist. Fast immer ist damit das ganze Gerät nicht mehr funktionsfähig. Die Bauteile werden selbstverständlich nicht mehr produziert. Auch die im Internet gehandelten Restposten sind entweder schon zu alt oder noch häufiger gefälscht. Ich habe selbst zwei Fälschungen erworben. Somit ist der Ersatz mit dem Originalteil keine Option.
Ersatzmöglichkeiten
Der Ersatz von RTC und NVRAM unterscheidet sich erheblich.
Den NVRAM kann man durch einen entsprechen SRAM mit NVRAM-Controller und Batterie ersetzen. Dazu sind einige Beispiele im Netz zu finden.
Eine andere Variante ist der Ersatz durch FRAM, ein Speicher, der sich wie RAM beliebig schreiben lässt, den Inhalt aber auch ohne Betriebsspannung behält. Auch hierzu gibt es Beispiele mit den FRAM-Typen FM16(W)08 und FM18(W)08 mit 64kBit bzw. 256kBit Größe. Der Charme dieser Lösung ist, dass keine Batterie nötig ist und damit der Speicher wartungsfrei bleibt. Leider sind die beiden genannten FRAM-Typen zwar pinkompatibel mit den Dallas NVRAMs, werden aber etwas anders angesteuert. Damit funktioniert der Austausch leider nicht in allen Geräten.
Eine RTC lässt sich nicht so einfach ersetzen. Die RTC bildet die Uhrzeit auf einen Speicherbereich ab, auf den wie auf „normalen“ RAM zugegriffen wird. Dabei muss der Chip das geforderte Timing exakt einhalten. Das lässt sich nur mittels Dual-Port RAM sicherstellen. Passende Schaltungen habe ich allerdings nicht gefunden. Das wäre mal ein kleines Projekt für die Zukunft. Derzeit gibt es nur die Möglichkeit, eine alte RTC mechanisch aufzubohren und von außen eine neue Lithium-Batterie anzuschließen. Oder man verwendet einen kompatiblen RTC-Chip, der noch als Restposten verfügbar ist. Soweit ich weiß geht das nur für einen DS1486, der durch einen DS1386G incl. RAM und Batterie ersetzt wird.
DS1250Y/DS1650Y FRAM Ersatz
Nun zum corpus delicti. Das Bauteil DS1250Y von „Dallas Semiconductor“ ist ein 4MBit NVRAM. Die pinkompatible Variante DS1650Y verfügt zusätzlich über die Möglichkeit, einzelne Speicherbereiche per Software mit einem Schreibschutz zu versehen. Damit kann der DS1650Y den DS1250Y ersetzen. Umgekehrt geht das nicht in jedem Fall, sondern nur dann, wenn die Software das Schreibschutz-Feature nicht benutzt oder nicht davon abhängt.
Eine kurze Bauteilrecherche nach parallelen 4MBit FRAM fördert lediglich ein einziges Produkt zu Tage, den FM22L16-55-TG. Unglücklicherweise arbeitet der mit maximal 3,3V und hat 16 Bit Datenbreite im Gegensatz zu 5V und 8 Bit beim DS1250Y.
Da fehlen also noch einige Teile, um den FM22L16 anzupassen: Etwas Logik, Level-Shifter, ein Spannungsregler und ein wenig Hirnschmalz. Schwierig beim Entwurf war auch, dass die ganze Schaltung auf eine Platine mit der Größe des Originalteils passen muss.
Schaltung
Nach einigen Tagen Datenblätter lesen und verstehen und Schaltbilder malen war die Schaltung fertig.
Zum Einsatz kommen ein bidirektionaler Level-Shifter 74LVC8T245 für den Datenbus, ein MCP1700T-3302E Low-Dropout Spannungsregler für die 3,3V Stromversorgung, ein paar Universal Single-Gates für die Steuerlogik sowie Schottky-Dioden und LEDs für die unidirektionalen Level-Shifter der Adress- und Steuerleitungen.
In der ersten Version hatte ich die Pullup-Widerstände R3 bis R5 vergessen was dazu führte, dass die Daten verändert wurden, wenn man den Baustein aus dem Programmiergerät entfernt hat. Ansonsten funktioniert die Schaltung tadellos und erfüllt problemlos die Anforderungen an das Timing des Originals.
Die Unidirektionalen Level-Shifter mit Schottky-Diode plus LED sind noch speziell und auf meinem Mist gewachsen. Ich habe die Schaltung simuliert und festgestellt, dass dieser einfache Weg sicher und schnell funktioniert.
Die Schaltung findet auf einer doppelseitigen Platine Platz, die allerdings ca. 1mm breiter ist als das Original Bauteil. In den meisten Geräten ist aber ausreichend Platz dafür vorhanden.
Gerber Files zur privaten Nachbestellung befinden sich hier. Üblicherweise bestelle ich bei JLCPCB. Dort kann man das zip einfach hochladen zum Bestellen. Die Bauteilliste und den Bestückungsplan habe ich hier hinterlegt.
Bei uns im Wohnzimmer steht ein Receiver, der ziemlich genau 50 Jahre auf dem Buckel hat. Der Sony STR-V5 hat richtig Wumms, ist mit Wire-Wrap Verbindungen verkabelt wie frühere Raumfahrttechnik und wird sicher auch noch weitere 50 Jahre funktionieren. Das Problem war nur, dass er mit seinen Cinch-Eingängen nicht mehr mit aktuellen Geräten kompatibel ist, die drahtlos übertragen. Daraus entstand die Idee, für den Receiver einen etwas besseren Bluetooth-Empfänger zu bauen im Passenden Retro-Look. Das Endergebnis ist hier schon mal zu sehen.
Bluetooth-Audio
Vor diesem Projekt hatte ich keine Ahnung von Bluetooth. In meiner Vorstellung klang es recht einfach, die Audiodaten zu übertragen und dann abzuspielen. Leider ist es nicht ganz so. Aufgrund der begrenzten Datenrate einer Bluetooth-Funkverbindung müssen die Daten komprimiert werden. Das übernimmt ein „Codec“. Der muss natürlich der gleiche sein auf der Sender- und der Empfangsseite. Die ältesten und derzeit am weitesten verbreiteten Codecs sind „AAC“ und „SBC“. Audiophile Nutzer waren mit der Qualität dieser Kompression nicht zufrieden, sodass eine Reihe neuer Standards versuchen den Markt zu erobern. Neben „SBC“ und „AAC“ wetteifern nun auch “ aptX“, „aptX HD“ und „LDAC“ um die Gunst des Kunden. Nicht vergessen: Sender und Empfänger müssen den gleichen Codec unterstützen. Wenn man sich z.B. einen Bluetooth-Kopfhörer mit „aptX“ kauft, der Receiver aber „LDAC“ spricht, kommt nur eine Verbindung mit „SBC“ zustande, falls es überhaupt klappt.
Insgesamt ist der Bluetooth-Standard ziemlich komplex und mein Interesse hält sich in Grenzen da noch weiter einzutauchen. Die Software benutzt „SBC“, was von quasi allen Geräten unterstützt wird.
Lautstärkeregelung
Während der Programmierung ist mir aufgefallen, dass die Lautstärkeregelung bei Bluetooth der Knackpunkt ist. Das Grundproblem besteht darin, dass die Audio-Samples mit 16 Bit und üblicherweise 100% Lautstärke übertragen werden. Im Empfänger wird nun die Lautstärke reduziert auf sagen wir mal 35%. Das bedeutet, dass wir die Audio-Samples ungefähr durch 16 teilen müssen. Als Ergebnis haben wir Audiodaten mit einer Auflösung von nur noch 12 Bit. Und genauso hört sich das dann an.
Eine einfache Lösung für das Problem ist ein 32 Bit D/A-Wandler. Die empfangenen 16 Bit Samples werden in 32 Bit Werte umgewandelt, indem einfach Nullen angehängt werden. Das macht erst mal keinen Unterschied. Im zweiten Schritt können wir aber die Lautstärke mit dem 32 Bit-Wert berechnen und diesen dann direkt an den D/A-Wandler senden. Dadurch gibt es keinen Informationsverlust bei geringer Lautstärke, die 16 Bit Information bleiben erhalten.
Herzstück der Schaltung ist ein Mikrocontroller ESP32 der Firma Espressif. Das System bietet nicht nur reichlich Rechenleistung für 3,50 Euro, sondern ist auch noch stromsparend. Es gibt sehr viele Code-Beispiele vom Hersteller und lebhafte Diskussionen in Foren, was Anwendungsentwicklung und Fehlersuche erleichtern.
Als hochwertiger D/A-Wandler kommt ein PCM5102A von Texas Instruments mit 32 Bit und 112dB Signal-Rausch-Abstand zum Einsatz. Eigentlich ist der für Bluetooth-Audio viel zu gut, die Vorteile der 32 Bit zahlen sich aber bei der Lautstärkeregelung aus.
Das ganze wird noch ergänzt durch zwei Taster für Lautstärke und Reset, ein 128×64 Pixel OLED-Display und eine Lochraster-Platine. Bei diesem Projekt verwende ich fertige Module, die nur noch miteinander verbunden werden müssen. Das geht natürlich viel schneller, als ein eigener Platinen-Entwurf.
Schaltung
Da ich für das Projekt fertige Module verwendet habe, beschränkt sich die Schaltung auf wenige Verbindungen des zentralen ESP32 Moduls mit dem OLED-Display, dem D/A-Wandler und den zwei Tastern. Das ganze ist in einer Stunde zusammengelötet.
Aus verleimten Sperrholzresten habe ich ein kleines Gehäuse gebaut, was ganz chic geworden ist und für meinen Geschmack und gut zum Sony-Receiver passt.
Software
Die Software ist abgeleitet vom Beispiel „A2DP-SINK“ des ESP32-Herstellers Espressif. Das hat die Entwicklungszeit sehr verkürzt für mich, da die komplette und ziemlich komplexe Bluetooth-Kommunikation bereits im Beispiel implementiert ist. Ich habe noch eine Verarbeitung der Audio Samples für die Lautstärkeregelung und die Umwandlung von 16 zu 32 Bit hinzugefügt wie oben beschrieben. Außerdem habe ich die Routinen für das OLED-Display ergänzt. Auf dem Display wird der Betriebszustand, das verbundene Gerät und eine logarithmische Pegelanzeige dargestellt.
Am Ende hat die Programmierung und Fehlersuche dann doch deutlich länger als ein Wochenende gedauert, da noch eine Menge Bugs zu finden und zu beseitigen waren.
Den kompletten Quellcode, die Bedienungsanleitung und Anweisungen zum Compilieren des Projektes habe ich auf Github veröffentlicht.
Kürzlich habe ich als Wochenendprojekt einen Bluetooth Audio Empfänger zusammengebastelt. Dabei kam ich irgendwann an den Punkt, die Lautstärke zu regulieren und musste feststellen, dass es gar nicht so einfach ist, das gut zu machen. Ich habe wie immer eine Weile im Internet recherchiert, am Ende musste ich selbst experimentieren getreu dem Motto, dass man nichts vernünftig programmieren kann, was man nicht versteht.
Lautstärke und Gehör
Unser Ohr ist ein eindrucksvolles Organ. Der Hörbereich vom leisestem Ton bis zum größten Krach umfasst etwa 6 Dekaden. Das bedeutet, dass das leiseste Geräusch eine Million mal leiser ist als das lauteste, was wir wahrnehmen können. Da es bei Lärm physikalisch keine Obergrenze gibt, wird beim Gehör die Lautstärke als Maximum festgelegt, welche wir kurzzeitig ohne bleibenden Schaden hören können.
Ein weiterer wichtiger Fakt ist, dass wir leisere Töne viel besser in der Lautstärke differenzieren können. Das macht sich daran bemerkbar, dass wir bei leisen Tönen sehr gut Unterschiede in der Lautstärke hören. Je lauter es wird, umso weniger bemerken wir eine Veränderung.
Daraus ergeben sich folgende Forderungen an eine gute Lautstärkeregelung: Im leisen Bereich muss man in sehr kleinen Schritten sehr genau einstellen können. Je lauter es wird, umso größer werden Schritte und Änderung.
Das hat man natürlich auch schon vor fast 100 Jahren gewusst und selbst in uralter Analogelektronik sind Lautstärkeregler bzw. Potentiometer mit sogenanntem logarithmischen Verlauf eingebaut. Auf alten Potentiometern steht z.B. noch „100kΩ log“ für 100 Kiloohm mit logarithmischen Verlauf oder z.B. „1M lin“ für 1 Megaohm und linearen Verlauf. Auf aktuellen Modellen wird normalerweise der Verlauf mit dem ersten Buchstaben gekennzeichnet:
„A20k“ entspricht logarithmisch, 20kΩ
„B2k“ bedeutet linear 2kΩ
„C50k“ heißt anti-logarithmisch 50kΩ
Mit Einzug der Digitaltechnik haben einige Ingenieure aber nicht ihre Hausaufgaben gemacht und es gibt viele (digitale) Geräte, in denen die Lautstärkeregelung mangelhaft funktioniert. Oft ist die Abstufung im unteren Bereich zu grob, manchmal sind es zu wenige Stufen mit 32 oder noch weniger Einstellstufen.
Vergleich verschiedener Funktionen
Ein logarithmischer Verlauf bei einer Lautstärkeregelung bzw. einem Potentiometer ist meines Wissens nach gar nicht exakt mathematisch definiert. Den Datenblättern einiger Hersteller nach zu urteilen sind die Widerstandsverläufe zum Teil linear mit sanften Übergängen. Ein Hersteller für hochwertige Audio-Potentiometer (Alps Alpine) hat z.B. einen Verlauf mit drei linearen Bereichen; flach bis knapp 25%, etwas steiler bis 65% und sehr steil bei mehr als 65% Drehwinkel.
Das könnte man natürlich digital nachempfinden, was aber relativ aufwändig wäre. Eine mathematische Funktion ist natürlich viel einfacher zu programmieren.
Der gewünschte Kurvenverlauf, also Anfangs flach, am Ende steil, folgt ja eher einer Exponentialfunktion oder Potenzfunktionen. Je höher die Potenz, umso flacher der Anstieg im unteren Bereich und umso steiler am Ende. Ich habe verschiedene Funktionen ausprobiert, zunächst die Kurven dargestellt, danach per Gehör getestet.
Optimale Funktion
Nach meinem Gehör beurteilt hat sich die Funktion y=x³ als optimal herausgestellt. Dabei addiere ich noch einen kleinen Offset, damit die Regelung im unteren Bereich etwa bei der Hörschwelle beginnt.
Berechnung der Lautstärke
Für die Regulierung der Lautstärke wird bei digitalen Audiodaten normalerweise ein Faktor benutzt, mit dem jedes Audio-Sample multipliziert wird. Falls man mit Fließkommazahlen arbeitet, liegt der Faktor üblicherweise zwischen 0 und 1. Bei Festpunktarithmetik kann der Faktor ganz unterschiedlich sein. Im Folgenden ein Beispiel als C-Code, wo der Lautstärkefaktor ein 16 Bit Wert zwischen 0 und 65536 ist und mit der Funktion y=x³ errechnet wird.
Wenn man diesen Wert nun mit 16 Bit Audio Samples multipliziert, bekommt man 32 Bit Werte als Ergebnis. Ich verwende das so in einem Bluetooth-Empfänger, wo 16 Bit Audio über Bluetooth empfangen wird und nach Lautstärkeberechnung ohne Qualitätsverlust an einen 32 Bit D/A-Wandler PCM5102A ausgegeben wird.
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
//use x^3 function
#define VOL_POWER 3.0
//upper/lower limit of factor to multiply with samples
#define VOL_MIN 30.0
#define VOL_MAX 65536.0
//precalculate constants once
static const float vol_pow_min = pow(VOL_MIN, (1.0 / VOL_POWER));
static const float vol_pow_diff = pow(VOL_MAX, (1.0 / VOL_POWER)) - pow(VOL_MIN, (1.0 / VOL_POWER));
//calculate volume factor with power function
//argument vol: 0..100%
static uint32_t vol_calc(uint8_t vol) {
if (vol == 0) return 0;
if (vol >= 100) return VOL_MAX;
return floor(pow((vol_pow_min + vol_pow_diff / 100 * vol), VOL_POWER));
}
Als kleine Berechnungshilfe und für eigene Experimante kann hier noch meine Tabelle mit den Zahlenreihen und Versuchen heruntergeladen werden: volume_calc.ods