Wie werden mehrere Frequenzen über einen Lautsprecher/Summer wiedergegeben, ohne sich gegenseitig zu verzerren?

Ich habe eine Idee für ein Arudino-Projekt, das im Wesentlichen eine Piezo-Summer-Musikmaschine ist, in die ich Noten programmieren kann. Es würde aus einzelnen 555 Oszillatorschaltungen mit unterschiedlichen Frequenzen bestehen und das Arduino würde steuern, ob sie (die spezifische Note) aktiv ist oder nicht. Ich habe mich umgesehen, um ähnliche Projekte zu finden, aber jeder, den ich finde, verwendet nur einen oder zwei Piezo-Summer mit dem Arduino-Ton (); Bibliothek.

Es brachte mich dazu, über mehrere Frequenzen auf einem Lautsprecher/Summer nachzudenken und wie das funktioniert. Wenn ich zwei Rechteckwellen hätte, würde dies keine Verzerrung verursachen, indem entweder die Signale gestapelt werden, wenn beide hoch sind, oder eine Aufhebung, wenn eines hoch und das andere niedrig ist?

Ich habe viel gesucht, um eine Antwort auf diese Frage zu finden, aber nichts war einfach. Ich frage mich auch, ob mein Projekt eine gute Idee ist oder nicht, weil ich eine Fülle von Sounds spielen möchte.

Superposition, siehe auch Fourier-Synthese
Wenn Sie zwei Sinuswellen mit entgegengesetzter Phase spielen, heben sie sich auf. Zählt es als "Verzerrung"?
@EugenSch. das ist eine interessante frage...
@Trevor Ich würde sagen, dass eine Überlagerung von Wellen keine Verzerrung ist, sondern die Art und Weise, wie die Dinge natürlich funktionieren. Wenn Sie eine Trommel und eine Gitarre haben, summieren sich ihre "Wellen" einfach in Ihrem Ohr. und der kombinierte Ton ist keine "Verzerrung".
@EugenSch. Ja, das stimmt, aber eine Trommel und eine Gitarre haben eine besondere Trennung. Zwei phasenverschobene Sinuswellen heben sich nur auf, weil sie eine Einzelpunktquelle (den Lautsprecher) haben. Wenn Sie und ich dieselbe Note auf einem Instrument spielen würden, das genau eine Sinuswelle erzeugt, wäre es nicht dasselbe. Das ist der Teil, der es interessant macht.
@Trevor Richtig. Es sei denn, Sie haben eine spezielle Stelle, an der Molke in der Antiphase ist :) Wie auch immer, wenn wir über verschiedene Frequenzen sprechen, hat dieser Effekt eine andere Form (haben Sie jemals eine Gitarre gestimmt? :) )
@EugenSch. Yup, aber es wirft die interessante Frage auf, ob dieser Einzelquellen-Superpositionseffekt als Verzerrung eingestuft werden kann. Ich denke, das ist einer der Gründe, warum Stereo so viel besser klingt als Mono.
@Trevor Ja, ich verstehe deinen Punkt. Wenn wir zwei „Instrumente“ haben, die gegenphasig arbeiten, können wir unterschiedliche Klänge erhalten, indem wir sie auseinandernehmen und den Beobachter bewegen. Aber wenn wir von einer einzigen Stelle spielen, hören wir nichts. Ich denke, dafür sind die Toningenieure da :)
Ihr Ziel kann erreicht werden, aber Sie gehen es völlig falsch an. Verwenden Sie keine 555er - sie erzeugen Rechteckwellen und sind sehr schwer zu kontrollieren. Holen Sie sich stattdessen eine einigermaßen schnelle MCU mit einem DAC oder einer schnellen PWM, die Sie filtern können, und führen Sie eine Softwaresynthese einer Summe mehrerer Sinuswellen durch. Wenn Sie Arduino-ish bleiben möchten, könnte ein High-End-Teensy oder möglicherweise ein Due oder sogar ein ESP8266 die Wahl sein.
Wie andere mehr oder weniger deutlich angedeutet haben, müssen Sie dem Summer ein analoges Signal zuführen. Das analoge Signal ist dann nur die Summe seiner Komponenten oder Klänge oder Wellenformen. Wie Sie herausgefunden haben, funktioniert das Summieren von 1-Bit-Digitaleingangssignalen zu einem 1-Bit-Digitalausgangssignal nicht.

