La fase de la sinusoide no importa: un cambio de fase de una sinusoide es equivalente a desplazarlo en el tiempo, lo que resulta en un cambio de tiempo tanto de la sinusoide cuantificada como del error de cuantificación. El espectro de potencia es invariable a los cambios de tiempo . Elegimos trabajar con sinusoide .Acos(x)
Óptima por def. 1
De manera equivalente a maximizar la relación señal / ruido (SNR), podemos minimizar el error de cuantificación del cuadrado medio raíz en relación con el cuadrado medio raíz de la sinusoide, . Es suficiente hacer el análisis en el primer cuarto de período de la onda cosenoidal, porque el resto de la onda cosenoidal y el error de cuantificación son idénticos a su primer cuarto trimestre hasta un cambio de signo y / o inversión de tiempo. Deje estar en el primer cuarto de la onda cosenoidal, . A lo largo de las líneas de la ecuación. 2 de mi respuesta a una pregunta relacionada , la onda coseno cuantificada alcanza un valor entero cuando:1/2−−−√ARRMSE = 1/SNR−−−−−−√x0<x<π/2k∈0…round(A)
0<x<acos(round(A)−0.5A),acos(k+0.5A)<x<acos(k−0.5A),acos(0.5A)<x<π2,if k=round(A),if 1≤k≤round(A)−1,if k=0.(1)
Cada valor de da al error cuadrático medio relativo una contribución aditiva de:kRelMSE
2M S EkUNA2=2UNA21π/ 2∫X1X0 0( Acos( x ) - k)2rex =2 pecado(X1)cos(x1)−2sin(x0)cos(x0)π+8k(sin(x0)−sin(x1))πA+4k2(x1−x0)πA2+2x1−2x0π,(2)
donde y denotan, como se define por separado para cada , los límites dados por la ecuación. 1. El error de cuantificación cuadrático medio relativo total es entonces:x0x1kx0<x<x1
RelMSE=2MSEA2=∑k=0round(A)2MSEkA2=2asin(12A)π−4A2−1−−−−−−√2πA2−(2A2+4round(A)2)asin(2round(A)−12A)πA2−(6round(A)+1)4A2−(2round(A)−1)2−−−−−−−−−−−−−−−−−−−√−2π(A2+2round(A)2)2πA2+1πA2∑k=1round(A)−1((2A2+4k2)(asin(2k+12A)−asin(2k−12A))+(6k−1)4A2−(2k+1)2−−−−−−−−−−−−−√−(6k+1)4A2−(2k−1)2−−−−−−−−−−−−−√2),A>0.5.(3)
Para la optimización por definición 1, la tarea es encontrar el valor de que minimice el error de cuantificación cuadrático medio relativo RRMSE . bajo la restricción . Eq. 3 se pueden evaluar en Python utilizando la biblioteca de precisión arbitraria:UNA=R e l M S E-------√A ≤2m - 1- 0.5mpmath
import mpmath as mp
def RelMSE(A): # valid for A >= 0.5
A = mp.mpf(A)
return 2*mp.asin(1/(2*A))/mp.pi - mp.sqrt(4*A**2-1)/(2*mp.pi*A**2) - (2*A**2 + 4*mp.floor(A + 0.5)**2)*mp.asin((2*mp.floor(A + 0.5) - 1)/(2*A))/(mp.pi*A**2) - ((6*mp.floor(A + 0.5) + 1)*mp.sqrt(4*A**2 - (2*mp.floor(A + 0.5) - 1)**2) - 2*mp.pi*(A**2 + 2*mp.floor(A + 0.5)**2))/(2*mp.pi*A**2) + mp.nsum(lambda k: (2*A**2 + 4*k**2)*(mp.asin((2*k+1)/(2*A)) - mp.asin((2*k-1)/(2*A))) + ((6*k-1)*mp.sqrt(4*A**2 - (2*k + 1)**2) - (6*k + 1)*mp.sqrt(4*A**2 - (2*k - 1)**2))/2, [1, mp.floor(A + 0.5)-1])/(mp.pi*A**2)
RRMSE parece tener un mínimo local entre cada par de enteros sucesivos (Fig. 1).UNA
Figura 1. RRMSE (línea sólida azul y cuadrados azules) y su aproximación (naranja línea discontinua) sobre la base de la varianza de una distribución uniforme de la anchura de 1, para diferentes gamas de .1 / 6---√/A1/12A
Una selección de óptima se dan en la Tabla 1 junto con el RRMSE resultante, también para algunos otros valores comunes de . En mayor , la reducción de RRMSE por la elección óptima será marginal. La siguiente secuencia de comandos de Python (continuación) puede generar las entradas de la tabla, que muestran solo dígitos que son iguales entre dos cálculos utilizando diferentes configuraciones de precisión, cuya ejecución tomó días:AAm
def approx_optimal_A(m):
m = mp.mpf(m)
return 2**(m-1) - 1 + mp.mpf("0.156936321399") + mp.exp(-1.2749819017 - 0.3464088917*m) # Eq. 8
# return 2**(m-1) - 1 # This less informed guess gives identical results but slower convergence
def to_max_digits(f, prec_1, prec_2, max_digits): # return the at most max_digits digits of function f that are agreed about by both precision settings
prec = mp.mp.prec
mp.mp.prec = prec_1
y_prec_1 = f()
mp.mp.prec = prec_2
y_prec_2 = f()
digits = max_digits
while mp.nstr(y_prec_1, digits, strip_zeros=False) != mp.nstr(y_prec_2, digits, strip_zeros=False): # Beware: a possible infinite loop
digits -= 1
return mp.nstr(y_prec_2, digits, strip_zeros=False)
prec = mp.mp.prec
double_digits = 15 # Print at most this many digits
dB_digits = 9
for m in range(2, 25):
optimal_A = to_max_digits(lambda: mp.findroot(lambda A: mp.diff(RelMSE, A), approx_optimal_A(m)), 80, 100, double_digits)
RelMSE_optimal = to_max_digits(lambda: 10*mp.log10(RelMSE(mp.mpf(optimal_A))), 80, 100, dB_digits)
RelMSE_1 = to_max_digits(lambda: 10*mp.log10(RelMSE(2**(m-1)-1)), 80, 100, dB_digits)
RelMSE_2 = to_max_digits(lambda: 10*mp.log10(RelMSE(2**(m-1)-0.5)), 80, 100, dB_digits)
print(str(m)+"&"+optimal_A+"&"+RelMSE_optimal+"&"+RelMSE_1+"&"+RelMSE_2+"\\\\")
Tabla 1. Óptimo por definición 1 para diferentes y el RRMSE resultante, con el RRMSE para algunas opciones comunes de enumeradas para comparación. se ha dejado de lado porque no puede ser manejado por la ecuación. 3 y porque un solo bit no representa ningún número positivo como representación de complemento a dos. Tenga en cuenta que RRMSE en dB se convierte en SNR en dB mediante un cambio de signo, porque .Am≤24Am=1SNR = 1/RelMSE = 1/RRMSE2
m23456789101112131415161718192021222324optimal A1.268279494615303.238009421210377.2165859792940715.200718133195531.188875671425763.1800835394190127.173613625523255.168894736361511.1654791888901023.163022053772047.161262644844095.160007225168191.1591137160116383.158478966632767.158028642865535.1577094659131071.157483397262143.157323352524287.1572100891048575.157129952097151.157073264194303.157033178388607.15700481RRMSE (dB)A=optimal−11.1128053−18.8206937−25.5167673−31.8127094−37.9364880−43.9858910−50.0049518−56.0134743−62.0200022−68.0278661−74.0380590−80.0505958−86.0651409−92.0812822−98.0986407−104.116904−110.135830−116.155234−122.174984−128.194979−134.215150−140.235446−146.2558312m−1−1−8.92729805−17.9588863−25.0903048−31.5775537−37.7977883−43.9001114−49.9500053−55.9773382−61.9957638−68.0113689−74.0267095−80.0427267−86.0596541−92.0774410−98.0959437−104.115007−110.134493−116.154291−122.174318−128.194509−134.214818−140.23521−146.25572m−1−0.5−10.1764645−17.8882004−24.7375654−31.2013629−37.4726954−43.6414308−49.7527817−55.8307200−61.8884975−67.9337180−73.9708981−80.0028089−86.0312009−92.0572079−98.0815798−104.104821−110.127276−116.149181−122.170701−128.191950−134.213008−140.233931−146.25476
Óptima por def. 2
Una función periódica como una sinusoide cuantificada tiene una serie de Fourier; es una suma de sinusoides armónicos, es decir, sinusoides de frecuencias armónicas de una frecuencia fundamental. Los sinusoides armónicos son ortogonales. Por lo tanto, el cuadrado medio de la función periódica es igual a la suma de los cuadrados medios de las sinusoides armónicas. El cuadrado medio de la suma de los armónicos no fundamentales se puede calcular restando el cuadrado medio del fundamental del cuadrado medio de la función periódica. Para una onda coseno cuantizada esto permite calcular la distorsión armónica total (THD) como:round(Acos(x))
THD=MS−a21/2a21/2−−−−−−−−−√=MSa21/2−1−−−−−−−−√,(4)
donde MS es el cuadrado medio de la onda coseno cuantificada, es el cuadrado medio del fundamental y es el coeficiente del coseno de frecuencia fundamental en la serie de Fourier de , calculado usando la ecuación. 3 de mi respuesta a una pregunta relacionada y simplificando a:a21/2a1round(Acos(x))
a1=2πA(round(A)4A2−(2round(A)−1)2−−−−−−−−−−−−−−−−−−−−√+∑k=1round(A)−1k(4A2−(2k−1)2−−−−−−−−−−−−−√−4A2−(2k+1)2−−−−−−−−−−−−−√)).(5)
El cuadrado medio de la onda coseno cuantificada se calcula en su primer trimestre por:
MS=1π/2∫π/20round(Acos(x))2dx=round(A)2π/2acos(round(A)−0.5A)+1π/2∑k=1round(A)−1k2(acos(k−0.5A)−acos(k+0.5A))(6)
THD se calcula y minimiza mediante el siguiente script de Python (continuación), utilizando Eqs. 4, 5 y 6:
def a_1(A):
A = mp.mpf(A)
return 2*(mp.floor(A + 0.5)*mp.sqrt(4*A**2 - (2*mp.floor(A + 0.5) - 1)**2) + mp.nsum(lambda k: k*(mp.sqrt(4*A**2 - (2*k - 1)**2)-mp.sqrt(4*A**2 - (2*k + 1)**2)), [1, mp.floor(A + 0.5) - 1]))/(mp.pi*A)
def MS(A):
A = mp.mpf(A)
return mp.floor(A + 0.5)**2*mp.acos((mp.floor(A + 0.5)-0.5)/A)/(mp.pi/2) + mp.nsum(lambda k: k**2*(mp.acos((k - 0.5)/A) - mp.acos((k + 0.5)/A)), [1, mp.floor(A + 0.5) - 1])/(mp.pi/2)
def STHD(A): # Square of THD
MS_1 = a_1(A)**2/2
return MS(A)/MS_1 - 1
for m in range(2, 25):
optimal_A = to_max_digits(lambda: mp.findroot(lambda A: mp.diff(STHD, A), approx_optimal_A(m)), 80, 100, double_digits)
B = to_max_digits(lambda: a_1(mp.mpf(optimal_A)), 80, 100, double_digits)
THD_optimal = to_max_digits(lambda: 10*mp.log10(STHD(mp.mpf(optimal_A))), 80, 100, dB_digits)
THD_1 = to_max_digits(lambda: 10*mp.log10(STHD(2**(m-1)-1)), 80, 100, dB_digits)
THD_2 = to_max_digits(lambda: 10*mp.log10(STHD(2**(m-1)-0.5)), 80, 100, dB_digits)
print(str(m)+"&"+optimal_A+"&"+B+"&"+THD_optimal+"&"+THD_1+"&"+THD_2+"\\\\")
Figura 2. THD (dB) como función de la amplitud no cuantificada . Los máximos locales se encuentran en amplitudes que provocan que una protuberancia estrecha sobresalga en los extremos de la sinusoide cuantificada.A
Figura 3. Amplitud (línea continua azul) de la frecuencia fundamental en la cuantificación de una onda cosenoidal de amplitud , con la línea de identidad (línea discontinua naranja) trazada como referencia.a1A
Tabla 2. Óptimo por definición 2 para diferentes y el THD resultante, con el THD para algunas opciones comunes de enumeradas para comparación. Sorprendentemente, THD se minimiza con la misma que maximiza la SNR (Tabla 1), también cuando se prueba con una precisión mucho mayor que la que se muestra aquí. Si se considera que la señal es una sinusoide de amplitud lugar de la amplitud , los valores de SNR se obtienen volteando el signo de los valores de THD.Am≤24AAa1A
m23456789101112131415161718192021222324optimal A1.268279494615303.238009421210377.2165859792940715.200718133195531.188875671425763.1800835394190127.173613625523255.168894736361511.1654791888901023.163022053772047.161262644844095.160007225168191.1591137160116383.158478966632767.158028642865535.1577094659131071.157483397262143.157323352524287.1572100891048575.157129952097151.157073264194303.157033178388607.15700481a1A=optimal1.170119519486793.195527051451717.1963252507877615.190704465809031.183859747699663.1775601103885127.172343338577255.168255766598511.1651581472981023.162860930522047.161181856974095.159966747888191.1590934470616383.158468821232767.158023566265535.1577069262131071.157482127262143.157322717524287.1572097711048575.157129792097151.157073184194303.157033138388607.15700479THD (dB)A=optimal−10.7629578−18.7633376−25.5045573−31.8098475−37.9357894−43.9857175−50.0049084−56.0134634−62.0199994−68.0278654−74.0380588−80.0505958−86.0651409−92.0812822−98.0986407−104.116904−110.135830−116.155234−122.174984−128.194979−134.215150−140.235446−146.255832m−1−1−10.1492078−18.2533980−25.1895549−31.6159563−37.8138122−43.9071306−49.9531877−55.9788184−61.9964656−68.0117064−74.0268736−80.0428071−86.0596937−92.0774606−98.0959534−104.115011−110.134495−116.154293−122.174319−128.194509−134.21482−140.235212−146.255672m−1−0.5−10.5728562−18.3370094−25.0267366−31.3681507−37.5642711−43.6902709−49.7783344−55.8439127−61.8952456−67.9371468−73.9726322−80.0036830−86.0316405−92.0574286−98.0816905−104.104877−110.127304−116.149195−122.170708−128.191953−134.213010−140.233932−146.25476
La equivalencia de las dos definiciones de optimización se mantiene incluso cuando la precisión numérica aumenta significativamente, aquí con al menos a 200 decimales, en Python (continuación):m = 4
m = 4
mp.mp.dps = 200
mp.findroot(lambda A: mp.diff(RelMSE, A), 2**(m-1)-1+0.157)
mp.findroot(lambda A: mp.diff(STHD, A), 2**(m-1)-1+0.157)
que genera valores óptimos numéricamente idénticos para para las dos definiciones de optimización:UNA
mpf('7.21658597929406951556806247230383254685067097032105786583650636819627678717747461433940963299310318715204551609940031954265317274195597248077934451075855527')
mpf('7.21658597929406951556806247230383254685067097032105786583650636819627678717747461433940963299310318715204551609940031954265317274195597248077934451075855527')
Limitem → ∞
En general se hace difícil optimizar directamente numéricamente , por lo que es deseable otro enfoque. Una aproximación de Taylor de la sinusoide sobre su pico, donde se diferencia más de una función lineal, es un polinomio cuadrático. Esto se puede usar para analizar los efectos de la cuantización en el límite . La diferencia entre el error de cuantificación de MS de una sinusoide con una amplitud y el error de cuantificación de MS de una función lineal es proporcional a (Fig. 4):metrometrom → ∞ ⇒ A → ∞UNA1 / 12
M S -112∝ f( a ) =∫4 a + 2√/ 20 0( (X2- un)2-112) dX+∑k = 1∞∫4 a + 4 k + 2√/ 24 a + 4 k - 2√/ 2( (X2- a - k)2-112) dX=160 60(4 a + 2-----√dieciséisuna2- 4 a - 1+∑k = 1∞(4 a + 4 k + 2---------√( 16una2+ 4 a( 8 k - 1 ) + 16k2- 4 k - 1 )-4 a + 4 k - 2---------√( 16una2+ 4 a( 8 k + 1 ) + 16k2+ 4 k - 1 ) ) ) ,(7)
cuando la amplitud es un número entero más un número real . La suma en la ecuación. 7 parece converger, mientras que omitiendo el término daría como resultado que la secuencia de sumas parciales crezca sin límite, lo que indica que no importa qué valor de se elija, y como .UNA→ ∞- 0.5 < a ≤ 0.5-112una( M S -112) / M S →0M S →112m → ∞
Figura 4. y de la ecuación. 7. La forma de ve idéntica a la forma de RRMSE para grande en la Fig. 1.F( a )F′( a )F( a )metro
Al diferenciar simbólicamente definido en la ecuación. 7 con respecto a (Fig. 4) y al encontrar el cero de cerca de , la óptima en puede ser calculado a un poco de precisión, en Python (continuación) :F( a )unaF′( a )a = 0.157unam → ∞
def f(a):
a = mp.mpf(a)
return (mp.sqrt(4*a + 2)*(16*a**2 - 4*a - 1) + mp.nsum(lambda k: (mp.sqrt(4*a + 4*k + 2)*(16*a**2 + 4*a*(8*k - 1) + 16*k**2 - 4*k - 1) - mp.sqrt(4*a + 4*k - 2)*(16*a**2 + 4*a*(8*k + 1) + 16*k**2 + 4*k - 1)), [1, mp.inf]))/60
def Df(a): # Derivative of f(a)
a = mp.mpf(a)
return mp.sqrt(2)*(16*a**2 + 4*a - 1)/(12*mp.sqrt(2*a + 1)) + mp.nsum(lambda k: (mp.sqrt(4*a + 4*k - 2)*(16*a**2 + 4*a*(8*k + 1) + 16*k**2 + 4*k - 1) - mp.sqrt(4*a + 4*k + 2)*(16*a**2 + 4*a*(8*k - 1) + 16*k**2 - 4*k - 1))/(12*mp.sqrt(2*a + 2*k + 1)*mp.sqrt(2*a + 2*k - 1)), [1, mp.inf])
to_max_digits(lambda: mp.findroot(lambda a: Df(a), 0.157), 63, 83, double_digits)
lo que da . Esto se puede utilizar para crear una aproximación de la óptima como función de , destinada a grandes :a ≈ 0.156936321399UNAmetrom ≥ 20
A ≈2m - 1- 1 + 0.156936321399 +mi- 1,2749819017 - 0,3464088917 m,(8)
donde los coeficientes en el exponente se calcularon mediante un ajuste lineal en a una linealización de los valores óptimos de la Tabla 1 o, de manera equivalente, la Tabla 2. El error al usar la aproximación se muestra en la Fig. 5 .m ∈ { 21 , 22 }UNA
Figura 5: Error absoluto en la aproximación de óptimo por la ecuación. 8 en función de . Para , que se utilizaron para el ajuste, y para , el error de aproximación absoluta fue inferior a .UNAmetrom ∈ { 21 , 22 }m ∈ { 23 , 24 }10- 8
Por curiosidad, también calculé el peor de los casos que da el mayor error de cuantificación de MS como , al encontrar el cero de cerca de , que resultó estar en .unam → ∞F′( a )a = - 0.43a ≈ - 0.433510875868
Conclusión
Las dos definiciones de optimización parecen ser equivalentes a una precisión numérica convincente. Como , el valor óptimo de aproxima a aproximadamente (o más exactamente para grandes finitos la aproximación de la ecuación 8) y la reducción del error de cuantificación (por def. 1 SNR o def.2 THD) en dB al elegir el valor óptimo se aproxima a cero, en comparación con la elección de otro valor grande como o la elección del caso más desfavorable .m → ∞UNA2m - 1- 1 + 0.156936321399metroA =2m - 1- 1A =2m - 1- 0.5
En la amplitud óptima , la sinusoide de mínimos cuadrados (LS) es de la misma frecuencia y fase que la sinusoide que se cuantifica, pero tiene una amplitud algo menor dada en la Tabla 2. Esto es algo contraintuitivo. Para minimizar THD (o maximizar SNR con la sinusoide que se aproxima como la señal) de aproximación de una sinusoide de amplitud utilizando una forma de onda de números bit con valores en el rango que se construye cuantificando (redondeando al entero más cercano) una sinusoide de amplitud , uno debe elegir y óptimos que no sean iguales.UNAuna1una1metro-2m - 1...2m - 1- 1UNAuna1UNA
Los resultados son aplicables al tiempo continuo sin muestreo, o al muestreo en el límite , donde es la frecuencia sinusoide y es la frecuencia de muestreo. En general, la optimización no se preserva mediante el muestreo. El muestreo aleatorio con tiempos aleatorios de las muestras conservará la definición 1 de la SNR óptima, si la distribución de la fase sinusoide (módulo ) en las muestras es uniforme. Además, para irracionales , la misma óptima se conserva por la misma razón, véase el teorema de equidistribución . La optimización de la definición 1 SNR se desvanece con racionales , porque la distribución de las fases sinusoides no será uniforme.F→FsFFs2 πF/ /FsF/ /Fs