Por que você não pode apenas obter amostras médias de ADC para obter mais resolução de um ADC?


8

Estou tentando obter mais de 10 bits de precisão do meu Arduino ADC, mas não consigo descobrir a teoria por trás disso. Uma nota de aplicação Atmel frequentemente citada ( http://www.atmel.com/Images/doc8003.pdf ) diz que

É importante lembrar que a média normal não aumenta a resolução da conversão. Decimação, ou Interpolação, é o método de média, que combinado com a superamostragem, aumenta a resolução

Então, o que eles propõem para 'dizimação' é mover o ponto decimal. O que equivale a reduzir a leitura binária pela metade para cada lugar em que você a move, assim você pode dividir o valor da base 10 por 2 ou 4 ou 8 ou o que você tem. Estou entendendo que dizimação está errada?


"Combinado com a superamostragem, o que aumenta a resolução" - acho que eles estão dizendo que, para ter mais resolução, é preciso colher mais amostras. (Ao contrário do que, eu não sei Talvez eles pensam que alguém vai ser suficiente mudos média a mesma amostra com ele mesmo mais e mais.?)
user253751

Na área de DSP (Digital Signal Processing), o termo "dizimação" significa um algoritmo regular para remover (soltar) amostras se elas não estão mudando muito (ao sobreavaliar muito acima do limite do sinal Nyquist ou após um filtro de suavização). O termo vem de uma prática na Roma antiga (?) Para matar todo, digamos, terceiro soldado de um regimento que falhou em um campo de batalha.
Ale..chenski

E não vejo onde o artigo da Atmel sugere mover pontos decimais, embora possa fazer parte do algoritmo de média.
Ale..chenski

Respostas:


7

Dei uma olhada na nota e essa é realmente uma afirmação estranha (ou uma maneira confusa de dizer o que eles realmente querem dizer).

Talvez o que eles realmente querem dizer é que, se você quiser obter mais resolução, não poderá dividir / mudar o número posteriormente para a mesma escala de uma única amostra, porque (na aritmética inteira) isso jogaria fora os bits que você ganhou.

Se suas amostras de ADC são barulhentas , é claro que você pode dividir para obter um valor menos barulhento na escala original.


A outra coisa em que pensei apenas na sua pergunta foi o ponto de que para fazer a sobre amostragem correta, você precisa usar um filtro passa-baixas eficaz, e uma média móvel direta não é tão boa em ser um filtro passa-baixa quanto um FIR adequadamente projetado (ou IIR) - mas isso não parece ser suportado pelo texto da nota.


Um filtro passa-baixo ou um filtro de média móvel não filtra 1 / f de ruído, razão pela qual os bits mais baixos são barulhentos, se os filtros funcionassem, eu ficaria sem trabalho
Voltage Spike

16

Se você pedir a alguém para medir uma placa de 45,2 cm com precisão no centímetro mais próximo, ela responderá (ou deveria) responder 45. Se você pedir para medir novamente, ela responderá 45 novamente. Repita o exercício mais 8 vezes e a média de todas as medições deve ser exatamente 45. Não importa quantas vezes uma amostra seja digitada, uma terminará com um valor de 45. A média de todas essas leituras seria, obviamente, 45 (mesmo que a placa tenha 45,2 cm de comprimento).

Se a pessoa ajustasse o aparelho de medição para ler 0,45 cm antes da primeira medição, 0,35 cm antes da segunda, 0,05 cm antes da quinta, 0,05 cm antes da sexta, etc. até 0,45 cm antes no décimo, duas das medidas seriam 46 e as outras oito seriam 45. A média de todas elas seria 45,2.

Na prática, conseguir desviar as coisas com tanta precisão é difícil. Se alguém ajustar aleatoriamente o aparelho de medição antes de cada medição para ler algo entre 0,5 cm de comprimento e 0,5 cm de comprimento, cerca de 1/5 das medições lerá 46 e o ​​restante 45, mas como os ajustes são aleatórios, a fração real pode ser maior ou inferior. Fazer dez medições não acrescentaria um valor significativo de precisão, mas uma média de aproximadamente 100.

Não sei se entendi bem a lógica do artigo para a distinção entre média e deslocamento à direita. É preciso estar ciente de que a precisão aparente alcançada pela média pode exceder o nível significativo de precisão, mas, pela minha experiência, a questão de quando e quanto a mudança à direita deve ser conduzida pelos limites da faixa numérica do processador. Trabalhar com números que são redimensionados o máximo que puderem sem causar estouro geralmente minimiza os efeitos dos erros de arredondamento, desde que não se atribua significado indevido a pequenas quantidades de ruído.

Aliás, no uso original, "dizimar" um exército era matar 1/10 dos soldados nele. Dizimar os dados de um ADC é descartar parte deles. O prefixo comum com a frase "ponto decimal" não implica uma associação.


14

A resposta curta é o ruído, e não é necessariamente o ruído que importa, mas o tipo de ruído . O outro problema são os efeitos não-lineares, como o INL, que diminuem o valor médio

Primeiro sobre o ruído:

Se amostrássemos uma distribuição gaussiana, seria algo assim:

insira a descrição da imagem aqui

A linha vermelha está mais próxima da distribuição térmica real (média ao longo do tempo) e o histograma azul representa muitas amostras de ADC. Se amostrássemos continuamente essa distribuição, obteríamos melhores estatísticas e poderíamos encontrar o valor médio ou a média com melhor precisão (que geralmente é o que procurávamos, sim, percebo que os sinais se movem, há filtragem e sinal para ruído dependendo do conteúdo da frequência, mas vamos considerar o caso DC em que o sinal não está se movendo no momento).

μ=1nEu=1nxEu

O problema é o ruído de cintilação ou 1 / f, muda a média gaussiana e causa a quebra das estatísticas, porque a distribuição não é mais gaussiana.

Este é um modelo ruim, mas você pode considerar que algo parecido com este INL também é um problema, pois pode introduzir alguns bits de erro, o que também diminui a média.

μ=1nEu=1nxEu+error

Provavelmente isso é confuso, vamos ver o domínio do tempo, como mostrado abaixo

Na imagem superior, você pode ver um sinal com ruído gaussiano, seria fácil "traçar uma linha" no meio e encontrar a média. Quanto mais amostra você tiver de um sinal como esse, maior precisão e conhecimento você terá da média.

Na imagem inferior, você pode ver como é o ruído de tremulação, a média não ajudará aqui.

O problema é que a maioria dos eletrônicos tem ruído de oscilação, resistores não (assumindo que não há influência da temperatura ambiente), mas transistores e CIs. Existem amplificadores chamados amplificadores de corte que superam esses efeitos.

Outra coisa a saber é que existem ADCs (os lineares têm um novo núcleo de SAR) onde os engenheiros trabalharam para eliminar os efeitos do ruído 1 / f (e outros efeitos não lineares dos ADCs como o INL) a um nível muito inferior ao bit dos ADCs valor. Você pode empregar uma super amostragem pesada e obter valores de 32 bits de um núcleo de 14 bits.

Fonte: EDN- 1 / f Ruído - a vela tremeluzente insira a descrição da imagem aqui


Muito interessante, mas eu não acho que a nota de aplicação estava se referindo a cintilação ruído
Fofinha

Todos os bons pontos; um filtro de média simples é um SINC (todos os coeficientes são iguais), mas nunca pode convergir completamente (citação mais tarde - usando o telefone agora).
22817 Peter Peter Smith

6

Então, o que eles propõem para 'dizimação' é mover o ponto decimal.

não exatamente. a parte dizimada argumenta que, corretamente, a meu ver, que a "média" normal de várias amostras, mas mantendo a largura do bit, não retém tanta informação. Portanto, se você calcula a média de leituras ADC em m n bits, a média resultante ainda é uma leitura adc em n bits.

a abordagem proposta é, para dizer o mínimo, é a média de leituras de ADC de n bits, para que a média resultante tenha uma largura de bit mais alta. Por exemplo, somar 4 leituras adc de 10 bits e dividir a soma por 2 produz uma leitura adc de 11 bits.

Eu pensei que sempre foi assim que a superamostragem foi feita profissionalmente. Essa média simples das pessoas na rede é amplamente entendida como a abordagem errada.

o outro ponto é que, para reduzir o ruído, a superamostragem só é eficaz se houver ruído. Se você tivesse um ADC de 10 bits projetado por Deus (ou seja, toda leitura é a leitura verdadeira absoluta, sem variação), a super amostragem não teria funcionado.

o circuito específico no final do artigo sobre o uso de um pwm para adicionar ruído está incorreto: o ruído de adição de pinos deve ter um capacitor de bloqueio CC. e um ponto menos substantivo é que ele não precisa ser um pino de PWM. Um pino GPIO normal funcionaria.


> Essa média simples das pessoas na rede é amplamente entendida como a abordagem errada. Não se você média-los como carros alegóricos
Fofinha

4

Primeiro, um ADC é tão bom quanto a sua referência de tensão. Se o seu arduino usa o + 5V como referência, você pode esquecer qualquer tipo de precisão, pois o regulador + 5V é bastante barulhento, baixa precisão como 1-5%, e sua tensão de saída depende da quantidade de corrente consumida. no momento da medição e também nos últimos milissegundos.

Portanto, se você precisar de exatidão ou precisão, selecione uma referência de tensão que atenda aos seus requisitos. Se você não precisar de precisão absoluta de tensão, será mais barato, pois você só precisará dela estável, em vez de precisa e estável.

Eu não testei o SAR ADC dentro do arduino. Tenho experiência com o AT90PWM3B, que é um parente próximo. Isso é muito bom. Com uma tensão de entrada constante, você obtém a mesma leitura do ADC repetidas vezes, com 1 LSB flutuando se a tensão estiver entre valores. Não se pode esperar um resultado melhor de um SAR ADC. (Eu usei uma referência de tensão externa de boa qualidade)

Então, barulho não é um problema aqui ...

Na verdade, o barulho é seu amigo ...

Vamos supor que a tensão que você deseja medir caia no valor ADC 100.1

Você faz 10 medições, mas como o ADC é bom, você recebe 100 todas as vezes!

Portanto, você precisa de um pouco de ruído no sinal, como um LSB de ruído, para garantir que, se medir 100,1, obterá 100 nove vezes em dez e 101 uma em cada dez. Então, a média é de 100,1, entendeu?

Se vier de um sensor, normalmente você terá ruído suficiente gratuitamente.


Bons pontos sobre todas as maneiras pelas quais estou perdendo precisão e precisão com meu método atual. Eu tenho um tl431 (desvio ajustável de precisão) por aí e vou tentar conectá-lo.
Fofinha

Os reguladores de tensão linear têm tempos de resposta na faixa de MHz e, portanto, são bastante estáveis ​​na faixa de frequência do ADC.
JimmyB

Então, você só pode medir tensões em relação ao mesmo Vcc (potenciômetro, sensores do tipo divisor de tensão).
JimmyB

LDOs com resposta "na faixa de MHz" ???? Envie as folhas de dados cara, eu gostaria de conhecer uma! Provavelmente o arduino vem com um 1117 crummy ou similar, que possui resposta transitória lenta do cão ... Usar o suprimento como referência não significa precisão de qualquer maneira.
peufeu 15/07/2017

4

O que você está perdendo é o significado de "dizimação".

A rigor, "dizimação" é reduzida para 1/10. Ou seja, de 10 reduza para 1.

A "dizimação" usada na amostragem perde o significado estrito. Em vez de 1/10, significa "reduzir em número".

O que isso significa é que você calcula a média de um número de amostras e reduz o número de amostras no mesmo número.

Como exemplo, se você faz amostragens em 1000Hz e em média 4 amostras, mantém apenas a média. No final, você tem apenas 250 amostras por segundo em vez de 1000. Você perdeu a resolução do tempo, mas ganhou um pouco de resolução de tensão.

Para cada fator de 4, você ganha 1 bit. Média e dizimada por 4, e passa da resolução de 10 bits para 11 bits de resolução.

Outro fator de 4 (4 * 4 = 16 no total) leva você de 10 a 12 bits. Outro fator de 4 leva você a 13 bits de resolução.

Mas observe que agora você está superextraindo por um fator de 64. Sua taxa de amostragem efetiva diminui pelo mesmo fator. Usando o exemplo da taxa de amostragem de 1000Hz, você reduz para cerca de 15 amostras efetivas por segundo.

Isso é dizimação, e é quantos ADCs de alto bit obtêm sua alta resolução. Eles amostram em uma taxa alta, média (ou usam um filtro passa-baixo digital) e dizimam.

No extremo, você tem um ADC de um único bit (um comparador simples) que faz uma amostragem excessiva de vários milhões de vezes para fornecer uma profundidade de bits efetiva de 16 bits.

Uma coisa que você precisa ter em mente para que isso funcione é que você precisa de ruído no seu sinal aproximadamente igual ao menor valor que o seu ADC pode medir. Para um ADC de 10 bits usando uma tensão de referência de 5V, seria um ruído de cerca de 5mV pico a pico.

A média do ruído é de onde vêm os ganhos de bits. Imagine que você tenha um sinal (DC) exatamente entre o valor de 512 contagens ADC e 513 contagens ADC. Sem ruído, o valor medido será sempre o mesmo - a média fornecerá o mesmo valor que as amostras.

Adicione ruído ao menor valor mensurável e isso parecerá muito diferente. Embora o sinal em si não mude, os valores medidos "balançarão" em torno do valor real do sinal. A média agora é diferente das amostras, e quanto mais amostras você usar, mais próximo se aproxima do valor real do sinal


Eu usei essa técnica com um Arduino (que usa um processador Atmel com um ADC de 10 bits) para obter uma melhor resolução para algumas medições que eu estava fazendo.

Eu consegui 13 bits, mas achei que precisava de mais. Eu poderia ter optado por outro fator 4, mas isso levaria muito tempo para cada amostra e só me daria mais um pouco.

Os experimentos com superamostragem mostraram que o que eu estava fazendo poderia funcionar (obtive resultados reconhecíveis, mas barulhentos), sem ter que gastar tempo e dinheiro para obter uma CDM melhor. Com a prova de conceito, eu poderia ir em frente e obter esse ADC melhor - e obter essa prova só me custou algumas linhas de código e um pouco de tempo.

Descobri que precisava de pelo menos 16 bits. Isso significaria uma média de 4096 amostras.
Isso é cerca de meio segundo usando a amostragem mais rápida possível com o software Arduino.

Como eu precisava de 14400 medições, a execução completa levaria 2 horas.

Eu não sou tão paciente, e as coisas que eu estava medindo não permaneceriam constantes por tanto tempo. Eu tive que mudar para o uso de um ADC que usa internamente uma taxa de superamostragem muito maior e que fornece amostras de resolução mais alta a uma taxa mais baixa.

Como em muitas outras coisas, dizimação é compromisso que pode lhe proporcionar melhor desempenho em uma direção (profundidade de bits), enquanto custa a performance em outra direção (taxa de amostragem).


3
Como você dedica um tempo para entender o que significa dizimação : Estritamente, significa redução em 1/10, mantendo 9/10 dos itens.
pipe

2

Então você pode estudar a teoria, mas posso dizer que, na prática, apenas um modelo simples é importante. Você pode calcular a média, desde que o sinal esteja dentro do ruído. Em seguida, a média do componente de ruído será zerada, enquanto o sinal permanecerá. Dessa forma, você obterá uma resolução em detrimento da largura de banda.

Se você tem, por exemplo, um ADC de 16 bits e os últimos quatro bits são barulhentos, é possível filtrá-los e obter o sinal lá. Mas se você tiver apenas um pouco de ruído, não há muito em média, portanto, você não receberá muitas informações novas.

Se você precisar de alta resolução (e baixa largura de banda), veja como o ADC sigma-delta funciona. Eles possuem um sinal de taxa alta de 1 bit que é filtrado para uma largura de banda com maior resolução, às vezes 20 bits e mais.


2

Por que você não pode? Você pode , mas deve considerar todas as fontes de erro e ruído para garantir que seu plano funcione.

A média trabalha para melhorar a resolução reduzindo o erro de desvio padrão, σ. O critério a ser atendido é que o ruído gaussiano deve apenas exceder o erro de quantização. A especificação a ser definida é o erro total e faz com que o erro ou a resolução de quantização contribua apenas com uma quantia menor do orçamento total do erro.

Por exemplo, se você deseja melhorar a resolução em 2 bits, mas seu ruído já é de 3 bits, considere como reduzir o ruído em 2 + 3 = 5 bits enquanto aumenta a resolução ao mesmo tempo em 2 bits.

  • Pode ser uma solução digital com média> 25 amostras com o custo da latência ou uma solução analógica por filtragem de rejeição de ruído, balanceamento de sinais para rejeitar o ruído do modo comum e / ou blindagem melhor do sinal junto com a média digital.

Onde n é o (s) bit (s) extra (s) de resolução desejado (s), o deslocamento do número binário (ou dizimação) x1 para a direita é igual a / 2.

Para calcular a média, significa σ de ruído é reduzido em x para x amostras, mas também que a latência é aumentada em x amostras de tempo, portanto, é necessária uma super amostragem para reduzir a latência.

Observe que o termo "dizimação" se aplica aos valores decimais e aos números decimais codificados binários. Você pode visualizar se tiver um contador que leia valores inteiros e, em média, com 10 resultados, divida por 10 para obter uma melhoria com uma casa decimal extra, mas o valor σ de ruído é reduzido apenas por 1/10 0=1/3.3. para x amostras, mas também que a latência é aumentada em x amostras de tempo, portanto, é necessária uma super amostragem para reduzir a latência,

foversumampeuEung=4nfNyqvocêEust

No entanto, o ruído nessa taxa de amostragem,fs deve ser apenas o suficiente para inclinar +/- 1 bit em algumas das amostras x, para obter a melhor melhoria na resolução.

  • Por exemplo, se o BW for 10kHz, então fNyqvocêEust= 20kHz
  • e se você deseja converter a resolução de 10 bits em 12 bits, n = 2 Aumentar a resolução de 10 bits para 12 bits requer a soma de 16 valores de 10 bits. Uma soma de 16 valores de 10 bits gera um resultado de 14 bits em que os dois últimos bits não devem conter informações valiosas.

Muito erro de quantização ou muito ruído aleatório exigirá mais cálculo de média para reduzir o erro e mais cálculo de média aumenta a latência do resultado.

Para otimizar um ADC para velocidade e erro, é necessário definir o orçamento total do erro e a resolução disponível (bits), SNR desejado ou erro absoluto para qualquer sinal fornecido em toda a faixa de medição. Definir todas as fontes de erro a princípio pode parecer difícil, mas é necessário incluir;

por exemplo, erro de ganho, erro de correção, erro de quantização, erro de ruído de CM, erro de ruído de DM, ruído de Vref ou erro de compensação, ruído ambiental, etc., erro de latência (da média)

Em seguida, determine quantos bits de resolução você precisa para atingir o orçamento de erro de design acima depois que todas as outras fontes de erro forem minimizadas.

O mesmo se aplica à média (para sinais lentos) e à superamostragem da largura de banda do sinal e à dizimação para o ADC em tempo real.

Isso não corrige erros de ganho ou deslocamento e, se houver ruído aleatório insuficiente, o ruído deverá ser adicionado para diminuir o sinal. Idealmente, todas as outras fontes de ruído e erro não excedem 1 bit, de modo que o desvio padrão ou pontilhamento seja de apenas +/- 1 valor acima do número de amostras. No entanto, deve haver ruído suficiente para que a mesma leitura não seja obtida por amostras sucessivas nos dois métodos.


1

A teoria por trás disso pode ser extraída, resumidamente, desta frase no artigo da Wikipedia sobre superamostragem :

No entanto, o SNR aumenta em sqrt (N) (...). A soma do ruído não correlacionado aumenta sua amplitude em sqrt (N), enquanto a soma de um sinal coerente aumenta sua média em N. Como resultado, o SNR (ou sinal / ruído) aumenta em sqrt (N). No exemplo, isso significa que, enquanto N = 256, há um aumento no intervalo dinâmico em 8 bits, e o conteúdo do "sinal coerente" aumenta em N, mas o ruído muda por um fator de sqrt (N) = sqrt (256 ) = 16 no exemplo (não deve ser confundido com um aumento de 16 bits); portanto, o SNR muda por um fator de 16.

Portanto, desde que o seu sinal atenda a certos critérios (como sendo mais lento e com pouco ruído), você aumenta um pouco a cada 4 amostras. Então, para cada 4 amostras resultantes, você pode obter "join" novamente para formar outra amostra de resolução mais alta, de modo que, no final, você obtenha log_4 (n) bits para cada n amostras que ler no seu ADC.

Quanto à parte de dizimação, não é realmente uma média, especialmente se você levar em consideração que estamos falando de números inteiros aqui (amostras ADC). Por exemplo, se você tiver amostras 1, 1, 3e 2, sua média seria:

int result = (1+1+3+2)/4;

Como você calcula a média com matemática inteira, seu "resultado matemático" de 1,75 será arredondado para 1. Se você multiplicar por 2, obterá 2.

Agora, se você dizimar com:

int result = (1+1+3+2)>>1;

O seu resultado será 3. Você pode argumentar que isso é o mesmo que dividir por 2, mas certamente não pode argumentar que 3 é a média de 1, 1, 3 e 2 . Veja a diferença?

Agora você pode ser tentado a somar tudo e não descartar a última parte. Mas lembre-se de que esse pedaço é barulho: você realmente não pode usá-lo.


Eu sinto que se a amplitude do ruído aumentar com sqrt (N) e o sinal coerente aumentar com N, o SNR terá que aumentar com N / sqrt (N) e não sqrt (N)
Plumpie

@Plumpie Verifique sua matemática novamente: N/sqrt(N) = sqrt(N).
Ronan Paixão

1

Parece que todo mundo já cobriu a parte teórica da sua pergunta, mas como você está usando um Arduino, talvez você queira ler minhas aventuras tentando melhorar a resolução da ADC com esta técnica:

Melhorando a resolução ADC do Arduino com pontilhamento e sobreamostragem

O caráter do ruído é uma parte crítica da história, e você pode gerar um pontilhamento razoavelmente bom simplesmente pressionando um pino com um resistor enquanto lê o ADC de forma assíncrona. Não é perfeito, e você obtém um pequeno deslocamento de sincronia que varia dependendo de quantas amostras / bits extras você está tentando obter. Eu também aceitaria as críticas de que essa técnica depende da fraca estabilização de trilhos no Arduino, por isso está realmente projetando uma falha, em vez de seguir as boas práticas. Mas é muito fácil de fazer.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.