Entrar    Registrar

Como ler um dado de 16 bits

Software e Hardware para DSP

Moderadores: joao, guest2003, 51

  • Autor
    Mensagem

Re: Como ler um dado de 16 bits

Mensagempor KrafT » 20 Dez 2017 12:08

Acho que o problema original do Vonilmam é ler o arquivo, pois ele quer colocar sons complexos e usou a senoide para começar. Mas nesse ponto eu não consigo ajuda-lo :? .
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2033
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Como ler um dado de 16 bits

Mensagempor pamv » 20 Dez 2017 12:30

Vonnilmam escreveu:Como você gerou essa tabela, PALM?


Eu usei o octave, um programa semelhante ao matlab mas opensource. Mas a dica do eletroinf é bem melhor porque produz a saída em hexadecimal.

Uma outra coisa que eu só percebi hoje, talvez seja só no desenho, a ordem dos bytes (MSB,LSB) está trocada naquela figura do R-2R que você postou:

DAC_R2R_16BIT.jpg


Como diz no tutorial da Tek o bit menos significativo fica no início da rede e o mais significativo fica no final dela:

Image 2 Tutorial R2R DAC.png


e o valor de Vout na saída é dado por

Image 10 Tutorial R2R DAC.png
Você não está autorizado a ver ou baixar esse anexo.
pamv
Byte
 
Mensagens: 450
Registrado em: 20 Jun 2016 21:47

Re: Como ler um dado de 16 bits

Mensagempor KrafT » 20 Dez 2017 12:41

pamv escreveu:Uma outra coisa que eu só percebi hoje, talvez seja só no desenho, a ordem dos bytes (MSB,LSB) está trocada naquela figura do R-2R que você postou:


Mas tá trocado na tabela também, logo o erro se anula.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2033
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Como ler um dado de 16 bits

Mensagempor Vonnilmam » 20 Dez 2017 16:46

Sim, kraft, você esta correto na sua observação.

Como eu disse estou treinando com um pic18 algumas proezas com geração de timbres e controle, e a senoide é a segunda etapa que estou mexendo e pedindo ajuda de vocês e sou grato por isso. Para gerar uma amostra e simplesmente reproduzir ela no formato 8bits, não enfrentei nenhum problema, tanto que nasceu uma bateria eletrônica dos testes realizados (se alguém desejar, enviarei o fw). Venho a algum tempo, para não dizer anos, idealizando esse projeto "um synth wave table ou PCM", acumulei muito estudo sobre o assunto, tanto que acabei me rendendo a linguagem C, por sua versatilidade e "inteligencia" na criação de projetos de fw.

Hoje, com os preços dos MCUs despencando e as velocidade e capacidades de memória crescendo, estou tomando coragem e colocando a mão na massa :roll:

Já passei a fase de testes com DDS, ví os prós e contras na prática e o que notei foi: A estabilidade e precisão de frequencia é impar, muito excelente, mas tenho notado alguns expúrios na onda, seja ela de que forma for ou método, quer seja lendo uma tablela rotacional ou incrementando uma tabela externa (onde é possível alocar uma onda qualquer) e reproduzi-la com controle de inicio, meio e fim (looping)...mas tenho nota o tal do "gift", enfim um ruido de funto (mínimo mas ainda tenho que trabalhar nisso para entender a origem e corrigir). Agora estou na fase de rodar os sample loops que tenho criado, agreguei bastante experiência sobre essa técnica nos decorres dos anos.

Como eu disse, o intuíto é entender os procedimento e do porque isso ou aquilo acontece e conseguir "enxergar" a solução de forma clara.

Em relação ao DDS, acabei desenvolvendo com MCUs pic uma geradora musical completa, com polifonia de 16 canais, utilizando essa técnica e recorrendo (devido a velocidade dos chips envolvidos) a técnicas dos anos 80 para gerar os sustain, sendo dois tipos (percusivo e contínuo) esse ADSR tem esses dois tipos grafados no MCU principal de controle que gerencia os chips DDS. Esses canais (16) estão divididos para obedecer a dois teclados (44,49 ou 61 notas) independentemente e também foi dedicado (1) canal para reproduzir os sons de uma pedaleira, sintetizando o controle e geração para um órgão eletrônico. Já os filtros são controlados por tensão, essa tensão vem de um DAC 8bits que trabalha em modo SAMPLE HOLD multiplexado (coisa antiga). Os chips DDS, gerão além da frequencia exata, também alturas (pés) em saidas individuais de 16, 8, 4, 2 e 1 pés, essas alturas são responsáveis pela altura de cada (flauta).

