Waves x controle de frequencia

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor barboza » 01 Mar 2010 10:01

Marcelo Samsoniuk escreveu:ueh, para fazer um gerador de 1 a 11025Hz vc vai ter 11025 tabelas? nao tem nexo quando vc pode ter 1 tabela e apenas mudar o sistema de varredura... e vc precisa ter a onda inteira, visto que nem sempre os semiciclos sao completamente simetricos.

proex escreveu:Nao Fabim o que eu disse é exatamente isso:

ELE TEM SIM QUE TER UMA TABELA PARA CADA FREQUENCIA, MANTENDO O SAMPLING FIXO.

SERIAM TABELAS CURTAS, CONTENDO APENAS O SEMICICLO POSITIVO E NEGATIVO.

Assim não precisa fazer calculeira nenhuma, basta ler a tabela correspondente á tecla que foi acionada.

.



Isso se a resolução for de 1Hz, se tiver fração, f***.

Realmente faz mais sentido usar uma tabela de uma senoide com 1 ciclo e mudar somente a varredura.
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 » 01 Mar 2010 10:12

"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 proex » 01 Mar 2010 10:45

Marcelo Samsoniuk escreveu:ueh, para fazer um gerador de 1 a 11025Hz vc vai ter 11025 tabelas? nao tem nexo quando vc pode ter 1 tabela e apenas mudar o sistema de varredura... e vc precisa ter a onda inteira, visto que nem sempre os semiciclos sao completamente simetricos.

proex escreveu:Nao Fabim o que eu disse é exatamente isso:

ELE TEM SIM QUE TER UMA TABELA PARA CADA FREQUENCIA, MANTENDO O SAMPLING FIXO.

SERIAM TABELAS CURTAS, CONTENDO APENAS O SEMICICLO POSITIVO E NEGATIVO.

Assim não precisa fazer calculeira nenhuma, basta ler a tabela correspondente á tecla que foi acionada.

.



A aplicação do Vonilman é para geraçao de notas musicais. Ele não vai conseguir precisao na divisão do Timer para gerar as varreduras que irão produzir exatamente a escala musical.

Se precisar reproduzir varias notas simultaneamente (polifonia), então danou-se.

Se ele desejar ter um teclado padrão de piano, com 88 teclas, ele precisará somente de 88 tabelas.

Qual a vantagem?

Não precisa de calculeira pra gerar as senoides, o Sampling é fixo e sobra bastante tempo para fazer polifonia, se precisar, e sobra tempo pra tratar filtros , envelopes etc.

Não é a toa que os grandes fabricantes de teclados como Roland, Yamaha e Casio adotam esse metodo.

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

Mensagempor Vonnilmam » 01 Mar 2010 12:09

Bom dia a todos,


Caramba!

Eu tô começando a "degustar" esse punhado de informação útil, muito obrigado a todos os amigos!

Olha só, proex, eu entendi o que vc quiz dizer, exemplo dessa técnica é a bateria eletrônica que eu fiz, utilizei um pic877A + uma eprom 27c010 (128Kbit) + um conversor paralelo r2r com buffer e filtro PB, o sample rate é de 22.050hz:

O que acontece nessa bateria é o seguinte: As amostras possuem diversas frequencias para cada instrumento, porque cada instrumento de percução tem sua frequencia própria, assim o BASSDRUM, os PRATOS etc, porém o sample rate é o mesmo...

