Compressão de bytes

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor barboza » 10 Nov 2009 05:28

Acho que a melhor opção é fazer como o Codec de audio ADPCM, estuda ela.

Como a variação de temperatura é lenta, ao inves de armazenar o valor absoluto, você armazena somente a diferença.

Exemplo:

Leitura 1 = 30.

Em binario = 011110

Leitura 2 = 32.

Em binario = 010

Veja que as proximas serao em função da anterior.

Depois você ainda pode compactar usando Huffman.

Me manda um email que mando meu TCC. Usei isso para audio....
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor andre_luis » 10 Nov 2009 09:55

Porque não usa o Struct do C para isso ?

Pode definir tamanho da variável com apenas de 6 bits.
Acredito que o gerenciamento da memória do compilador otimize o uso da memória.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Jozias del Rios » 10 Nov 2009 12:13

Uma vez eu precisei guardar uma tabela de uns 128KB na memória Flash de um AVR... era uma tabela de conversão de coordenadas. O uC era um Atmega16 e tinha apenas 12KB disponível... consegui realizar isso guardando as diferenças entre um valor e o seu próximo. Se vc souber que a maioria das leituras terão valores com pouca variação, guarde apenas a diferenças (temporais!) entre as amostras.

Talvez o mais fácil seja "espetar" mais um 24LC512 no barramento I2C e estender o endereçamento... o software não vai nem perceber que são dois chips de memória...
ficar encaixando números de 6 bits que iam se estender para ocupar 8 bits, o ganho não é tão significativo pela complexidade acrescentada...
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor ze » 10 Nov 2009 13:58

se eu fosse seu cliente e você me oferecesse + do que pedi, p.ex. gravar a cada minuto (ou segundo) eu iria até pensar. Para tal façanha, eu (que agora sou você) analizaria a possibilidade de usar cartão sd ou mmc. Veja o artigo:
http://www2.eletronica.org/hack-s-dicas ... chterm=spi
Facilita as 2 vidas: +- fácil de implementar via spi e +- fácil de passar pro pc via cartão. Poderia até economizar um trocado deixando o cartão por conta dele.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Diego_Oliveira » 12 Nov 2009 08:37

andre_teprom escreveu:Porque não usa o Struct do C para isso ?

Pode definir tamanho da variável com apenas de 6 bits.
Acredito que o gerenciamento da memória do compilador otimize o uso da memória.

+++


É uma opção também :)
Avatar do usuário
Diego_Oliveira
Nibble
 
Mensagens: 79
Registrado em: 05 Abr 2008 15:18
Localização: Rio Grande do Sul

Mensagempor Diego_Oliveira » 12 Nov 2009 08:39

lellis escreveu:se eu fosse seu cliente e você me oferecesse + do que pedi, p.ex. gravar a cada minuto (ou segundo) eu iria até pensar. Para tal façanha, eu (que agora sou você) analizaria a possibilidade de usar cartão sd ou mmc. Veja o artigo:
http://www2.eletronica.org/hack-s-dicas ... chterm=spi
Facilita as 2 vidas: +- fácil de implementar via spi e +- fácil de passar pro pc via cartão. Poderia até economizar um trocado deixando o cartão por conta dele.
abç


Seria interesante, ele poderia simplesmente tirar o cartão e passar pro PC, sem maiores problemas ou sem ter de carregar um aparelho por ai....
Avatar do usuário
Diego_Oliveira
Nibble
 
Mensagens: 79
Registrado em: 05 Abr 2008 15:18
Localização: Rio Grande do Sul

Mensagempor MOR_AL » 12 Nov 2009 08:54

barboza escreveu:...Como a variação de temperatura é lenta, ao inves de armazenar o valor absoluto, você armazena somente a diferença.
Exemplo:
Leitura 1 = 30.
Em binario = 011110
Leitura 2 = 32.
Em binario = 010
Veja que as proximas serao em função da anterior.
....

Barboza. Pensei nesta possibilidade também, mas esbarra em um problema sério.
Imagine que a variação de temperatura seja superior a 111 (7º). Aí, além de perder este dado, todas as variações seguintes, mesmo que inferiores a 7º, não levariam aos valores corretos.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor msamsoniuk » 12 Nov 2009 09:10

eh um pouco pior!

para comprimir de 6 para 3 bits vc teria ainda que considerar que o da/dt das amostras no tempo pode ser negativo! entao o valor maximo ficaria preso entre -4 e +3!

uma solucao eh "error difusion", ou seja, se o da/dt excede a faixa que vc tem disponivel, vc pode assumir que essa variacao nao vai crescer na mesma taxa continuamente, assim se vc tiver um da/dt = 5 num instante, vc envia +3 e guarda o erro +2. e no outro instante digamos que ele nivela da/dt = 1, vc pode somar o erro e enviar +3.

o resultado eh que vc tem uma certa inercia do sistema para acompanhar variacoes rapidas, mas fazendo dessa forma nao acumula erros e, visualizando um quadro mais geral, vc consegue manter uma media.

um exemplo de "error difusion" eh a compressao de imagens de 8 bits para apenas 2 bits:

Imagem

