limite alla possibile modellatura del rumore?


9

Voglio fare il noise shaping in un'applicazione da 100kHz, 16 bit, in modo da spostare tutto il rumore di quantizzazione sulla banda 25khz-50kHz, con rumore minimo nella banda DC-25kHz.

Ho impostato matematica per creare un kernel del filtro errori di 31 campioni tramite l'apprendimento di rinforzo che funziona bene: dopo un po 'di apprendimento, posso ottenere un miglioramento di circa 16 dB del rumore ad alta frequenza per circa la stessa quantità di riduzione nella banda delle basse frequenze (il la linea centrale è il livello di rumore del dithering non modellato). Ciò è in linea con il teorema del noise shaping "Gerzon-Craven".

spettro di rumore risultante dopo un po 'di apprendimento

Ora al mio problema:

Non riesco a modellare il rumore ancora di più anche dopo un lungo apprendimento, sebbene il teorema di Gerzon-Craven non lo proibisca. Ad esempio, dovrebbe essere possibile ottenere una riduzione di 40 dB nella banda bassa e un miglioramento di 40 dB nella banda alta.

Quindi c'è un altro limite fondamentale che sto incontrando?

Ho provato a esaminare il teorema del rumore / campionamento / informazione di Shannon, ma dopo aver armeggiato per un po ', sono riuscito a ricavarne un solo limite: il teorema di Gerzon-Craven, che sembra essere un risultato diretto del teorema di Shannon.

Qualsiasi aiuto è apprezzato.

EDIT: maggiori informazioni

Prima di tutto, il kernel del filtro che produce il noise shaping sopra, Nota che il campione più recente si trova sul lato destro . Valori numerici del grafico a barre arrotondati a .01: {-0,16, 0,51, -0,74, 0,52, -0,04, -0,25, 0,22, -0,11, -0,02, 0,31, -0,56, 0,45, -0,13, 0,04, -0,14, 0,12, -0,06, 0,19, -0,22, -0,15, 0,4, 0,01, -0,41, -0,1, 0,84, -0,42, -0,81, 0,91, 0,75, -2,37, 2,29} (Non esattamente il carattere della barra ma produce una curva simile )

Filtro kernel, campione più recente su DESTRA.

Un'altra nota sull'implementazione del feedback degli errori:

Ho provato due diverse implementazioni del feedback degli errori. Innanzitutto ho confrontato il campione di output arrotondato con il valore desiderato e ho usato questa deviazione come errore. In secondo luogo ho confrontato il campione di output arrotondato con (input + feedback di errore). Sebbene entrambi i metodi producano kernel abbastanza diversi, entrambi sembrano livellarsi all'incirca alla stessa intensità del rumore. I dati pubblicati qui utilizzano la seconda implementazione.

Ecco il codice utilizzato per calcolare i campioni di onde digitalizzate. step è il passo per arrotondare. wave è la forma d'onda non digerita (in genere solo zeri quando non viene applicato alcun segnale).

TestWave[kernel_?VectorQ] := 
 Module[{k = kernel, nf, dith, signals, twave, deltas},
  nf = Length@k;
  dith = RandomVariate[TriangularDistribution[{-1, 1}*step], l];
  signals = deltas = Table[0, {l}];
  twave = wave;
  Do[
   twave[[i]] -= k.PadLeft[deltas[[;; i - 1]], nf];
   signals[[i]] = Round[twave[[i]] + dith[[i]], step];
   deltas[[i]] = signals[[i]] - twave[[i]];
   , {i, l}];
  signals
  ]

Il metodo di rinforzo:

Il "punteggio" viene calcolato osservando lo spettro di potenza del rumore. L'obiettivo è ridurre al minimo la potenza del rumore nella banda DC-25kHz. Io non penalizzare il rumore nella banda ad alta frequenza, in modo arbitrariamente elevato rumore non ci sarebbe punteggio diminuire. Sto introducendo rumore nei pesi del kernel per imparare. Forse, quindi, sono in un minimo locale (molto ampio e profondo), ma lo considero estremamente improbabile.

