A fase do sinusóide não importa: uma mudança de fase de um sinusóide é equivalente a uma mudança no tempo, o que resulta em uma mudança no tempo do sinusóide quantificado e do erro de quantização. O espectro de potência é invariável às mudanças de tempo . Escolhemos trabalhar com sinusóideUm cos( X ).
Optimalidade por def. 1 1
Equivalentemente à maximização da relação sinal-ruído (SNR), podemos minimizar o erro de quantização do quadrado médio da raiz em relação ao quadrado médio da raiz 1 / 2---√UMA do sinusóide, R R M S E = 1/SNR−−−−−−√. É o suficiente para fazer a análise no primeiro trimestre da onda cosseno, porque o restante da onda cosseno e o erro de quantização são idênticos ao seu primeiro trimestre até uma inversão de sinal e / ou reversão do tempo. Deixeix estar no primeiro trimestre da onda cosseno, 0<x<π/2. Ao longo das linhas da Eq. 2 da minha resposta a uma pergunta relacionada , a onda cosseno quantizada atinge um valor inteirok∈0…round(A) quando:
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 k dá ao erro quadrático médio relativo RelMSE uma contribuição aditiva de:
2MSEkA2=2A21π/2∫x1x0(Acos(x)−k)2dx=2sin(x1)cos(x1)−2sin(x0)cos(x0)π+8k(sin(x0)−sin(x1))πA+4k2(x1−x0)πA2+2x1−2x0π,(2)
Onde x0 e x1 denotar, conforme definido separadamente para cada kos limites x0<x<x1dada pela Eq. 1. O erro quadrático médio total de quantização relativo é então:
R e l M S E =2M S EUMA2=∑k = 0r o u n d (A)2M S EkUMA2=2a s i n (1 12 A)π-4UMA2- 1------√2 πUMA2-( 2UMA2+ 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 otimizar pela definição 1, a tarefa é encontrar o valor de A que minimiza o erro relativo de quantização do quadrado médio da raiz RRMSE =RelMSE−−−−−−−√. sob a restriçãoA≤2m−1−0.5. Eq. 3 pode ser avaliado em Python usando a mpmath
biblioteca de precisão arbitrária:
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 ter um mínimo local entre cada par de números inteiros sucessivos A (Figura 1).
Figura 1. RRMSE (linha sólida azul e quadrados azuis) e sua aproximação 1/6−−−√/A (linha tracejada laranja) com base na variação 1/12 distribuição uniforme da largura 1, para várias faixas de A.
Uma seleção de opções ideais A são apresentados na Tabela 1, juntamente com o RRMSE resultante, também para alguns outros valores comuns de A. Em maioresm, A redução de RRMSE pela escolha ideal será marginal. As entradas da tabela, que mostram apenas dígitos iguais entre dois cálculos usando configurações de precisão diferentes, podem ser geradas pelo seguinte script Python (continuação), cuja execução levou dias:
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+"\\\\")
Tabela 1. Ótimo A pela definição 1 para diferentes m≤24 eo RRMSE resultante, com o RRMSE para algumas escolhas comuns de A listado para comparação. m=1foi deixado de fora porque não pode ser tratado pela Eq. 3 e porque um único bit não representa nenhum número positivo como representação de complemento de dois. Observe que RRMSE em dB é convertido em SNR em dB por um sinal de inversão, porqueSNR = 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
Optimalidade por def. 2
Uma função periódica como um senoide quantizado possui uma série de Fourier; é uma soma de sinusóides harmônicos, ou seja, sinusóides de frequências harmônicas de uma frequência fundamental. Sinusóides harmônicos são ortogonais. Portanto, o quadrado médio da função periódica é igual à soma dos quadrados médios dos sinusóides harmônicos. O quadrado médio da soma dos harmônicos não fundamentais pode então ser calculado subtraindo o quadrado médio do fundamental do quadrado médio da função periódica. Para uma onda cosseno quantizadar o u n d ( Acos( x ) ) isso permite calcular a distorção harmônica total (THD) como:
T H D =M S -uma21 1/ 2uma21 1/ 2---------√=M Suma21 1/ 2- 1--------√,4)
onde MS é o quadrado médio da onda cosseno quantizada, uma21 1/ 2 é o quadrado médio do fundamental e uma1 1 é o coeficiente da frequência fundamental cosseno na série Fourier de r o u n d ( Acos( x ) ), calculado usando a Eq. 3 da minha resposta a uma pergunta relacionada e simplificando para:
uma1 1=2πUMA( R o u n d ( A )4UMA2- ( 2round(A)−1)2−−−−−−−−−−−−−−−−−−−−√+∑k=1round(A)−1k(4A2−(2k−1)2−−−−−−−−−−−−−√−4A2−(2k+1)2−−−−−−−−−−−−−√)).(5)
O quadrado médio da onda cosseno quantizada é calculado em seu primeiro 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)
O THD é calculado e minimizado pelo seguinte script Python (continuação), usando Eqs. 4, 5 e 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) em função da amplitude não quantificada UMA. Os máximos locais estão em amplitudes que fazem com que uma protrusão estreita apareça nos extremos do sinusóide quantizado.
Figura 3. Amplitude uma1 1 (linha sólida azul) da frequência fundamental na quantização de uma onda cosseno de amplitude UMA, com a linha de identidade (linha tracejada laranja) plotada para referência.
Tabela 2. Ótimo UMA pela definição 2 para diferentes m ≤ 24 eo THD resultante, com o THD para algumas escolhas comuns de UMAlistado para comparação. Surpreendentemente, o THD é minimizado pelo mesmoUMAque maximizam o SNR (Tabela 1), também quando testados com uma precisão muito maior do que o mostrado aqui. Se o sinal for considerado um sinusóide de amplitudeuma1 1 em vez de amplitude UMA, os valores SNR são obtidos invertendo o sinal dos valores THD.
m23456789101112131415161718192021222324A ideal 1.268279494615303.238009421210377.2165859792940715.200718133195531.188875671425763.1800835394190127.173613625523255.168894736361511.1654791888901023.163022053772047.161262644844095.160007225168191.1591137160116383.158478966632767.158028642865535.1577094659131071.157483397262143.157323352524287.1572100891048575.157129952097151.157073264194303.157033178388607.15700481uma1 1A = ideal1.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 = ideal- 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
A equivalência das duas definições de otimização é válida mesmo quando a precisão numérica é aumentada significativamente, aqui com m = 4 pelo menos até 200 casas decimais, em Python (continuação):
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 gera valores ótimos numericamente idênticos para UMA para as duas definições de otimização:
mpf('7.21658597929406951556806247230383254685067097032105786583650636819627678717747461433940963299310318715204551609940031954265317274195597248077934451075855527')
mpf('7.21658597929406951556806247230383254685067097032105786583650636819627678717747461433940963299310318715204551609940031954265317274195597248077934451075855527')
Limite m → ∞
Em geral m torna-se difícil otimizar diretamente mnumericamente, então outra abordagem é desejável. Uma aproximação de Taylor do sinusóide em relação ao seu pico, onde mais difere de uma função linear, é um polinômio quadrático. Isso pode ser usado para analisar os efeitos da quantização no limitem → ∞ ⇒ A → ∞. A diferença entre o erro de quantização MS de um sinusóide com amplitudeUMA e o erro de quantização MS 1 / 12 de uma função linear é proporcional a (Fig. 4):
M S -1 112∝ f( Um ) =∫4 a + 2√/ 20 0( (x2- um)2-1 112) dx+∑k = 1∞∫4 a + 4 k + 2√/ 24 a + 4 k - 2√/ 2( (x2- a - k)2-1 112) dx=1 160(4 a + 2-----√16uma2- 4 a - 1+∑k = 1∞(4 a + 4 k + 2---------√( 16uma2+ 4 a( 8 k - 1 ) + 16k2- 4 k - 1 )-4 a + 4 k - 2---------√( 16uma2+ 4 a( 8 k + 1 ) + 16k2+ 4 k - 1 ) ) ) ,(7)
quando a amplitude UMA é um número inteiro → ∞ mais um número real - 0,5 < a ≤ 0,5. A soma na Eq. 7 parece convergir, enquanto deixar de fora o termo-1 112 resultaria na seqüência de somas parciais crescendo sem limite, indicando que não importa qual valor de uma é escolhido, ( H S -1 112) / M S →0 e M S →1 112 Como m → ∞.
Figura 4. f( Um ) e f′( Um )da Eq. 7. A forma def( Um ) parece idêntico ao formato do RRMSE para grandes m na Fig. 1.
Diferenciando simbolicamente f( Um )definido na Eq. 7 em relação auma (Fig. 4) e encontrando o zero de f′( Um ) perto a = 0,157, o ideal uma às m → ∞ pode ser calculado com bastante precisão, em Python (continuação):
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)
que dá a ≈ 0.156936321399. Isso pode ser usado para criar uma aproximação do melhorUMA em função de m, destinado a grandes m ≥ 20:
A ≈2m - 1- 1 + 0,156936321399 +e- 1,2749819017 - 0,3344088917 m,(8)
onde os coeficientes no expoente foram calculados por um ajuste linear em m ∈ { 21 , 22 } a uma linearização do ideal UMA valores da Tabela 1 ou tabela 2. Equivalentemente, o erro ao usar a aproximação é mostrado na Fig. 5.
Figura 5: Erro absoluto na aproximação do valor ótimo UMApela Eq. 8 em função dem. Param ∈ { 21 , 22 }, que foram usados para montagem e para m ∈ { 23 , 24 }, o erro absoluto de aproximação foi menor que 10- 8.
Por curiosidade, eu também calculei o pior caso uma que fornece o maior erro de quantização do MS, como m → ∞, encontrando o zero de f′( Um ) perto a = - 0,43, que acabou por estar em a ≈ - 0,433510875868.
Conclusão
As duas definições de otimalidade parecem equivalentes, à precisão numérica convincente. Comom → ∞, o valor ideal de UMA aproxima-se aproximadamente 2m - 1- 1 + 0,156936321399 (ou mais precisamente para grandes ma aproximação da Eq. 8) e a redução do erro de quantização (por definição 1 SNR ou por definição 2 THD) em dB ao escolher o valor ideal aproxima-se de zero, em comparação com a escolha de outro valor grande, comoA =2m - 1- 1 ou a escolha quase pior dos casos A =2m - 1- 0,5.
Na amplitude ideal UMA, o sinusóide de mínimos quadrados (LS) tem a mesma frequência e fase que o sinusóide sendo quantizado, mas tem uma amplitude um pouco menoruma1 1dado na Tabela 2. Isso é um pouco contra-intuitivo. Minimizar THD (ou maximizar SNR com o sinusóide sendo aproximado como sinal) de aproximar um sinusóide de amplitudeuma1 1 usando uma forma de onda de mnúmeros de bits com valores no intervalo -2m - 1…2m - 1- 1 que é construído quantizando (arredondando para o número inteiro mais próximo) um sinusóide de amplitude UMA, é preciso escolher o ideal uma1 1 e UMA que não são iguais.
Os resultados são aplicáveis ao tempo contínuo sem amostragem ou à amostragem no limite f→fs, Onde f é a frequência sinusóide e fsé a frequência de amostragem. Em geral, a otimização não é preservada por amostragem. A amostragem aleatória com tempos aleatórios das amostras preservará a otimização da SNR da definição 1, se a distribuição da fase senoidal (módulo2 π) nas amostras é uniforme. Além disso, para irracionalf/fs, a mesma otimização é preservada pelo mesmo motivo, consulte o teorema da equidistribuição . Definição 1 A otimização do SNR desaparece com o racionalf/fs, porque a distribuição das fases sinusóides não será uniforme.