Agora a meta é rodar o conceito adquirido ao longo desses anos utilizando a técnica wavetable em um ARM ou DSP, gerar todos os parâmetros e se possível comandar isso tudo dentro do protocolo midi, o mais fiel possível :oops:

Segue a foto do protótipo.

TOPGEM_DDS.jpg
Você não está autorizado a ver ou baixar esse anexo.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Como ler um dado de 16 bits

Mensagempor eletroinf » 20 Dez 2017 16:56

:shock:

E eu me quebrando pra fazer um IIR em ponto fixo com a transformada delta...
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 705
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Como ler um dado de 16 bits

Mensagempor Vonnilmam » 23 Dez 2017 11:45

Eu tenho uma dúvida interessante e peço a ajuda de vocês.

Referindo-se a mistura de sons ou sinais analógicos digitalmente convertidos em arquivos para reprodução num DAC de 8 bits.

8 bits possui um tamanho de 256 bytes, logo esse é o tamanho do buffer máximo.

Para se "mixar" 2 ou mais arquivos de audio, segui a seguinte regra:

"somando os arquivos (no caso 8 bits de tamanho cada um) e depois divido a soma pelo total de arquivos envolvidos" ou como no meu caso, eu fiz a soma e depois desloquei
a direita a quantidade de casas de acordo com a quantidade somada, sou seja, para 4 arquivos somados, desloquei 2 casas a direita, isso porque 256+256+256+256 = 1024 - 1 = 1023 (tamanho máximo) ou seja 1111111111 (10bits) >>2 = ajuste para caber dentro do buffer de 8 bits. Justamente, se eu consegui expressar corretamente, eu desloquei 2 casas a direita, afim de caber os 10bits dentro do buffer de 8 bits do DAC que no caso é de 8 bits também.

Minha questão é: Nesse caso quando eu desloco a direita 2 bits, estou na verdade "perdendo" os dois bits menos significativos ou seja 2² = 4 bits se perdem, na prática ocorre uma pequena perda de sinal em termos de volume e notei também que há uma ligeira "distorção" no final da "onda", acredito ser divido ao fato de perder esses bits....
Analisando a estrutura de um DSP da texas, notei que existe um tal de "MAC", pelo que entendi ele ajusta, realiza uma amortização se assim posso dizer, sobre o sinal resultante da soma, eu pergunto, esse ajuste feito no MAC é simplesmente um deslocamento a direita ou é feito algum cálculo para minimizar ou eliminar o "corte" dos bits deslocados a direita.

Ai,ai,ai, coisa de doido...

Viu Kraft, eu ajustei o volume subtraindo valores sobre a tabela que é jogada no DAC, pois multiplicando como você mencionou não deu certo, ou eu entendi errado.

Vou testar hoje a senoide que você gerou, PALM...
Obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Como ler um dado de 16 bits

Mensagempor Aquino » 23 Dez 2017 14:35

A questão do volume, neste caso é um teste feito no matlab. Cada amostra é multiplicada por um valor que poder ganho ou atenuação.
A ideia para o MCU é a mesma, porém fazendo tudo com ponto fixo escalado executando a cada amostra e não no buffer todo.

matlab code
function [resultado] = multiplicadorGanho(amostras,ganho)

tamanhoAmostras = length(amostras);

for i=1:tamanhoAmostras,
amostras(i,1) = amostras(i,1) * ganho;
end

resultado = amostras;

end
"...People who are really serious about software should make their own hardware..." Alan Kay
Aquino
Dword
 
Mensagens: 1717
Registrado em: 12 Out 2006 22:24

Re: Como ler um dado de 16 bits

Mensagempor Vonnilmam » 23 Dez 2017 17:34