Confronto con il design standard del filtro:

Mathematica consente di generare filtri in modo iterativo. Questi possono avere un contrasto molto migliore di 36 dB quando viene tracciata la loro risposta in frequenza; fino a 80-100 dB. Valori numerici: {0.024, -0.061, -0.048, 0.38, -0.36, -0.808, 2.09, -0.331, -4.796, 6.142, 3.918, -17.773, 11.245, 30.613, -87.072, 113.676, -87.072, 30.613, 11.245 , -17.773, 3.918, 6.142, -4.796, -0.331, 2.09, -0.808, -0.36, 0.38, -0.048, -0.061, 0.024}

inserisci qui la descrizione dell'immagine

Tuttavia, quando si applicano quelli nell'attuale modellatura del rumore, essi sono (a) bloccati allo stesso contrasto di ~ 40dB, (b) funzionano peggio del filtro appreso senza effettivamente attenuare il rumore.

blu: filtro appreso, giallo: filtro equiripple out-of-box, NON spostato ... è davvero peggio


2
+1, domanda molto interessante. Hai provato ad aumentare l'ordine del filtro oltre i 31 tocchi? La soppressione di 40 dB suona un po 'alta per una FIR a 31 tocchi.
A_A

1
@ Olli, non credo di aver capito completamente. Posso pubblicare il kernel del filtro se questo è ciò che ti interessa. In parole schiette, ci sono pesi oscillatori che costringono l'errore ad un'alternativa -> lo sposta alle alte frequenze.
Tobalt,

2
@tobalt dal design del filtro "classico", è un risultato atteso che i filtri più lunghi siano più ripidi e / o abbiano più attenuazione nella banda di arresto e / o abbiano meno ondulazioni nella banda di passaggio. Ora, la mia ipotesi è che il tuo metodo di rinforzo premia la pendenza più dell'attenuazione dopo un certo punto; qual è il metodo che usi per rinforzare?
Marcus Müller,

1
Potresti dare un'occhiata alla sezione Filter Design di Mathematica. Forse puoi semplicemente definire le specifiche del tuo filtro e utilizzare una delle tecniche esistenti per restituire un filtro che le soddisfi.
A_A

1
Quindi questo è sicuramente il design del filtro (facoltativamente iterativo). Ottieni le tue specifiche di filtro (esattamente come le hai pubblicate qui) e prova a creare un filtro tramite questa funzione (la più semplice del suo tipo) e vedi cosa ne viene fuori. Sarebbe bello vedere i coefficienti con cui la funzione si presenta rispetto a quelli con cui ritorna l'apprendimento di rinforzo. Inoltre, nota il tipo di ordine di filtro che viene fuori, suppongo che sarebbe superiore a 31. A proposito, deve essere "adattivo" al segnale?
A_A

Risposte:


12

Dithering di base senza riduzione del rumore

La quantizzazione di base con retinatura senza modellazione del rumore funziona in questo modo:


Figura 1. Diagramma del sistema di quantizzazione di base con retinatura. Il rumore è un dithering triangolare a media zero con un valore assoluto massimo di 1. L'arrotondamento corrisponde all'intero più vicino. L'errore residuo è la differenza tra output e input ed è calcolato solo per analisi.

11214

Con un errore residuo additivo indipendente avremmo un modello più semplice del sistema:


Figura 2. Approssimazione della quantizzazione dithered di base. L'errore residuo è il rumore bianco.

Nel modello approssimativo l'uscita viene semplicemente immessa più un errore residuo di rumore bianco indipendente.

Dithering con modellatura del rumore

Non riesco a leggere molto bene Mathematica, quindi al posto del tuo sistema analizzerò il sistema da Lipshitz et al. " Riduzione del rumore minimamente udibile " J. Audio Eng. Soc., Vol.39, No.11, Novembre 1991:

Sistema Lipshitz et al 1991
Figura 3. Lipshitz et al. 1991 schema di sistema (adattato dalla loro Fig. 1). Il filtro (in corsivo nel testo) include al suo interno un ritardo di un campione in modo che possa essere utilizzato come filtro di feedback degli errori. Il rumore è dither triangolare.

Se l'errore residuo è indipendente dai valori attuali e passati del segnale A, abbiamo un sistema più semplice:


Figura 4. Un modello approssimativo di Lipshitz et al. Sistema 1991. Il filtro è lo stesso di Fig. 3 e include al suo interno un ritardo di un campione. Non viene più utilizzato come filtro di feedback. L'errore residuo è il rumore bianco.

In questa risposta lavorerò con il modello approssimativo più facilmente analizzabile (Fig. 4). Nell'originale Lipshitz et al. Sistema 1991, Filter ha una forma di filtro generico di risposta all'impulso infinito (IIR) che copre sia i filtri IIR che i filtri FIR (risposta all'impulso finita). Di seguito supponiamo che Filter sia un filtro FIR, poiché credo sulla base dei miei esperimenti con i tuoi coefficienti che è quello che hai nel tuo sistema. La funzione di trasferimento di Filter è:

HFiolter(z)=-B1z-1-B2z-2-B3z-3-...

z-1

H(z)=1-HFiolter(z)=1+B1z-1+B2z-2+B3z-3+....

...,-B3,-B2,-B11,B1,B2,B3,...B0=1horzcatnello script Octave di seguito), e infine l'elenco è invertito (da flip):

pkg load signal
b = [-0.16, 0.51, -0.74, 0.52, -0.04, -0.25, 0.22, -0.11, -0.02, 0.31, -0.56, 0.45, -0.13, 0.04, -0.14, 0.12, -0.06, 0.19, -0.22, -0.15, 0.4, 0.01, -0.41, -0.1, 0.84, -0.42, -0.81, 0.91, 0.75, -2.37, 2.29];
c = flip(horzcat(-b, 1));
freqz(c)
zplane(c)

Lo script traccia la risposta in frequenza di magnitudo e le posizioni zero del filtro di modellatura del rumore completo:

Trama di Freqz
Figura 5. Risposta in frequenza magnitudo dell'intero filtro di modellatura del rumore.

Trama Zplane
×

Penso che il problema di trovare i coefficienti di filtro possa essere riformulato come il problema di progettare un filtro di fase minima con un coefficiente iniziale di 1. Se ci sono limitazioni intrinseche alla risposta in frequenza di tali filtri, allora queste limitazioni vengono trasferite a limitazioni equivalenti nella modellatura del rumore che utilizza tali filtri.

Conversione dal design all-pole in FIR a fase minima

Una procedura per la progettazione di filtri diversi ma per molti aspetti equivalenti è descritta in Stojanović et al. , "Progettazione di filtri digitali ricorsivi interamente polari basata su polinomi ultraspherical", Radioingegneria, vol 23, n. 3, settembre 2014. Calcolano i coefficienti del denominatore della funzione di trasferimento di un filtro passa-basso tutti i poli IIR. Quelli hanno sempre un coefficiente denominatore principale di 1 e hanno tutti i poli all'interno del cerchio dell'unità, un requisito per filtri IIR stabili. Se tali coefficienti vengono utilizzati come coefficienti del filtro di modellatura del rumore FIR in fase minima, forniranno una risposta in frequenza passa-alto invertita rispetto al filtro IIR passa-basso (i coefficienti del denominatore della funzione di trasferimento diventano coefficienti numeratori). Nella tua notazione è un insieme di coefficienti da quell'articolo {-0.0076120, 0.0960380, -0.5454670, 1.8298040, -3.9884220, 5.8308660, -5.6495140, 3.3816780}, che potrebbe essere testato per l'applicazione del noise shaping anche se non è esattamente alla specifica:

