Ajuda com sine wave

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor msamsoniuk » 20 Jun 2009 02:38

proex escreveu:Vonnilmam, pra somar as amostras, faça um OR entre elas e jogue o resultado no D/A.


mas dae altera as formas de onda, nao eh?
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor barboza » 20 Jun 2009 11:54

Marcelo Samsoniuk escreveu:
proex escreveu:Vonnilmam, pra somar as amostras, faça um OR entre elas e jogue o resultado no D/A.


mas dae altera as formas de onda, nao eh?


É uma soma!
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 msamsoniuk » 20 Jun 2009 13:13

o OR nao eh uma soma... soh funciona como tal quando vc nao usa os canais simultaneamente, dae quando existe audio em varios canais, vc tem chiado na saida que lembra as entradas originais... nao acho muito interessante! hehehe ;)

de fato, eu imagino que a ideia do OR eh para evitar clip, o que eh mais complicado com a soma.

por exemplo, dois canais de 16 bits somados vao resultar em 17 bits, portanto vc precisa fazer um shift de 1 bit para evitar clip. com 16 canais somados, vc obtem um resultado de 20 bits e precisa fazer um shift de 4 bits para evitar clip.

isso equivale a ter efetivamente apenas 12 bits em cada canal de entrada, mas as formas de onda na saida ficam mais coerentes.

barboza escreveu:
Marcelo Samsoniuk escreveu:
proex escreveu:Vonnilmam, pra somar as amostras, faça um OR entre elas e jogue o resultado no D/A.


mas dae altera as formas de onda, nao eh?


É uma soma!
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Vonnilmam » 20 Jun 2009 13:32

Olhem só, estou me animando com os resultados deste post, muito obrigado a todos vcs pelas valiosas dicas, uma coisa que eu em particular valorizo muito é a informação e me sinto feliz por participar desse forum e como pouquinho que tenho de formação, poder também ajudar na informação!

Se eu bem entendi "Marcelo Samsoniuk", vc usaria um shift para deslocar os bits excedentes para a esquerda! "despresando assim os bits menos significativos, correto? Assim a forma da onda seria muito pouco "DEFORMADA"!

informação em 16bits, sendo duas amostras diferentes a serem "mixadas/somadas" para serem enviadas para um dac de 16bits (vale lembrar que um dac de 16bits contem um buffer de 16bits e nesse caso se fizermos a soma haverá o estouro para acima dos 16bits)

Tipo: canal A= 0010111010101011
canal B= 1111111110000000

soma tudo = 10010111000101011 "resultou em uma soma de 17bits"
shift esquerda 0010111000101011

Mas como o dac só tem um buffer de 16bits e a sugestão foi deslocar para a esquerda 1bit e depois enviar para o dac:

Será que eu entendi certinho...Vou testar agora mesmo essa lógica proposta pelo "Marcelo Samsoniuk" e também pelo Prex...

Eu realmente agradeço o interesse de todos por esse tópico, visto que o mesmo envolve técnicas interessantes em relação a amostragem de dados analogicos e a reconstrução dos mesmos de forma adquada a sua forma original quer seja wave table ou gerando-se uma sine wave via calculos de um DSP....
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor Vonnilmam » 20 Jun 2009 13:49

...........OPS....

relendo melhor o ultimo post do "Marcelo Samsoniuk", percebi que a "quebra" dos bits menos significativos poderia ser realizada antes da soma:

Canal A = 0010111010101011
Canal B = 1111111110000000
Shift A = 010111010101011 (desloca para a esquerda um bit=15bits)
Shift B = 111111110000000 (desloca para a esquerda um bit=15bits)

Soma canal A+B (após deslocamento a esquerda)=

A = 010111010101011 (15bits)
B = 111111110000000 (15bits)
resultado a ser enviado ao DAC = 1010111000101011 (16bits)

Caso o resultado da soma fique com 15bits de tamanho, qual bit deve ficar em 0 ou em 1 em relação ao comprimento do buffer (seria o bit0 ou o bit15)...

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

Mensagempor msamsoniuk » 20 Jun 2009 14:28

mas dae vc perde um bit valioso! :)

pensa soh nos valores saturados para 16 bits com sinal:

32767 = 0111.1111.1111.1111
32767 = 0111.1111.1111.1111

a soma eh:

65545 = 0.1111.1111.1111.1110

nao deu overflow, mas tem 17 bits por causa do sinal. com shift apos a soma fica:

32767 = 0111.1111.1111.1111

ou seja, o mix das duas amostras no pico resulta em uma amostra no pico... no outro caso temos novamente:

32767 = 0111.1111.1111.1111
32767 = 0111.1111.1111.1111

shiftando:

16383 = 0011.1111.1111.1111
16383 = 0011.1111.1111.1111

e somando, temos:

32766 = 0111.1111.1111.1110

