Dithering básico sin conformación de ruido
La cuantización básica difuminada sin conformación de ruido funciona así:
Figura 1. Diagrama básico del sistema de cuantificación diferida. El ruido es un tramado triangular de media cero con un valor absoluto máximo de 1. El redondeo es al entero más cercano. El error residual es la diferencia entre salida y entrada, y se calcula solo para análisis.
El tramado triangular aumenta la varianza del error residual resultante en un factor de 3 (de a ) pero desacopla la media y la varianza del error de cuantificación neta del valor de la señal de entrada. Eso significa que la señal de error neta no está correlacionada con la entrada, pero los momentos más altos no están desacoplados, por lo que no es un error aleatorio completamente independiente, pero nadie ha determinado que las personas puedan escuchar cualquier dependencia de los momentos más altos en la señal de error neta en el señal de entrada en una aplicación de audio.11214
Con un error residual aditivo independiente tendríamos un modelo más simple del sistema:
Figura 2. Aproximación de la cuantización básica difusa. El error residual es ruido blanco.
En el modelo aproximado, la salida es simplemente entrada más error residual de ruido blanco independiente.
Dithering con forma de ruido
No puedo leer Mathematica muy bien, así que en lugar de su sistema, analizaré el sistema de Lipshitz et al. " Forma de ruido mínimamente audible " J. Audio Eng. Soc., Vol.39, No.11, noviembre de 1991:
Figura 3. Lipshitz et al. Diagrama del sistema de 1991 (adaptado de su Fig. 1). El filtro (en cursiva en el texto) incluye una demora de una muestra para que pueda usarse como un filtro de retroalimentación de error. El ruido es dither triangular.
Si el error residual es independiente de los valores actuales y pasados de la señal A, tenemos un sistema más simple:
Figura 4. Un modelo aproximado de Lipshitz et al. Sistema de 1991. El filtro es el mismo que en la Fig. 3 e incluye en él una demora de una muestra. Ya no se usa como filtro de retroalimentación. El error residual es ruido blanco.
En esta respuesta trabajaré con el modelo aproximado más fácil de analizar (Fig. 4). En el original Lipshitz et al. Sistema 1991, Filter tiene una forma de filtro genérico de respuesta de impulso infinito (IIR) que cubre tanto los filtros de respuesta de impulso finito (FIR) como IIR. A continuación, supondremos que Filter es un filtro FIR, ya que creo, según mis experimentos con sus coeficientes, que eso es lo que tiene en su sistema. La función de transferencia de Filter es:
HFilter(z)=−b1z−1−b2z−2−b3z−3−…
El factor representa un retraso de una muestra. En el modelo aproximado también hay una ruta de suma directa a la salida del error residual. Esto se resume con la salida negada del filtro , formando la función de transferencia del filtro de conformación de ruido completo:z−1
H(z)=1−HFilter(z)=1+b1z−1+b2z−2+b3z−3+….
Para ir desde sus coeficientes de filtro , que enumera en orden , a los coeficientes polinomiales la función de transferencia de filtro de conformación de ruido completo , el signo de los coeficientes se cambia para tener en cuenta la negación de la salida del filtro en el diagrama del sistema, y el coeficiente se agrega al final (por en el script de octava a continuación), y finalmente se invierte la lista (por ): 1 , b 1 , b 2 , b 3 , … b 0 = 1…,−b3,−b2,−b11,b1,b2,b3,…b0=1horzcat
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)
El script traza la respuesta de frecuencia de magnitud y las ubicaciones cero del filtro de conformación de ruido completo:
Figura 5. Respuesta de frecuencia de magnitud del filtro de conformación de ruido completo.
Figura 6. Gráfico del plano Z de polos ( ) y ceros ( ) del filtro. Todos los ceros están dentro del círculo unitario, por lo que el filtro de conformación de ruido completo es de fase mínima.∘×∘
Creo que el problema de encontrar los coeficientes de filtro puede reformularse como el problema de diseñar un filtro de fase mínima con un coeficiente principal de 1. Si existen limitaciones inherentes a la respuesta de frecuencia de dichos filtros, estas limitaciones se transfieren a limitaciones equivalentes en forma de ruido que usa tales filtros.
Conversión del diseño de todos los polos a FIR de fase mínima
Un procedimiento para el diseño de filtros diferentes pero en muchos sentidos equivalentes se describe en Stojanović et al. , "Diseño de filtros digitales recursivos de todos los polos basado en polinomios ultraesféricos", Radioengineering, vol 23, no 3, septiembre de 2014. Calculan los coeficientes del denominador de la función de transferencia de un filtro de paso bajo de todos los polos IIR. Esos siempre tienen un coeficiente de denominador principal de 1 y tienen todos los polos dentro del círculo unitario, un requisito de filtros IIR estables. Si esos coeficientes se usan como coeficientes del filtro de conformación de ruido FIR de fase mínima, darán una respuesta de frecuencia de paso alto invertida en comparación con el filtro IIR de paso bajo (los coeficientes del denominador de la función de transferencia se convierten en coeficientes numeradores). En su notación, un conjunto de coeficientes de ese artículo es {-0.0076120, 0.0960380, -0.5454670, 1.8298040, -3.9884220, 5.8308660, -5.6495140, 3.3816780}
, que podría probarse para la aplicación de modelado de ruido, aunque no es exactamente la especificación:
Figura 7. Respuesta de frecuencia de magnitud del filtro FIR utilizando coeficientes de Stojanović et al. 2014.
Figura 8. Gráfico de polo cero del filtro FIR utilizando coeficientes de Stojanović et al. 2014.
La función de transferencia de todos los polos es:
H(z)=11+a1z−1+a2z−2+a3z−3+…
Por lo tanto, se puede diseñar un establo IIR filtro paso-bajo de todos los polos y utilizar los coeficientes coeficientes para obtener un filtro de paso alto FIR de fase mínima con un coeficiente principal de 1.bab
Para diseñar un filtro de todos los polos y convertirlo en un filtro FIR de fase mínima, no podrá utilizar métodos de diseño de filtros IIR que comiencen desde un filtro prototipo analógico y mapeen los polos y ceros en el dominio digital usando la transformación bilineal . Eso incluye cheby1
, cheby2
y ellip
en Octave and Python's SciPy. Estos métodos darán ceros lejos del origen del plano z para que el filtro no sea del tipo de todos los polos requerido.
Respuesta a la pregunta teórica.
Si no le importa cuánto ruido habrá en frecuencias superiores a la cuarta parte de la frecuencia de muestreo, entonces Lipshitz et al. 1991 aborda su pregunta directamente:
Para tales funciones de ponderación, que van a cero en una parte de la banda, no existe un límite teórico para la reducción de potencia de ruido ponderada obtenible del circuito de la Fig. 1. Este sería el caso si, por ejemplo, se supone que el ear tiene una sensibilidad cero entre, digamos, 20 kHz y la frecuencia de Nyquist, y elige la función de ponderación para reflejar este hecho.
Su Fig 1. muestra un modelador de ruido con una estructura de filtro IIR genérica con polos y ceros, tan diferente a la estructura FIR que tiene en este momento, pero lo que dicen también se aplica a eso, porque una respuesta de impulso del filtro FIR puede ser hecho arbitrariamente cerca de la respuesta al impulso de cualquier filtro IIR estable dado.
Script de octava para diseño de filtro
Aquí hay una secuencia de comandos Octave para el cálculo del coeficiente por otro método que creo que es equivalente al Stojanovici et al. Método 2014 parametrizado como con la elección correcta de mi parámetro.ν=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
Comienza con una ventana Dolph-Chebyshev como los coeficientes, lo convoluciona consigo mismo para duplicar los ceros de la función de transferencia, agrega al toque medio un número que "eleva" la respuesta de frecuencia (considerando que el toque medio está en tiempo cero) que es positivo en todas partes, encuentra los ceros, elimina los ceros que están fuera del círculo unitario, convierte los ceros nuevamente en coeficientes (el coeficiente inicial de poly
siempre es 1) y cambia el signo de cada segundo coeficiente para hacer que el filtro pase alto . Los resultados de (una versión anterior pero casi equivalente) del script parecen prometedores:
Figura 9. Respuesta de frecuencia de magnitud del filtro de (una versión anterior pero casi equivalente de) el script anterior.
Figura 10. Gráfico de polo cero del filtro de (una versión anterior pero casi equivalente) del script anterior.
Los coeficientes de (una versión más antigua, pero casi equivalente a) la secuencia de comandos en su notación: {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}
. Los números son grandes, lo que podría conducir a problemas numéricos.
Implementación de octava de modelado de ruido
Finalmente, hice mi propia implementación de modelado de ruido en Octave y no tengo problemas como tú. En base a nuestra discusión en los comentarios, creo que la limitación en su implementación fue que el espectro de ruido se evaluó utilizando una ventana rectangular, también conocida como "sin ventanas", que derramó el espectro de alta frecuencia a las bajas frecuencias.
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. Análisis espectral de ruido de cuantificación de la implementación de octava anterior de conformación de ruido para señal de entrada cero constante. Eje horizontal: frecuencia normalizada. Negro: sin forma de ruido ( c = [1];
), rojo: su filtro original, azul: el filtro de la sección "Script de octava para el diseño del filtro".
Figura 12. Salida en el dominio del tiempo de la implementación de octava anterior de conformación de ruido para señal de entrada cero constante. Eje horizontal: número de muestra, eje vertical: valor de muestra. Rojo: su filtro original, azul: el filtro de la sección "Script de octava para diseño de filtro".
El filtro de conformación de ruido más extremo (azul) da como resultado valores de muestra de salida cuantificados muy grandes incluso para entrada cero.