Risposta in frequenza
Figura 7. Risposta in frequenza di magnitudo del filtro FIR usando i coefficienti di Stojanović et al. Il 2014.

Trama polo zero
Figura 8. Grafico a polo zero del filtro FIR che utilizza coefficienti di Stojanović et al. Il 2014.

La funzione di trasferimento a tutti i poli è:

H(z)=11+un'1z-1+un'2z-2+un'3z-3+...

un'B

Per progettare un filtro onnipolare e convertirlo in un filtro FIR di fase minima, non sarà possibile utilizzare i metodi di progettazione del filtro IIR che partono da un filtro prototipo analogico e mappano i poli e gli zeri nel dominio digitale usando la trasformazione bilineare . Ciò include cheby1, cheby2e ellipin Octave e Python's SciPy. Questi metodi daranno zeri lontano dall'origine del piano z, quindi il filtro non sarà del tipo a tutti i poli richiesto.

Risposta alla domanda teorica

Se non ti interessa quanto rumore ci sarà alle frequenze sopra il quarto della frequenza di campionamento, allora Lipshitz et al. 1991 risponde direttamente alla tua domanda:

Per tali funzioni di ponderazione, che vanno a zero su parte della banda, non vi è alcun limite teorico alla riduzione ponderata della potenza del rumore ottenibile dal circuito di Fig. 1. Questo sarebbe il caso se, ad esempio, si supponga che il l'orecchio ha una sensibilità zero tra, diciamo, 20 kHz e la frequenza di Nyquist e sceglie la funzione di ponderazione per riflettere questo fatto.

La loro figura 1 mostra un noise shaper con una struttura di filtro IIR generica con poli e zeri, così diversa dalla struttura FIR che hai al momento, ma ciò che dicono vale anche per quello, perché una risposta all'impulso del filtro FIR può essere reso arbitrariamente vicino alla risposta all'impulso di ogni dato filtro IIR stabile.

Script di ottava per la progettazione di filtri

ν=0dip

pkg load signal
N = 14; #number of taps including leading tap with coefficient 1
att = 97.5; #dB attenuation of Dolph-Chebyshev window, must be positive
dip = 2; #spectrum lift-up multiplier, must be above 1
c = chebwin(N, att);
c = conv(c, c);
c /= sum(c);
c(N) += dip*10^(-att/10);
r = roots(c);
j = (abs(r(:)) <= 1);
r = r(j);
c = real(poly(r));
c .*= (-1).^(0:(N-1)); #if this complains, then root finding has probably failed
freqz(c)
zplane(c)
printf('%f, ', flip(-c(2:end))), printf('\n'); #tobalt's format

Inizia con una finestra Dolph-Chebyshev come coefficienti, la avvolge con se stessa per raddoppiare gli zeri della funzione di trasferimento, aggiunge al tocco centrale un numero che "alza" la risposta in frequenza (considerando che il tocco centrale è a zero) che è ovunque positivo, trova gli zeri, rimuove gli zeri che si trovano al di fuori del cerchio unitario, converte gli zeri in coefficienti (il coefficiente iniziale polyè sempre 1) e lancia il segno di ogni secondo coefficiente per rendere il filtro passa alto . I risultati di (una versione precedente ma quasi equivalente) dello script sembrano promettenti:

Risposta in frequenza di magnitudo
Figura 9. Risposta in frequenza di magnitudo del filtro dalla (una versione precedente ma quasi equivalente) dello script precedente.

Trama polo zero
Figura 10. Grafico polo-zero del filtro dalla (una versione precedente ma quasi equivalente) dello script precedente.