mas o valor eh diferente! pq a soma com pre-shift eh diferente da soma pos-shift ? pq vc jogou 2 bits de informacao fora usando o pre-shift e no pos-shift vc jogou apenas bit.

outra vantagem de fazer o shift depois: vc pode usar um numero variado de canais. para 3 canais por exemplo, vc teria:

32767+32767+32767=98301

o que seriam 18 bits, portanto vc precisa ganhar 2 bits. mas simplesmente fazer o shift dele resultaria em 24575, o que nao bate com o que vc espera (3 picos na entrada tem que produzir 1 pico na saida).

mas ao inves de shiftar fazer a divisao pelo numero de entradas resulta no valor correto: 98301/3 = 32767.

assim, a conclusao eh que a melhor configuracao seria fazer a somatoria das entradas e dividir uma vez na saida, pelo numero de canais, motivo pelo qual eh importante utilizar um DSP que permita overflow nas operacoes.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Vonnilmam » 20 Jun 2009 15:21

Legal "Marcelo Samsoniuk", então passando para a pratica!


Seria mais interessante ou o ideal, fazermos a soma e depois dividir pelo numero de de entradas para obter uma saida "correta"....

Tipo:

Vamos considerar duas amostras "de timbres analogiocos (no meu caso eu tenho 20 amostras de instrumentos de percução que irão constituir uma bateria eletronica (essas amostras estão no formato PCM com sample rate de 22khz e resoluão de 16 bits (vou usar 16 bits para facilitar a logica explicativa)) contidas numa memoria. Ok,
Eu quero reproduzir dois timbres simultaneamente:

O frame contido na memoria wave tem um comprimento de 16bits:

Timbre BUMBO = b'1111.1111.0000.0000' = 62.280
Timbre Pratos = b'1111.1111.1111.0000' = 65.520
agora somamos e temos o resultado = 127.800

Agora dividimos pelo numero de timbres tocados simultaneamente ou seja:

127.800 / 2 = 63.900 ou seja 1111100110011100 (os desejados 16 bits que irão ser enviado para o DAC, todavia nós teriamos o soar dos dois timbres simultaneamente, correto?)

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

Mensagempor Djalma Toledo Rodrigues » 20 Jun 2009 15:32

Marcelo Samsoniuk escreveu:... mas ao inves de shiftar fazer a divisao pelo numero de entradas resulta no valor correto: 98301/3 = 32767.

Concordo não. Resultou porque foi adotado 3 valores iguais.

10 + 2 + 3 = 15

(10 + 2 + 3) / 3 = 5
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 20 Jun 2009 17:25

meo, olha que coisa estranha.
Eu uso um componente para o delphi "audiolab" FREE e da pra tirar agua de preda!!...

Eu tinha passado uma réiva lascada algumas vezes, pois quando eu tocava dois audios ou mais, simultÂneamente eu percebia que o nivel do sinal diminuia um pouco.......

Lendo esse post, fiz alguns testes com um FFT na saida dos somadores ..

Realmente...

Coloquei dois audios continuos.
1khz
3khz.
Os dois com com mesmo nivel e tal´s, acontece que na saida do mixer acontece uma atenuação. Esta atenuação fica na casa dos -3DB +/-...

putz...

Eu ainda não tinha pensado nessa aplicação, mais agora da pra acabar minha bateria eletronica com os wave tables!!!!!!!!!!!!
Casilda meo, porque nenhum mala comentou isso aqui antes...rsrsrs

fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 20 Jun 2009 18:17

Mas em um amplificador analógico a Saída varia de amplitude, algébricamente, quanto mais forem as frequências presentes no Sinal.
Editado pela última vez por Djalma Toledo Rodrigues em 20 Jun 2009 18:43, em um total de 3 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor msamsoniuk » 20 Jun 2009 18:28

nao sei se entendi sua observacao... mas eu considerei a amostra com maior valor pq estamos verificando a condicao de overflow no mixer.

imagine duas senoides de frequencia levemente diferente e, num dado instante, elas entram em fase. se os picos tiverem ambos valores 32767, a soma vai gerar uma amplitude que estoura o maior valor sinalizado valido. da mesma forma, se elas estiverem completamente fora de fase, uma com valore 32767 e outra com valor -32767, a soma vai ser zero. tem logica, se elas tem quase a mesma frequencia e estao completamente fora de fase, a mixagem delas vai eliminar ambas do sinal resultante.

o caso que vc mostrou eh valido e eh dessa forma mesmo. quando vc mixa as amostras com valores diferentes, vc tem uma media dos valores... isso quer dizer que as amostras originais somem ? de certa forma sim, a informacao ali do 10, 2 e 3 jah eram. mas se vc aplicar o sinal mixado em um analisador de espectro, bingo, vc recupera as senoides mixadas limpinhas, com valores 10, 2 e 3... mas como ?! :)

