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:
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 è:
HF i l t e r( z) = - b1z- 1- b2z- 2- b3z- 3- ...
z- 1
H( z) = 1 - HF i l t e r( z) = 1 + b1z-1+ b2z-2+ b3z-3+ … .
... , - b3, - b2, - b11 , b1, b2, b3, ...B0= 1horzcat
nello 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:
Figura 5. Risposta in frequenza magnitudo dell'intero filtro di modellatura del rumore.
×∘
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:
Figura 7. Risposta in frequenza di magnitudo del filtro FIR usando i coefficienti di Stojanović et al. Il 2014.
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 + a1z- 1+ a2z- 2+ a3z- 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
, cheby2
e ellip
in 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:
Figura 9. Risposta in frequenza di magnitudo del filtro dalla (una versione precedente ma quasi equivalente) dello script precedente.
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');
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".
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.