Antworten (3)

Dies ist wirklich ein langer Kommentar im Vergleich zu einer Antwort auf die Frage.

Was Sie zu tun versuchen, ist eine schlechte Idee, wenn der Punkt das Ergebnis ist. Wenn Sie es zum Spaß, zur Herausforderung oder zum Lernen tun, ist das in Ordnung, aber erwarten Sie keine guten Ergebnisse.

Es wird sehr schwierig und mühsam, all diese analogen Oszillatoren aus den 1970er Jahren in Stimmung zu halten. Lassen Sie die bösen 666 555 Timer hinter sich und erledigen Sie alles digital. Das Ergebnis wird nicht nur besser, sondern auch viel einfacher.

Addieren Sie alle Signale, die Sie digital kombinieren möchten, schreiben Sie dann die Summe in einen D/A und lassen Sie diesen schließlich einen Lautsprecher ansteuern. Schreiben Sie eine schnelle nachschlagebasierte Sinusroutine und verwenden Sie sie dann für jeden der Töne. Die Frequenzen werden dadurch gesteuert, wie weit die Indizes in der Tabelle bei jedem Abtastwert vorgerückt werden. Verwenden Sie vielleicht 16 Bruchbits unter jedem Index, um eine ausreichende Frequenzauflösung zu erhalten.

Machen Sie die Sinustabelle eine Potenz von 2 in der Größe. Das bedeutet, dass die Indizes (Winkelargumente für die Sinusfunktionen) automatisch auf 0 umbrechen, wenn sie über 360° hinaus inkrementiert werden.

Sogar eine Brute-Force-10-Bit-Sinus-Suche liefert weitaus bessere Ergebnisse als eine Reihe von 666-Timern.

Dies ist für einen Prozessor, der eher für solche Dinge gedacht ist, einfacher als für alles, was in einem Arduino enthalten ist. So etwas wie ein Microchip dsPIC kann dies leicht tun.

Mal sehen, wie sich die Zahlen entwickeln. Ein dsPIC ist von Natur aus eine 16-Bit-Maschine, also verwenden wir zwei Wörter für jeden Winkel. Das hohe Wort wird direkt der Tabellenindex sein, und die niedrigen Wortbruchbits für mehr Auflösung. Ein dsPIC der EP-Serie kann mit 70 MIPs laufen. Angenommen, Sie möchten eine Abtastrate von 40 kHz. Das bedeutet, dass Sie 1750 Anweisungen pro Probe erhalten!

Für jeden beitragenden Ton greifen Sie das hohe Wort des Winkels, verwenden es, um den Sinuswert aus einer Tabelle nachzuschlagen, fügen diesen in den Akkumulator ein und erhöhen dann den Index, indem Sie dessen 32-Bit-Inkrement hinzufügen. Nehmen wir an, dies erfordert 25 Anweisungen pro Ton, einschließlich des gesamten Initialisierungs-, Schleifen- und Terminierungsüberprüfungsaufwands. Es sollte weniger dauern, aber selbst damit kann diese Methode 70 Töne unterstützen.

Das ist viel besser und einfacher, als zu versuchen, 70 analoge Oszillatoren gestimmt zu halten.

Genauso wie es in Luft funktioniert - solange das Medium linear ist, stören sich zwei oder mehr hinzugefügte Signale, ob elektrisch oder akustisch, nicht, die resultierende komplexere Wellenform erscheint dem Ohr oder jedem Messgerät als "Frequenz". x bei Amplitude y und Frequenz a bei Amplitude b".

Sobald irgendetwas nichtlinear wird – Lautsprecherkegel am Ende der Auslenkung, Verstärker entweder aus dem linearen Bereich oder aus der Flankensteilheitsreserve herausgefahren* … hat die resultierende Wellenform die zwei oder mehr Originalfrequenzen mit einer niedrigeren Amplitude plus zusätzliche Frequenzen (normalerweise Vielfache der ursprünglichen Frequenzen).