Então seria a mesma técnica para gerar todas as notas, ok, certinho...então eu amostraria as notas musicais que vou utilizar criando uma tabela (no meu caso o meu SAMPLEADOR só faz amostras com um tempo minimo de 1 segundo, e eu acho que entendi porque ele faz isso: 1/T=F preciso de sample rate fixo ex: 44.100hz e fazer um sample de 1 segundo para obter a frequencia: tá certo esse raciocinio...

O fabim, vc tem razão tô mesmo meio perdido nesse reciocínio de wave table, por isso estou pedindo a ajuda de vocês, afim de eu poder entender melhor essa bagaçeira...rsosos...

Olha só eu gerei algumas ondas atraves do meu programinha adsynt, são senoide de 16bits de resolução, sample rate de 44.100hz, duração de 1 segundo...

cada wave (senoide) gerada consumiu 88.200 bytes, então se eu entendi minha tabela para gerar minhas 57 notas musicais precisarei ter uma memória para armazenar todas essas tabelas com suas respectivas frequencias no tamanho de: 57x88.200=5.027.400 bytes certinho...

Agora só tem u detalhe nesse metodo, as amostras que eu fiz foram baseadas em um tempo de 1 segundo por esse motivo a tabela ficou tão grande, eu queria saber se eu posso pegar apenas um ciclo positivo e outro negativo desta onda e repeti-lo x vezes afim de conseguir gerar a nota musical desejada com base no sample que fiz para cada nota, é possível isso?

Muito 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 Vonnilmam » 01 Mar 2010 12:30

Olhem só...


Eu fiz a seguinte experiencia "teórica", eu amostrei no meu programinha adsynt ou melhor dizendo esse programa me dá a possibilidade de gerar qualquer nota musical o frequencia que eu desejar de forma a formar uma senoide com resolução de 8 bits ou 16bits com sample rates variados.

Nesse caso eu gerei uma frequencia de 440,000hz com sample rate de 48khz (porque utilizei 48khz? porque nessa frequencia eu consigo dividi-la por numeros inteiros) resolução de 16bits...tudo bem até aquí!

Porém minha tabela ficou com 96 mil pontos, então eu imaginei se é fato que esse 96 mil pontos são repetições ciclicas da fundamental (quero dizer da onda base), então eu imaginei se eu pude-se ir dividindo (utilizei um editor de memória para ler o conteudo do arquivo), eu fui dividindo os 96.000 pontos por 256 e cheguei a 375 pontos nessa tabela, minha dúvida é: será que esses 375 pontos são o inicio e o fim da senoide amostrada, porque se for então eu posso pegar todos os 375 pontos de cada tabela (considerando o que o proex disse em montar tabelas para cada nota) e só fazer uma rotina para rodar cada amostra de 375 pontos (observe que para cada amostra loquei uma frequencia musical) estou imaginando que nesses 375 pontos conterão o ciclo da nota na frequencia que amostrei, ok...

será que tá certo o meu raciocinio...

muito 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 barboza » 01 Mar 2010 12:52

A teoria esta certa, mas seus dados não.

Porque quis dividir por 256?

Se a freqüência é 440Hz, então na sua amostra de 1seg, você tem 440 x a mesma forma de onda (seno) repetidas.

Como sua freqüência de amostragem escolhida foi 48K, com resolução de 16 bits (2 bytes) você teve uma saída de 96K bytes como arquivo.

Código: Selecionar todos
48K amostras / seg * resolução da amostra.
48K/s * 2 = 96K bytes


Bem, como uma freqüência de 440Hz a 48K, você tem:

Código: Selecionar todos
96K / 440 = ~218 amostras (2 bytes)  por ciclo.


ou:

Código: Selecionar todos
1s/440 = 2.[u]27[/u] ms cada período


Se sua taxa de amostragem é 48K, então:

Código: Selecionar todos
1s/48K = 20.8[u]3[/u] us por amostra


Então:
Código: Selecionar todos
2.27ms/20.8us = 109 amostras por ciclo.


Como comentamos, se tiver a possibilidade (recurso) você pode calcular e usar uma mesma tabela de seno e gerar múltiplas freqüências mudando só o index de acesso a tabela para cada freqüência, mantendo inclusive a mesma taxa de amostragem/reprodução.
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 fabim » 01 Mar 2010 13:05

vonnillman.

Não confunda as coisas..
UM teclado, tem frequencias@@@@@, frequencias diferentes para cada nota, e a onda pode ser senoide, triangulo, ou quadrado. depende do som que você quer.
Tomando como base em piano.

Quanto você aperta a tecla do lá por exemplo, em 440hz.

Você possui 4 produtos!!

1° Volume do atack
2° volume do tempo de persistencia
3° tempo de decay da nota lá.

Isso é a mesma coisa para bateria.....


No seu caso, você não quer uma wave table.. você gostaria de fazer um teclado, que as 5^8 fosse um multiplex pro ARM "so uso pic de vez em quando agora rs", poder ler a tecla precionada, saber qual frequencia ele vai fazer o SUM de amostragem.

Veja por exemplo...

Tu aperta o LA e o Si. 1/8 de diferença de ton, ou seja 440/8 = T
Si = 440 + T... Bla bla..

Bom, como você sabe a diferença de frequencia de uma nota pra outra, desconsiderando o que eu expliquei lá encima...
Você vai fazer o que ?
Imagina assim.

LA apertado constante sem soltar. "so o teclado vai fazer o som da frequencia constante, no piano não, o decay vai diminuindo o volume até o som desaparecer, pois piano tem martelete por tok, que da uma unica pancada na corda e se afasta".
440HZ então, e imagina assim, quando a senoide de 440hz passou de zero para negativo, você apertou a tecla SI. certo ?

Ai que chegou a **** confusão que você esta bolado!!.


44.1khz de sample rate.
frequencia 440 hz.

44100 / 440 = 100,22727272727272727272727272727 amostras por senoide em semi ciclos.
48000 / 440 = 109,09090909090909090909090909091 amostras por senoide em semi ciclos.
96000 / 440 = 218,18181818181818181818181818182 amostras por senoide em semi ciclos

Agora entenda uma coisa, você cria uma tabela com sei lá, 128 pontos que vão emular a senoide em 440hz. veja aí encima.. 128 pontos só se o seu sample rate for > 48K..
Agora imagina o seguinte, uma frequencia de 10hz, na mesma tabela com 128 amostras. Pra essa senoide sair perfeitinha, vai ser um problemão!! se usar um pwm, imagine o tempo pra não dar distorção, se for usar RC vai ser um problema tambem. pois vocÊ não vai ter uma tabela COSENO e ant coseno, por causa do tempo !!!

SE você configurar a sua placa pra 48khz, e mandar gerar a frequencia de sei lá os mesmos 10hz.
Sabe quantas amostras o programa vai calcular pra cada um hz desse ? e simplesmente vai criar um loop infinito ?

48000 / 10 = 4800 amostras!! para quanto ? 16 bits ? 8 bits ? 24 bits ?

agora vem a parte indecente.

Sabe como é que funca ?
LEmbre-se dominio de tempo, e samples..

imagina que dentro do dsp tu esta lendo duas waves e quer simplesmente multiplexar elas e jogar para o falante.

facil:
Saida = AMOST1 + AMOST2 / 2;

se fossem 4 waves, amost1 + 2 + 3 + 4 / 4....

Deu pra entender a parte de tabela, de sample etc.. +/- ???
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 Vonnilmam » 01 Mar 2010 14:20

Agora é que eu vi que sou mesmo uma besta quadrada! Tõ com vontade desanimar....

Olha só, eu vou pegar o meu protoboard veio de guerra e vou montar um circuitinho semelhante ao da bateria e vou iniciar os testes praticos deste treco.

Esperem aí, porque logo logo mando novas noticias....

O fabim, por falar em ARM, qual o modelo que tú tá usando? e também esta usando que "compila" para isso?


Muito 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 fabim » 01 Mar 2010 14:24

bom intão Mr dunkey. rs. "só estou lhe acompanhando".
Eu tenho pra brincar o 2148, futuramente mente, o 1768/66..

Num percisa mais que isso não.

O compilador é o KEIL MDK 4.01 com alucinogeno...

o Jtag, é um Super ULINK PARAGUAIO CHINA CLONE de 100 reau.. USB. e tale e coisa e coisa e tale.. só bosnia..

Da pra começar tranquilão.....!!!

Abraçus
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 msamsoniuk » 01 Mar 2010 14:32

voce provavelmente nao leu o codigo direito:

Código: Selecionar todos
interrupcao_timer_44k1hz()
{
  saida[0] = table[(unsigned char)((i*256*f[0])/44100)];
  ...
  saida[n] = table[(unsigned char)((i*256*f[n])/44100)];
 
  mixer(saida[0], ... , saida[n]);

  i++;
}


respondendo suas observacoes:

a) o algoritmo eh o mesmo utilizado para escalar rapidamente imagens e aproveita o mesmo know how. obviamente o wander em relacao a frequencia desejada depende da relacao inteira de (index*tsize*fsynth)/frate, justamente pq o resultado eh um offset na wavetable, mas normalmente o wander e o jitter sao bem pequenos. e da mesma forma que se faz com imagens, vc pode eliminar completamente os desvios usando anti-aliasing.