isso ocorre pq na mixagem as amostras com valor 10, 2 e 3 somem numericamente na amostra, mas nao na dinamica do negocio do ponto de vista de frequencia, dae tendo as outras amostras vizinhas, vc consegue recuperar elas! parece que o tal do fourier no fim das contas estava certo :)

Djalma Toledo Rodrigues escreveu:
Marcelo Samsoniuk escreveu:... mas ao inves de shiftar fazer a divisao pelo numero de entradas resulta no valor correto: 98301/3 = 32767.

Concordo não. Resultou porque foi adotado 3 valores iguais.

10 + 2 + 3 = 15

(10 + 2 + 3) / 3 = 5
.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor msamsoniuk » 20 Jun 2009 18:35

entao, apesar de vc obter um unico numero, na dinamica do negocio, com a sucessao de amostras, vc percebe que os dois timbres continuam presentes! eh quase como se estivesse um modulado no outro, mas nao eh exatamente uma modulacao :)

Vonnilmam escreveu:Legal "Marcelo Samsoniuk", então passando para a pratica!


Seria mais interessante ou o ideal, fazermos a soma e depois dividir pelo numero de de entradas para obter uma saida "correta"....

Tipo:

Vamos considerar duas amostras "de timbres analogiocos (no meu caso eu tenho 20 amostras de instrumentos de percução que irão constituir uma bateria eletronica (essas amostras estão no formato PCM com sample rate de 22khz e resoluão de 16 bits (vou usar 16 bits para facilitar a logica explicativa)) contidas numa memoria. Ok,
Eu quero reproduzir dois timbres simultaneamente:

O frame contido na memoria wave tem um comprimento de 16bits:

Timbre BUMBO = b'1111.1111.0000.0000' = 62.280
Timbre Pratos = b'1111.1111.1111.0000' = 65.520
agora somamos e temos o resultado = 127.800

Agora dividimos pelo numero de timbres tocados simultaneamente ou seja:

127.800 / 2 = 63.900 ou seja 1111100110011100 (os desejados 16 bits que irão ser enviado para o DAC, todavia nós teriamos o soar dos dois timbres simultaneamente, correto?)

Obrigado,
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Djalma Toledo Rodrigues » 20 Jun 2009 18:51

Marcelo Samsoniuk escreveu:.... imagine duas senoides de frequencia levemente diferente e, num dado instante, elas entram em fase. se os picos tiverem ambos valores 32767, a soma vai gerar uma amplitude que estoura o maior valor sinalizado valido. da mesma forma, se elas estiverem completamente fora de fase, uma com valore 32767 e outra com valor -32767, a soma vai ser zero. tem logica, se elas tem quase a mesma frequencia e estao completamente fora de fase, a mixagem delas vai eliminar ambas do sinal resultante....


Caso do Batimento Zero.
Se ambos sinais tiverem frequência e amplitude iguais a resultante irá variar, em amplitude, de Zero ao Dobro, de acordo com a variação de fase entre elas.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor proex » 20 Jun 2009 19:22

Marcelo, exemplo da aplicação de Mistura usando OR e XOR, aproveitando seus numeros.

Seu calculo com adição:

32767 = 0111.1111.1111.1111 +
32767 = 0111.1111.1111.1111

Temos:
65545 = 0.1111.1111.1111.1110

Esse resultado requer Shift para recompor o tamanho da palavra do AD.


Seu calculo com shift e posterior Adiçao:
16383 = 0011.1111.1111.1111
16383 = 0011.1111.1111.1111

e somando, temos:

32766 = 0111.1111.1111.1110

Meu calculo com OR:

32767 = 0111.1111.1111.1111 OR
32767 = 0111.1111.1111.1111

Temos:
32767 = 0111.1111.1111.1111

Ou seja, economizamos dois Shifts e nao precisamos nos preocupar com Overflow.

A regra é:
Para sinais de mesma polaridade, use OR.
Para sinais de polaridades diferentes, use XOR.

Exemplo:

32767 XOR -32767 = Zero

É uma boa forma de economizar instruçoes, tornar o código mais rapido, sobrando mais tempo pra fazer mais coisas.

Assim, até com PIC da pra brincar com audio digital e até implementar filtros respeitando os limites de velocidade do chip claro.

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor msamsoniuk » 20 Jun 2009 19:49

eu coloquei imagens das minhas simulacoes neste site:

http://www.darklife.org

a primeira imagem mostra o mixer de 3 senoides usando soma e shift, a segunda imagem o mixer de 2 senoides comparando o metodo anterior com o que o proex sugeriu (usando or e xor... acho que ficou ateh pior do que apenas usando or, apesar de nao ficar bom como a soma e shift).

vou fazer mais testes depois para ver se realmente nao tem como fazer com operacoes logicas... note na onda resultante que parece q tem uma assimetria entre fazer isso com valores cima de zero e abaixo de zero e soh o xor nao resolve.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron

x