I coefficienti di (una versione precedente ma quasi equivalente) lo script di cui sopra nella vostra notazione: {0.357662, -2.588396, 9.931419, -26.205448, 52.450624, -83.531276, 108.508775, -116.272581, 102.875781, -74.473956, 43.140431, -19.131434, 5.923468}. I numeri sono grandi che potrebbero portare a problemi numerici.

Implementazione in ottava del noise shaping

Alla fine, ho realizzato la mia implementazione del noise shaping in Octave e non ho avuto problemi come te. Sulla base della nostra discussione nei commenti, penso che il limite nella tua implementazione sia stato che lo spettro del rumore è stato valutato usando una finestra rettangolare nota come "senza finestre", che ha riversato lo spettro ad alta frequenza alle basse frequenze.

pkg load signal
N = length(c);
M = 16384; #signal length
input = zeros(M, 1);#sin(0.01*(1:M))*127;
er = zeros(M, 1);
output = zeros(M, 1);
for i = 1:M
  A = input(i) + er(i);
  output(i) = round(A + rand() - rand());
  for j = 2:N
    if (i + j - 1 <= M)
      er(i + j - 1) += (output(i) - A)*c(j);
    endif
  endfor
endfor
pwelch(output, max(nuttallwin(1024), 0), 'semilogy');

inserisci qui la descrizione dell'immagine
Figura 11. Analisi spettrale del rumore di quantizzazione dall'implementazione dell'ottava sopra di noise shaping per segnale di input zero costante. Asse orizzontale: frequenza normalizzata. Nero: nessun noise shaping ( c = [1];), rosso: il filtro originale, blu: il filtro della sezione "Octave script for design del filtro".

Dominio del tempo di prova alternativo
Figura 12. Uscita nel dominio del tempo dall'implementazione dell'ottava sopra di noise shaping per segnale di input zero costante. Asse orizzontale: numero campione, asse verticale: valore campione. Rosso: il filtro originale, blu: il filtro dalla sezione "Script di ottava per la progettazione del filtro".

Il filtro di modellatura del rumore più estremo (blu) produce valori di campionamento di uscita quantizzati molto grandi anche per l'ingresso zero.


1
@MattL. All'inizio ho pensato erroneamente che Tobalt avesse un filtro tutto polare. Ho riscritto la mia risposta quando mi sono reso conto che si tratta di un filtro FIR con il primo coefficiente 1. Anche Gerzon-Craven dice che il filtro deve essere una fase minima per essere ottimale, e i coefficienti ottimizzati di Tobalt forniscono anche un filtro di fase minimo. Tali requisiti sono equivalenti a quelli dei coefficienti dei filtri polari IIR, quindi suggerisco di prendere in prestito metodi di progettazione da lì. Un IIR standard sarebbe anche un'opzione.
Olli Niemitalo,

1
Ho isolato l'errore: la mia implementazione produce la stessa forma d'onda (nel tempo) della tua. Tuttavia, la funzione Abs [Fourier [wave]] sembra imbattersi in un overflow / underflow interno, perché lo spettro restituito sembra diverso (piano superiore)
Tobalt

1
@Olli Niemitalo Ok, sembra che la FFT in ottava usi forse il windowing automatico? Dopo aver applicato una finestra di Hann alla forma d'onda posso ottenere FFT "corretti". Proverò brevemente l'integrità di questo approccio e alla fine continuerò l'apprendimento e pubblicherò il risultato. Grazie per tutti i tuoi sforzi. Ho contrassegnato il tuo post come risposta.
Tobalt,

1
@ robertbristow-johnson Penso che sia tutto coerente così com'è. Ho rimosso un'equazione in cui H (z) era per un filtro ricorsivo con 1 come numeratore. Ma è un filtro FIR nel caso di Tobalt. Ho il sospetto che potresti pensare che diventi un filtro ricorsivo perché esiste un ciclo di feedback. Ma la quantizzazione con dithering è nel loop e sta tagliando il percorso dall'uscita del filtro al residuo.
Olli Niemitalo,

1
un'B
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.