b) como vc pode ver no codigo acima, estou usando polifonia de n canais e mixando eles segundo o mesmo sample rate fixo de 44100Hz. as frequencias dos canais sao sintetizadas a partir da wavetable e da operacao de escala do indice, nao tem segredo.

c) se ele tiver 88 teclas, estariamos falando de uma unica wave table para as 88 teclas. ao inves de ter 88 wave tables com o mesmo som, vc poderia ter 88 instrumentos diferentes. e se vc pensar em uma guitarra com alavanca, as 88 wavetables vao para o espaco. sintetizando no instante vc pode usar frequencias quebradas e simular a alavanca variando a frequencia linearmente.

d) calcular as tabelas antes acelera, mas mata a essencia do processamento de sinais: fazer em realtime e permitir flexibilidade total. afinal eh para isso que se desenvolvem DSPs de 1 GMAC/s! :)

e) eu duvido muito que os equipamentos profissionais tenham uma wave table diferente para cada tom, mas tambem acho que eles nao tem uma unica wave table para todos os tons. se vc pensar em uma guitarra, eh obvio que seria mais profissional ter uma wavetable para cada corda e entao sintetizar em cima dessa wavetable.

f) uma coisa que ninguem comentou, mas vale a pena lembrar, eh o ajuste de fase quando muda de frequencia. se vc for simular a alavanca da guitarra variando a frequencia, vc tem que fazer uma conta que gera um offset de ajuste de fase. uma alternativa eh permitir a frequencia alterar apenas em ciclos inteiros... mas um cara bom consegue mudar a frequencia dinamicamente no meio do ciclo! :)

