Dies beantwortet nicht Ihre Fragen, aber ich denke, das Problem wird relevant angesprochen.
Heutzutage ist es dumm, dies analog zu tun, außer vielleicht für einige sehr spezialisierte oder Hochfrequenzanwendungen. Sie haben erwähnt, dass dies eine Audioanwendung ist, daher kann ich mir keinen guten Grund für all das Analoge vorstellen. In Ihrem ersten Satz wird erwähnt, dass Sie eine ganze Reihe dieser Dinge möchten, und b> Sie möchten, dass das Design kompakt ist. Der analoge Ansatz wird definitiv nicht kompakt sein. Ein weiteres Problem beim analogen Ansatz besteht darin, dass die Frequenzen und Amplituden driften.
Ein viel besserer Weg, dies zu tun, besteht darin, alle Sinuswellen in einem Prozessor zu erzeugen und digital zu addieren. Sie können alle dieselbe 1/4-Wellen-Sinustabelle verwenden und nur in unterschiedlichen Inkrementen pro Sample indizieren, um die unterschiedlichen Frequenzen zu erhalten.
Dies liegt sogar innerhalb der Möglichkeiten von Low-End-DSPs wie dem Microchip dsPIC-Leitung. Ein dsPIC33F klingt nach einer guten Passform. Bei 40 MIPS haben Sie 1000 Befehlszyklen pro Abtastung bei einer Abtastrate von 40 kHz. Das ist eine Menge und ermöglicht es, jeder Probe viele verschiedene Sinusse hinzuzufügen. Mit der DSP-Hardware für die Mehrfachakkumulation kann jeder Beitrag problemlos mit seiner eigenen Verstärkung addiert werden.
Digital abgeleitete Signale wie diese driften nicht in Frequenz oder Amplitude und weisen ein besseres Signal-Rausch-Verhältnis auf. Mit 16-Bit-Zahlen erhalten Sie 96 dB. Das ist analog machbar, wenn Sie vorsichtig sind. Die Genauigkeit des digitalen Signals ist jedoch weitaus größer. Es gibt überhaupt keine Chance, dass die analogen Sinusgeneratoren innerhalb von 1 Teil von 65000 pro Probe liegen können, nur aufgrund der unvorhersehbaren Amplitude allein. Die Frequenz der digitalen Signale kann auch sehr genau eingestellt werden, und der digitale Sinus-Synthesizer benötigt nicht einige Zyklen, um sich zu stabilisieren, bevor seine Ausgabe Ihren Erwartungen entspricht.
Bearbeiten: Erläuterung zur Sinuserzeugung
Ich sehe einige Nachteile der Sinusgenerierung bei der Tabellensuche, die in anderen Antworten erwähnt werden und falsch sind. Daher füge ich hier weitere Erläuterungen zur Methode hinzu. Es wurden zwei Einwände erhoben: Genauigkeit und Frequenzauflösung.
Lassen Sie mich zunächst die normale Struktur einer Sinussuche erläutern. Beachten Sie, dass eine Sinuswelle vierfach symmetrisch ist. Sie müssen daher nur 1/4 Zyklus speichern. Die grundlegende Wellenform des ersten Quadranten wird in den verbleibenden drei 1/4 Zyklen entweder umgekehrt, negiert oder beides wiederholt. Ein guter Trick, um dies zu vereinfachen, besteht darin, den Winkel so auszudrücken, dass ein voller Kreis eine Zweierpotenz ist, vorzugsweise mit dem gesamten Wort der Maschine, auf der der Code ausgeführt wird. Das bedeutet, dass Winkeladditionen und Subtraktionen automatisch ohne expliziten Code um den Kreis gewickelt werden, wenn Sie die Winkelberechnung in vorzeichenloser Ganzzahlarithmetik durchführen. Diese Darstellung macht auch das Nachschlagen in die 1/4 Wellentabelle sehr einfach.
Die zwei hohen Bits des Winkels geben den Quadranten an, sodass nur die verbleibenden unteren Bits zum Indizieren in die Tabelle verwendet werden. Wenn das Bit mit dem höchsten Winkel gesetzt ist, wird das Tabellenergebnis negiert. Wenn das nächsthöhere Bit gesetzt ist, wird die Tabelle rückwärts indiziert. Das ist so einfach wie das Ergänzen der verbleibenden niedrigen Bits, bevor sie als Index verwendet werden. Die Tabelle muss nicht so groß sein, dass alle niedrigen Bits als Index verwendet werden können. Zum Beispiel wäre es auf einer 16-Bit-Maschine wie einem dsPIC natürlich, 16 Bit für den Winkel zu verwenden. Damit bleiben 14 Bits zum Indizieren in der Tabelle, was eine sehr große Tabelle wäre. Typischerweise und in diesem Fall wird eine so große Tabelle nicht benötigt. Eine vernünftige Größe könnten 1024 Segmente sein, die 10 Indexbits verwenden würden. Die verbleibenden 4 Indexbits (in diesem Beispiel) können entweder ignoriert oder zum Interpolieren zwischen benachbarten Einträgen verwendet werden. Die Tabelle hätte tatsächlich 1025 Einträge, was 1024 Segmente bedeutet. Eine mit 4096 angenäherte Sinuswelle (die Tabelle wird viermal über die gesamte Sinuswelle verwendet) wäre ziemlich gut. Wenn die zusätzlichen Bits zum Interpolieren zwischen benachbarten Tabelleneinträgen verwendet werden, ist dies sogar noch besser. Stellen Sie sich eine Sinuswelle vor, die mit 4096 linearen Segmenten pro Zyklus approximiert wird. Es wäre sehr schwierig, einen Fehler zu erkennen.
Berechnen Sie die Genauigkeit. Eine Sinuswelle ändert sich am schnellsten im Winkel Null, sodass es einfach ist, den Worst-Case-Fehler aus einer blöden Suche in eine 1024-Punkt-Tabelle zu berechnen. Der erste Tabellenwert wäre 0 und der zweite Sinus (Pi / 2048) = 0,00153. Der Worst-Case-Fehler ist daher halb so hoch oder .000767. Dies entspricht einem Signal-Rausch-Verhältnis von 62 dB, und zwar nur durch Auswahl eines Tabellenwerts ohne Interpolation. Die Verwendung der verbleibenden 4 Indexbits zur Interpolation erhöht das Signal-Rausch-Verhältnis auf 86 dB. Wenn dies nicht gut genug ist, verwenden Sie eine breitere Zahl für den Winkel und interpolieren Sie mit den zusätzlichen Bits.
Die Frequenzauflösung ist ebenfalls kein Problem. Anscheinend denken einige, dass das Winkelinkrement pro Probe ein Vielfaches des Winkelschritts pro Tabelleneintrag sein muss. Das stimmt überhaupt nicht. Wenn Sie nur einen 16-Bit-Winkel und eine 1024-Segmenttabelle verwenden, erhalten Sie bereits eine 16-mal höhere Winkelauflösung als bei jedem Tabelleneintrag. In der Praxis würde ich wahrscheinlich zwei Wörter (32 Bit in diesem Beispiel) für die Winkel und Winkelinkremente verwenden. Dies bietet eine sehr hohe Frequenzauflösung und mehr Interpolationsbits, um das Signal-Rausch-Verhältnis zu erhöhen. Bei einer Abtastrate von 40 kHz würde ein 20-Hz-Ton (im schlimmsten Fall) ein Winkelinkrement von 1/2000 Kreis pro Abtastung erfordern. Das ist ein Teil von 33 verwendet 16-Bit-Winkel. Das allein könnte für viele Anwendungen gut genug sein. Wenn Sie einen 32-Bit-Winkel verwenden, beträgt die Frequenzauflösung bei 20 Hz mehr als 1 Teil von 2 Millionen.
Lassen Sie uns also die Lookup-basierte Sinusgenerierung in der Firmware nicht so schnell schließen. Lassen Sie es uns zumindest nicht aus den falschen Gründen ablehnen. Beachten Sie, dass keines der von mir beschriebenen Dinge für einen dsPIC schwierig ist. Dies schließt eine Interplation ein, da ein dsPIC in einem einzelnen Befehlszyklus eine Multiplikation von 16 x 16 in 32 Bit durchführen kann.