Cela ne répond pas à ce que vous avez demandé, mais je pense que cela résout le problème de manière pertinente.
De nos jours, faire cela en analogique est ridicule, sauf peut-être pour certaines applications très spécialisées ou à haute fréquence. Vous avez mentionné qu'il s'agit d'une application audio, donc je ne peux pas imaginer une bonne raison pour tout l'analogique. Votre première phrase mentionne que vous voulez une banque complète de ces choses, et vous voulez le design compact. L'approche analogique ne sera certainement pas compacte. Un autre problème avec l'approche analogique est que les fréquences et les amplitudes vont dériver.
Une bien meilleure façon de faire est de générer toutes les ondes sinusoïdales dans un processeur et de les additionner numériquement. Ils peuvent tous utiliser la même table sinusoïdale 1/4 d'onde, il suffit de l'indexer à différents incréments par échantillon pour obtenir les différentes fréquences.
Ceci est bien dans la capacité même des DSP bas de gamme, comme le Microchip ligne dsPIC. Un dsPIC33F semble être un bon ajustement. À 40 MIPS, vous disposez de 1000 cycles d'instructions par échantillon à une fréquence d'échantillonnage de 40 kHz. C'est beaucoup et cela permettra d'ajouter de nombreux sinus différents à chaque échantillon. Le matériel de multiplication-accumulation DSP permettra d'ajouter facilement chaque contribution avec son propre gain.
Les signaux dérivés numériquement comme celui-ci ne dériveront pas en fréquence ou en amplitude, et auront un meilleur rapport signal sur bruit. Avec des nombres de 16 bits, vous obtenez 96 dB. C'est faisable en analogique si vous faites attention. Cependant, la précision du signal numérique sera beaucoup plus grande. Il n'y a aucune chance que tous les générateurs sinusoïdaux analogiques puissent être à 1 partie sur 65000 chaque échantillon juste en raison de l'imprévisibilité d'amplitude seule. La fréquence des signaux numériques peut également être réglée très précisément, et le synthétiseur sinusoïdal numérique n'aura pas besoin de quelques cycles pour se stabiliser avant que sa sortie soit ce que vous attendez.
Edit: Clarification sur la génération sinusoïdale
Je vois quelques inconvénients de la génération sinusoïdale de recherche de table mentionnés dans d'autres réponses qui sont incorrects, donc j'ajoute plus de précisions sur la méthode ici. Deux objections ont été soulevées, la précision et la résolution de fréquence.
Permettez-moi d'abord d'expliquer la structure normale d'une recherche sinusoïdale. Notez qu'une onde sinusoïdale est symétrique à quatre voies. Il vous suffit donc de stocker 1/4 de cycle. La forme d'onde de base du premier quadrant est répétée soit inversée, soit inversée, soit les deux dans les trois 1/4 cycles restants. Une bonne astuce pour rendre cela facile est d'exprimer l'angle de telle sorte qu'un cercle complet soit une puissance de deux, de préférence en utilisant le mot entier de la machine qui exécute le code. Cela signifie que les additions et les soustractions d'angle s'enroulent automatiquement autour du cercle sans code explicite à cet effet si vous faites le calcul des angles en arithmétique d'entiers non signés. Cette représentation facilite également la recherche dans la table 1/4 d'onde.
Les deux bits hauts de l'angle indiquent le quadrant, donc seuls les bits inférieurs restants sont utilisés pour l'indexation dans la table. Si le bit d'angle le plus élevé est défini, le résultat de la table est annulé. Si le bit suivant le plus élevé est défini, la table est indexée en arrière. C'est aussi simple que de compléter les bits faibles restants avant de les utiliser comme index. La table n'a pas besoin d'être de la taille telle que tous les bits de poids faible puissent être utilisés comme index. Par exemple sur une machine 16 bits comme un dsPIC, il serait naturel d'utiliser 16 bits pour l'angle. Cela laisse 14 bits à indexer dans la table, ce qui serait une très grande table. En règle générale, et dans ce cas, une table aussi grande n'est pas nécessaire. Une taille raisonnable pourrait être de 1024 segments, qui utiliseraient 10 bits d'index. Les 4 bits d'index restants (dans cet exemple) peuvent être ignorés ou utilisés pour interpoler entre les entrées adjacentes. La table aurait en fait 1025 entrées, ce qui signifie 1024 segments. Une onde sinusoïdale approximée à 4096 (la table s'utilise 4 fois sur toute l'onde sinusoïdale) serait assez bonne. Si les bits supplémentaires sont utilisés pour interpoler entre les entrées de table adjacentes, c'est encore mieux. Imaginez une onde sinusoïdale approximée avec 4096 segments linéaires par cycle. Il serait très difficile de voir une erreur.
En ce qui concerne la précision, faites le calcul. Une onde sinusoïdale change le plus rapidement à un angle nul, il est donc facile de calculer l'erreur le plus défavorable à partir d'une simple recherche stupide dans une table de 1024 points. La première valeur de la table serait 0 et le deuxième sinus (Pi / 2048) = .00153. Le pire des cas d'erreur est donc la moitié de cela, soit 0,000767. Cela équivaut à un rapport signal sur bruit de 62 dB, et c'est simplement en choisissant une valeur de table sans interpolation. L'utilisation des 4 bits d'index restants pour interpoler augmente le rapport signal sur bruit à 86 dB. Si cela ne suffit pas, utilisez un nombre plus grand pour l'angle et interpolez en utilisant les bits supplémentaires.
La résolution de fréquence n'est pas non plus un problème. Apparemment, certains pensent que l'incrément d'angle par échantillon doit être un multiple du pas d'angle par entrée de table. Ce n'est pas vrai du tout. L'utilisation d'un simple angle de 16 bits et d'une table de 1024 segments vous donne déjà 16 fois plus de résolution angulaire que chaque entrée de table. En pratique, j'utiliserais probablement deux mots (32 bits dans cet exemple) pour les angles et les incréments d'angle. Cela fournit une résolution de très haute fréquence et vous donne également plus de bits d'interpolation pour augmenter le rapport signal sur bruit. À une fréquence d'échantillonnage de 40 kHz, une tonalité de 20 Hz (le pire des cas) nécessiterait un incrément d'angle de 1/2 000 cercle par échantillon. C'est une partie sur 33 qui utilise des angles de 16 bits. Cela seul pourrait être suffisant pour de nombreuses applications. Si vous utilisez un angle de 32 bits, la résolution de fréquence à 20 Hz est supérieure à 1 partie sur 2 millions.
Donc, ne rejetons pas si rapidement la génération sinusoïdale basée sur la recherche dans le firmware. Au moins ne la rejetons pas pour les mauvaises raisons. Notez qu'aucune des choses que j'ai décrites ne serait difficile à faire pour un dsPIC. Cela inclut l'interplation car un dsPIC peut effectuer une multiplication 16 x 16 en 32 bits en un seul cycle d'instructions.