Obrigado kraft, pela explicação.

Como eu faço para "ler" o carry de um byte, em mikroc?

Em ASM eu faria:

BTFSC STATUS, C
....COM CARRY!
....SEM CARRY!
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Como ler um dado de 16 bits

Mensagempor Vonnilmam » 23 Dez 2017 20:51

Perdão, quis dizer AQUINO...
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Como ler um dado de 16 bits

Mensagempor pamv » 23 Dez 2017 21:21

Vonnilmam escreveu:Obrigado kraft, pela explicação.

Como eu faço para "ler" o carry de um byte, em mikroc?

Em ASM eu faria:

BTFSC STATUS, C
....COM CARRY!
....SEM CARRY!


O carry não é do byte é do registrador de status, ele é "ligado" quando uma operação produz "vai 1", em linguagem de alto nível isso não aparece/é acessível até onde eu sei
pamv
Byte
 
Mensagens: 450
Registrado em: 20 Jun 2016 21:47

Re: Como ler um dado de 16 bits

Mensagempor eletroinf » 24 Dez 2017 15:41

Quando eu utilizava o CCS, eu definia os registradores, como por exemplo

#byte porta = 0x05

E depois os bits individualmente:
#bit bt_entra = porta.4
#bit bt_cancel = porta.5

e assim por diante.

Acredito que isso possa ser feito neste compilador também, é só olhar qual é o bit Carry do registrador status.

Obviamente que a forma de fazer deve variar um pouco, pois esse jeitão dos defines eu só vi no CCS.

Edit:
Achei este site com informações sobre acessar os bits:
https://download.mikroe.com/documents/c ... l_bits.htm
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 705
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Como ler um dado de 16 bits

Mensagempor Vonnilmam » 25 Dez 2017 10:44

Boa, eletroinf, obrigado pelas dicas.

Eu quero desejar a todos os colegas, Feliz natal e próspero ano novo, com muita saúda Paz e principalmente a Bençãos de Deus.

Obrigado a todos...
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Como ler um dado de 16 bits

Mensagempor barboza » 26 Dez 2017 20:39

pamv escreveu:
Vonnilmam escreveu:Obrigado kraft, pela explicação.

Como eu faço para "ler" o carry de um byte, em mikroc?

Em ASM eu faria:

BTFSC STATUS, C
....COM CARRY!
....SEM CARRY!


O carry não é do byte é do registrador de status, ele é "ligado" quando uma operação produz "vai 1", em linguagem de alto nível isso não aparece/é acessível até onde eu sei


neste caso pode salvar o resultado em uma variável de tipo maior e testar o bit mais significativo.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 940
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Como ler um dado de 16 bits

Mensagempor Vonnilmam » 31 Dez 2017 10:04

Obrigado pela dica barbosa.

Vamos ver se eu compreendi.
Segue uma rotina que imaginei com base na sua DICA barbosa.


unsigned int var_resultado;
unsigned char var_a, var_b;

var_a = 240;
var_b = 30;

var_resultado = var_a + var_b; // LOGO A SOMA DESSES REGISTROS É IGUAL Á 270 (LOGO ESTOUROU O CARRY)
var_resultado >>1;

if (var_resultado.f7 == 1) {carry é igual a 1, houve o estouro} else {carry é igual a 0, não houve estouro};
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Como ler um dado de 16 bits

Mensagempor barboza » 31 Dez 2017 10:50

Vonnilmam escreveu:Obrigado pela dica barbosa.

Vamos ver se eu compreendi.
Segue uma rotina que imaginei com base na sua DICA barbosa.


unsigned int var_resultado;
unsigned char var_a, var_b;

var_a = 240;
var_b = 30;

var_resultado = var_a + var_b; // LOGO A SOMA DESSES REGISTROS É IGUAL Á 270 (LOGO ESTOUROU O CARRY)
var_resultado >>1;

if (var_resultado.f7 == 1) {carry é igual a 1, houve o estouro} else {carry é igual a 0, não houve estouro};


If (resultado >= 256)

Só isso!
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 940
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

AnteriorPróximo

Voltar para DSP

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

cron