mas eh um exemplo de compressao destrutiva. vc poderia tentar uma compressao nao destrutiva, acho que tambem daria uma taxa boa.

MOR_AL escreveu:
barboza escreveu:...Como a variação de temperatura é lenta, ao inves de armazenar o valor absoluto, você armazena somente a diferença.
Exemplo:
Leitura 1 = 30.
Em binario = 011110
Leitura 2 = 32.
Em binario = 010
Veja que as proximas serao em função da anterior.
....

Barboza. Pensei nesta possibilidade também, mas esbarra em um problema sério.
Imagine que a variação de temperatura seja superior a 111 (7º). Aí, além de perder este dado, todas as variações seguintes, mesmo que inferiores a 7º, não levariam aos valores corretos.
MOR_AL
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Jozias del Rios » 12 Nov 2009 09:12

Que uma leitura pode estar fora do seu valor correto pode ser verdade, mas o erro não será acumulado pois o sistema de gravação deve estar ciente de divergências, compensando na próxima leitura.

Em termos de fluxo de sinais, diz-se que o gravador (transmissor) é realimentado e reproduz o sinal gravado (recebido) dentro do seu sistema, comparando este com o sinal de entrada.

Então, por exemplo, se usamos 3 bits para representação do delta do sinal, podemos codificar parcelas de -4 à +3.

Se ocorrerem as seguintes leituras:
30, 31, 28, 29, 34, 35, 33

as diferenças entre amostras adjacentes (deltas) serão:
+1, -3, +1, +5, +1, -2

porém +5 não é representável, ele será espalhado para as próximas leituras, e os deltas tornar-se-ão:

+1, -3, +1, +3, +3, -2

e as leituras armazenadas, depois de computadas, serão:
30, 31, 28, 29, 32, 35, 33

veja que de fato houve uma divergência por ter extrapolado o seu intervalo, mas não há erro acumulativo (nesta aplicação).

Logicamente, há outras formas de se fazer esta "codificação de fonte", dependendo da sua tolerância a erros, entre outros requisitos.

Pergunto: se existisse uma plaquinha que fizesse interface com PenDrive (USB) e você conversa com ele por diversos meios, à sua escolha, por exemplo SPI, I2C, UART, e esta plaquinha também fizesse o manuseio do sistema de arquivos do Pendrive, fornecendo uma interface de comandos tão simples como:

DIR
OPEN "ARQUIVO.TXT"
MOVETO 1000
READ 100
CLOSE

Vocês acham que teria saída? ...
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Jozias del Rios » 12 Nov 2009 09:18

Wow, o Marcelo foi miliseconds mais rápido que eu, hehe:P
E ainda escolheu o mesmo intervalo...

Bom, error diffusion é outra estratégia, assim como vc também poderá optar pelo famoso delta-sigma, etc.
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Djalma Toledo Rodrigues » 12 Nov 2009 09:21

Diego

As 3 Temperaturas em 1 Byte , como coloquei acima, já não atende ?
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Diego_Oliveira » 12 Nov 2009 09:23

Djalma Toledo Rodrigues escreveu:Diego

As 3 Temperaturas em 1 Byte , como coloquei acima, já não atende ?


Atenderia, seria facil de implementar, mas ao testar tive dificuldades pra descompactalas novamente :?

Se você souber, poste para min, a principio tentei fazer a operação inversa, porém não funcionou...
Avatar do usuário
Diego_Oliveira
Nibble
 
Mensagens: 79
Registrado em: 05 Abr 2008 15:18
Localização: Rio Grande do Sul

Mensagempor barboza » 12 Nov 2009 18:41

Nossos amigos já lhe deram boas opções para sinais dinamicos.

Minha aplicação foi com dados já amostrados e salvos, e neste caso além do ADPCM usei o Huffman para usar somente a quantidade de bit necessario para cada variação.

Ai você tem duas opções como já dito, com ou sem perdas, mas o importante é nao deixar o erro se propagar......
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor MOR_AL » 12 Nov 2009 20:18

Jozias del Rios.
Se você verificar antes, se a variação é maior que a capacidade, então realmente o erro tente a ser eliminado na sequência complementar. Eu não havia pensado na possibilidade de aceitar alguns valores com erro.
Dependendo da variação da temperatura e da capacidade (número de bits), mais de um valor poderá estar errado.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor ze » 13 Nov 2009 07:13

pra mim o 6 tão querendo dar um canhão pro minino matar um passarinho. Ele disse que cada dado é no máx 50. Tô com pregui de pensar mas deve ter uma forma ou fórmula de posicionar 5 dados de 50 em 255=1byte. Talvez com struct union campos de bit mesmo sei lá. 6ª num consigo pensar direito.

Jozias del Rios escreveu:Pergunto: se existisse uma plaquinha que fizesse interface com PenDrive (USB) e você conversa com ele por diversos meios, à sua escolha, por exemplo SPI, I2C, UART, e esta plaquinha também fizesse o manuseio do sistema de arquivos do Pendrive, fornecendo uma interface de comandos tão simples como:

DIR
OPEN "ARQUIVO.TXT"
MOVETO 1000
READ 100
CLOSE

Vocês acham que teria saída? ...

existe!
http://www.beyondlogic.org/usb/ftdi.htm
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x