mas sei lah, o proex deve manjar mais disso ae.

proex escreveu:
Marcelo Samsoniuk escreveu:ueh, para fazer um gerador de 1 a 11025Hz vc vai ter 11025 tabelas? nao tem nexo quando vc pode ter 1 tabela e apenas mudar o sistema de varredura... e vc precisa ter a onda inteira, visto que nem sempre os semiciclos sao completamente simetricos.

proex escreveu:Nao Fabim o que eu disse é exatamente isso:

ELE TEM SIM QUE TER UMA TABELA PARA CADA FREQUENCIA, MANTENDO O SAMPLING FIXO.

SERIAM TABELAS CURTAS, CONTENDO APENAS O SEMICICLO POSITIVO E NEGATIVO.

Assim não precisa fazer calculeira nenhuma, basta ler a tabela correspondente á tecla que foi acionada.

.



A aplicação do Vonilman é para geraçao de notas musicais. Ele não vai conseguir precisao na divisão do Timer para gerar as varreduras que irão produzir exatamente a escala musical.

Se precisar reproduzir varias notas simultaneamente (polifonia), então danou-se.

Se ele desejar ter um teclado padrão de piano, com 88 teclas, ele precisará somente de 88 tabelas.

Qual a vantagem?

Não precisa de calculeira pra gerar as senoides, o Sampling é fixo e sobra bastante tempo para fazer polifonia, se precisar, e sobra tempo pra tratar filtros , envelopes etc.

Não é a toa que os grandes fabricantes de teclados como Roland, Yamaha e Casio adotam esse metodo.

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

Mensagempor renatokodaira » 01 Mar 2010 16:20

Utilize DDS (Direct Digital Synthesis). Você usa só uma tabela (um ciclo ou um semiciclo) para a os valores da onda senoidal e consegue sintetizar várias frequências de senóides com muito boa resolução (por ex. passos de 0,1Hz ou até mesmo 0,01Hz).
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor fabim » 01 Mar 2010 16:48

Marcelo, eu descordo totalmente de você e do putex.
Será que vocês não entendem que:
Prestenção,








tentar.

Por isso eu afirmo novamente,



entendeu ?

é muito simples, só fazer assim





e pronto

Nossa esses caras complicam muito... Ta doido..

Abraços
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 Vonnilmam » 01 Mar 2010 20:26

olha só turma, o marcelo tocou num detalhe interessante: a FASE da bagaça...é isso mesmo, a fase é importante agora tem mais essa, Há MEU DEUSSSSSS....tô ficando doido...!