Ein "lineares Filter"-Verhalten von irgendetwas in der Kette (Bandpass, Tiefpass, Hochpass ...) ändert die relativen Amplituden, führt jedoch keine neuen Frequenzen ein.

*Dies kann passieren, wenn in einer sehr breitbandigen Audiokette ein Signal mit hoher Amplitude und unhörbar hoher Tonhöhe vorhanden ist. Verstärker (und Lautsprecher) haben ein Durchlassband (lineares Filterverhalten, unabhängig von absoluten Amplituden - das kann nichts "verzerren", es sei denn, Sie erreichen -> ), Auslenkungsgrenzen (Ausgangsspannung kann nicht höher oder niedriger als x werden, und die ein hohes Tonsignal verbraucht diese Grenze und lässt nicht genug Spannung für die andere, und die Anstiegsgeschwindigkeit begrenzt (wie schnell sich die Ausgangsspannung oder Kegelposition pro Sekunde ändern kann - dies ist amplitudenabhängig und unterscheidet sich vom Durchlassbereich! Auch hier die hohe Tonhöhe Signal kann diese Ressource verbrauchen, was zu einer Verzerrung der anderen Signale führt).

Offensichtlich beeinflussen sich zwei oder mehr Signale gegenseitig, die Superposition Antwort oder Wort ist alles, was Sie hier nachschlagen müssen. Beobachten Sie einen Lautsprecher in Aktion, wenn Sie eine wirklich niedrige Frequenz haben, bewegt sich der Lautsprecher relativ langsam und eine hohe und er bewegt sich schnell, aber Sie können beides erzeugen und sagen, dass beide da sind, also wie ist das möglich?

Sie müssen sich gegenseitig beeinflussen und sie sind genau so, wie Sie es erwarten würden, wenn Sie die beiden zusammenzählen würden, Sie würden sagen, eine langsame Sinuswelle, die mit einer schnelleren Sinuswelle wackelt, rechnen Sie einfach nach und zeichnen Sie es auf, los geht's Der Lautsprecher ist mechanisch in der Lage, was passiert (mit einiger Verzögerung usw.). So funktioniert die MP3-Komprimierung theoretisch, wenn genug los ist, oder sagen wir mal, eine wirklich laute niedrige Frequenz kann unser Ohr gleichzeitig leisere andere Frequenzen aufnehmen? Nein, können wir das herausfinden und herausfiltern, ja, spart das insgesamt digitale Bandbreite? Ja...

Es gibt keinen Grund für die ganze Arbeit, die Sie tun, externe Timer. Nur eine Art Prozessor und ein DAC, alles andere ist digital, addieren Sie einfach die Kanäle und dividieren Sie sie durch eine Zahl N, damit sie nicht übersteuern, und oder auf jeden Kanal wird ein Gewicht oder eine Verstärkung angewendet. Mit einem Arduino oder ich würde jedem Mikrocontroller sagen, kein Grund, Floating Point Stick mit Fixed zu verwenden. Die mcu-Uhr ist gut genug, idealerweise ein Kristall für die Genauigkeit. Mischen Sie Ihre Kanäle digital (addieren und dividieren Sie durch einige N) und geben Sie einen DAC an einen Verstärker an den Lautsprecher aus. Möchten Sie dies prototypisieren? Schreiben Sie eine Software auf Ihrem Entwicklungscomputer, die ein paar Wellen erzeugt, kombiniert sie, füttert sie roh in Audacity oder ein Programm, das sie verarbeiten kann, oder ermittelt das Wave-Dateiformat (etwas trivial) oder ein anderes Rohformat und spielt es dann einfach auf Ihrem ab Computer, es ist nicht komplizierter als das. Sie können eine vorberechnete Nachschlagetabelle für jeden gewünschten Sound haben, für jede Abtastperiode die aktivierten Sounds miteinander kombinieren und diese an den DAC weitergeben.