
Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes
| |||||
Re: Como ler um dado de 16 bitsAcho 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
Re: Como ler um dado de 16 bits
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: Como diz no tutorial da Tek o bit menos significativo fica no início da rede e o mais significativo fica no final dela: e o valor de Vout na saída é dado por Você não está autorizado a ver ou baixar esse anexo.
Re: Como ler um dado de 16 bits
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
Re: Como ler um dado de 16 bitsSim, 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 ![]() 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 ![]() Segue a foto do protótipo. Você não está autorizado a ver ou baixar esse anexo. VonNilmam "Assembler" e agora "C"
Re: Como ler um dado de 16 bits![]() 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."
Re: Como ler um dado de 16 bitsEu 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"
Re: Como ler um dado de 16 bitsA 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) "...People who are really serious about software should make their own hardware..." Alan Kay
Re: Como ler um dado de 16 bitsObrigado 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"
Re: Como ler um dado de 16 bits
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
Re: Como ler um dado de 16 bitsQuando 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."
Re: Como ler um dado de 16 bitsBoa, 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"
Re: Como ler um dado de 16 bits
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.
Re: Como ler um dado de 16 bitsObrigado 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"
Re: Como ler um dado de 16 bits
If (resultado >= 256) Só isso! Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
| ||
Quem está onlineUsuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes |
||