O fabim, tem como vc me enviar uma cópia desse maluco MDK alucinadão? há me indica onde vc pegou esse clone!

Hoje vou passar a madrugada montando no prot o circuito de teste, ainda essa semana falo das novidades....

Ainda em relação a observação do marcelo, eu acredito que os caras fazem sim os dois tipos de tecnica, tanto a de gravar uma amostra por nota como também utilizar uma só wave para todas as frequencias, as diferenças são:

- utilizando uma wave para cada nota, temos "perfeição" sobre o timbre reproduzido, porque cada wave esta dentro de sua faixa apropriada de amostragem.

- utilizando uma wave para todas as notas o resultado é que ao mudarmos de oitava há uma ligeira variação no timbre (não na frequencia) só no timbre, portanto quanto maior for a resolução do sample rate menor será essa variação, porém essa técnica é sim a mais utilizada porque utiliza muito menos memória e cabe muito mais waves ou instrumentos diferentes.

os chips da atmel utilizam esse processo de uma unica wave para todas as notas, eu comprei um kit de desenvolvimento com editor de timbres e o raio a quatro, paguei uma graninha maneira, e os waves fornecidos pela atmel (256 timbres, piano, orgão, etc) compõe uma memória de 4 giga x 16bit, o processador utilizado é um arm de 16bits rodando a 50mips....a qualidade de sons é semi-profissional se assim posso dizer.

Bom, aquí no Brasil, tem um camarada que já desenvolveu (entendeu) essa técnica e ele tá utilizando um tms320.....55 da t.i. para fazer a mutreta...
Agora estou me lembrando que chupinhei certa época (só efeito de pesquisa, nada haver com cópia pirata, só para exclarecer, ok) um órgão dixiling e o mesmo utilizava um dsp da analo adsp 2101 (eu acho que esse cara é aberto) e o processo era o mesmo: uma wave contendo todos os samples e o processador carregava uma wave de cada vez na memória ram (timbre do intrumento) e trabalhava segundo essa técnica, o mais esquisito é que o software (assemblado) é pequeno...

sei lá, mas eu não vou desistir,...há eu estava dando uma surfada na net e achei um programa no mínimo interessante feito em c para pic: http://wiki.pic24.ru/doku.php/en/osa/ref/download/intro
Dá uma olhadinha no exemplo do piano que esse doido conseguiu fazer, vejam se há algo de interessante nessa rotina que possamos aproveitar, peço isso a voces, porque tem mais experiencia em C do que eu que tô aprendendo ainda, hunhé, hunhé....

Muito 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 Vonnilmam » 01 Mar 2010 21:06

Só uma perguntinha:

O que vcs acham do kit da microgenios sobre o lpc2148, estou pensando em comprar esse kit para iniciar os trabalhos com o gerador de waves...o que acham é uma boa ou não?

Muito 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 msamsoniuk » 01 Mar 2010 22:52

eu acho que o melhor seria vc testar simular a ideia em um PC com placa de som em modo pcm de 8 bits x 8KHz com umas 2 vozes simultaneas e, entendendo bem o processo, comecar a expandir. depois que vc tem o sistema todo refinado e debugado, vc parte para um dsp ou mcu. no linux eh relativamente simples acessar a placa de som em pcm 8 bits x 8KHz:

Código: Selecionar todos
int main()
{
  FILE *fp = fopen("/dev/dsp","w");

  int i,s0,s1;

  char table[256] = { ... };

  for(i=0;;i++)
  {
    s0 = table[(unsigned char)((i*256*f)/8000)];
    s1 = table[(unsigned char)((i*256*f)/8000)];
    saida = (s0+s1)/2;
    fputc(saida, fp);
  }
}


e nem precisa de interrupcao ou timer, o fputc() ali jah cadencia corretamente o fluxo de audio.

Vonnilmam escreveu:Só uma perguntinha:

O que vcs acham do kit da microgenios sobre o lpc2148, estou pensando em comprar esse kit para iniciar os trabalhos com o gerador de waves...o que acham é uma boa ou não?

Muito obrigado,
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: Bing [Bot] e 1 visitante

cron

x