Questo non risponde a ciò che hai chiesto, ma penso che risolva il problema in modo pertinente.
Oggigiorno farlo in analogico è sciocco, tranne forse per alcune applicazioni molto specializzate o ad alta frequenza. Hai detto che questa è un'applicazione audio, quindi non riesco a immaginare una buona ragione per tutto l'analogico. La tua prima frase menziona che vuoi un intero banco di queste cose, e vuoi il design compatto. L'approccio analogico non sarà sicuramente compatto. Un altro problema con l'approccio analogico è che le frequenze e le ampiezze andranno alla deriva.
Un modo molto migliore per farlo è generare tutte le onde sinusoidali in un processore e sommarle digitalmente. Possono tutti utilizzare la stessa tabella sinusoidale a 1/4 d'onda, basta indicizzarla con diversi incrementi per campione per ottenere le diverse frequenze.
Ciò rientra nelle capacità anche di DSP di fascia bassa, come il Microchip linea dsPIC. Un dsPIC33F suona come una buona misura. A 40 MIPS, hai 1000 cicli di istruzioni per ogni campione a una frequenza di campionamento di 40 kHz. È molto e consentirà di aggiungere molti seni diversi a ciascun campione. L'hardware DSP ad accumulo multiplo consentirà di aggiungere facilmente ogni contributo con il proprio guadagno.
Segnali derivati digitalmente come questo non si spostano in frequenza o ampiezza e avranno un migliore rapporto segnale / rumore. Con numeri a 16 bit ottieni 96 dB. È fattibile in analogico se stai attento. Tuttavia, la precisione del segnale digitale sarà molto maggiore. Non c'è alcuna possibilità che i generatori di seno analogico possano essere entro 1 parte su 65000 per campione solo a causa dell'imprevedibilità dell'ampiezza. La frequenza dei segnali digitali può anche essere impostata in modo molto accurato e il sintetizzatore sinusoidale digitale non avrà bisogno di alcuni cicli per stabilizzarsi prima che la sua uscita sia quella che ti aspetti.
Modifica: chiarimento sulla generazione di seno
Vedo alcuni svantaggi della generazione del seno di ricerca in tabella menzionati in altre risposte che non sono corretti, quindi aggiungo ulteriori chiarimenti sul metodo qui. Sono state sollevate due obiezioni, accuratezza e risoluzione in frequenza.
Per prima cosa lasciatemi spiegare la struttura normale di una ricerca sinusoidale. Notare che un'onda sinusoidale è simmetrica a quattro vie. È quindi necessario memorizzare solo 1/4 ciclo. La forma d'onda di base del primo quadrante viene ripetuta invertita, negata o entrambe nei restanti tre 1/4 cicli. Un bel trucco per renderlo facile è esprimere l'angolo in modo tale che un cerchio completo sia una potenza di due, preferibilmente usando l'intera parola di qualunque macchina stia eseguendo il codice. Ciò significa che le aggiunte e le sottrazioni di angoli si avvolgono automaticamente attorno al cerchio senza codice esplicito a tale scopo se si esegue la matematica degli angoli in aritmetica di interi senza segno. Questa rappresentazione semplifica anche la ricerca nella tabella 1/4 wave.
I due bit alti dell'angolo indicano il quadrante, quindi solo i bit inferiori rimanenti vengono utilizzati per l'indice nella tabella. Se è impostato il bit dell'angolo più alto, il risultato della tabella viene negato. Se viene impostato il successivo bit più alto, la tabella viene indicizzata all'indietro. È semplice come completare i bit bassi rimanenti prima di usarli come indice. Non è necessario che la tabella abbia una dimensione tale che tutti i bit bassi possano essere usati come indice. Ad esempio su una macchina a 16 bit come un dsPIC, sarebbe naturale utilizzare 16 bit per l'angolo. Ciò lascia 14 bit da indicizzare nella tabella, che sarebbe una tabella molto grande. In genere, e in questo caso, non è necessaria una tabella così grande. Una dimensione ragionevole potrebbe essere 1024 segmenti, che utilizzerebbero 10 bit di indice. I restanti 4 bit di indice (in questo esempio) possono essere ignorati o utilizzati per interpolare tra voci adiacenti. La tabella avrebbe effettivamente 1025 voci, il che significa 1024 segmenti. Un'onda sinusoidale approssimata con 4096 (la tabella viene utilizzata 4 volte sull'intera onda sinusoidale) sarebbe abbastanza buona. Se i bit extra vengono utilizzati per interpolare tra voci di tabelle adiacenti, è ancora meglio. Immagina un'onda sinusoidale approssimata con 4096 segmenti lineari per ciclo. Sarebbe molto difficile vedere un errore.
Per quanto riguarda la precisione, fai i conti. Un'onda sinusoidale cambia più rapidamente ad angolo zero, quindi è facile calcolare l'errore del caso peggiore da una semplice ricerca in una tabella di 1024 punti. Il primo valore della tabella sarebbe 0 e il secondo seno (Pi / 2048) = 0,00153. L'errore del caso peggiore è quindi la metà di quello o .000767. Ciò equivale a un rapporto segnale / rumore di 62 dB, e questo è solo dalla scelta di un valore di tabella senza interpolazione. Utilizzando i restanti 4 bit di indice per l'interpolazione, il rapporto segnale / rumore aumenta a 86 dB. Se non è abbastanza buono, usa un numero più ampio per l'angolo e interpola usando i bit extra.
Anche la risoluzione in frequenza non è un problema. Apparentemente alcuni pensano che l'incremento dell'angolo per campione debba essere un multiplo dell'incremento dell'angolo per voce della tabella. Non è affatto vero. L'uso di un angolo di soli 16 bit e di una tabella di 1024 segmenti offre già una risoluzione angolare 16 volte superiore rispetto a ciascuna voce di tabella. In pratica probabilmente userei due parole (32 bit in questo esempio) per gli angoli e gli incrementi angolari. Ciò fornisce una risoluzione di frequenza molto elevata e offre anche più bit di interpolazione per aumentare il rapporto segnale / rumore. A una frequenza di campionamento di 40 kHz, un tono di 20 Hz (il caso peggiore) richiederebbe un incremento angolare di 1/2000 cerchio per campione. Questa è una parte su 33 che utilizza angoli a 16 bit. Questo da solo potrebbe essere sufficiente per molte applicazioni. Se si utilizza un angolo di 32 bit, la risoluzione in frequenza a 20 Hz è superiore a 1 parte su 2 milioni.
Quindi non ignoriamo così rapidamente la generazione di seno basata sulla ricerca nel firmware. Almeno non liquidiamolo per le ragioni sbagliate. Nota che nessuna delle cose che ho descritto sarebbe difficile da fare per un dsPIC. Ciò include l'interplazione poiché un dsPIC può moltiplicare da 16 x 16 a 32 bit in un singolo ciclo di istruzioni.