Waves x controle de frequencia

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor zazulak » 03 Mar 2010 08:57

...de uma oitava pra outra, a frequencia dobra...
zazulak
Nibble
 
Mensagens: 97
Registrado em: 06 Out 2007 16:40

Mensagempor msamsoniuk » 03 Mar 2010 09:02

imagina gerar uma escala de 16.352Hz a 7902.1Hz com intervalos multiplos de 1.0594631 no pic do proex? :D hahaha

tem que partir para ponto flutuante mesmo...e isso prova definitivamente que nao tem como fazer usando um pic programado em asm! hehehe aquele codigo com ponto flutuante que eu compilei no PC acredito que compila facil para arm, coldfire e blackfin, pq apesar deles nao terem suporte a ponto flutuante no hardware, fica relativamente facil emular ponto flutuante de precisao simples com eles.

muito bom o site fabim! :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor vtrx » 03 Mar 2010 10:21

O La de um violao equivale o lá da 5° oitava de um piano.. 440hz...
Ja o da guitarra esta ainda mais alto, e do violino ainda mais alto..

Fabim,o Lá de um violão é o mesmo de uma guitarra,apenas a guitarra tem uma escala maior atingindo mais uma oitava,mas isso apartir da décima segunda casa (os violões tambem tem mas geralmente é mais curto).
Quinta corda solta do violão é o memso da guitarra,a não ser que está escutando um instrumento desafinado,acho que vou ter que gravar um sample pra voce ouvir...
tem que partir para ponto flutuante mesmo...e isso prova definitivamente que nao tem como fazer usando um pic programado em asm!

Tem bastante AN sobre isto,tem até rotinas de arredondamento de floating point de 24 bits para integer usando o insignificante 16F84 com timing máximo de 95 e mínimo de 14 clocks:


http://www.piclist.com/techref/microchip/math/round/fp-24bint-ng.htm
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor Vonnilmam » 03 Mar 2010 11:03

Carambas...


Respondendo ao meu camarada Fabim, é o seguinte amiguinho:

Eu estou tentando, :idea: tentando desenvolver um processador musical polifonico (que toca varias notas simultaneamente) e politimbral (que possa tocar simultaneamente varios timbres ao mesmo tempo) ou seja quero desenvolver um gerador musical, para quê?....para utilizar em meus projetos, hoje eu utilizo um chip dedicado da atmel :shock: Aí vc poderá estar se perguntando: porque então não continua a utilizar essa budega de chip? e eu respondo: eu continuo utilizando, mas---- :roll: Como todo bom desenvolvedor eu quero entender e ter o meu próprio gerador musical (profíssa)....

E tem mais, se alguém aquí tiver "bala na agura" :twisted: e quiser desenvolver o treco a título honeroso, tenho interesse em comprar o projeto, não importa o processador ou DSP t.i. ou analog etc que será utilizado.... :lol: seis vê como eu tô nervoso :D


Olha só:

Lá é Lá em qualquer lugar (440hz é 440hz em qualquer lugar), minto depende do pais...é isso mesmo, vcs sabiam que nos estados unidos o padrão musical difere em alguns hertz a frequencia da escala acromática (12 notas contando os Bmóis ou notas "acidente")...nem vou comentar nos emirados árabes, lá os caras escrevem com cobrinhas, rsosososososo, hahahah :shock:

Basicamente falandomente: Uma frequencia de nota musical do tipo 440hz é a mesma em qualquer instrumento musical (teoricamente), o que muda é o conteúdo harmônico (o timbre).

? ponto flutuante: ponto fixo: vcs querem dizer o quê com isso?

Olha só :oops: estão se referindo a um processador (dsp) com ponto flutuante ou estão só se referindo a um processador com calculo flutuante...porque um DSP de ponto flutuante é olho da cara de caro...

Se for isso, posso afirmar que é possivel realizar tudo com um processador (DSP) de ponto fixo, eu tenho uma prova disso aquí, trata-se de um processador ADSP 2105 da analog(epoca dos dinos)....
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 » 03 Mar 2010 11:08

há...aguém entre vós deu uma olhada no site que eu postei, alí tem um maluco que fez um gerador de senoides e consegue ter acordes de até 8 notas simultaneamente (eu montei o circuito e funciona mesmo de verdade :o )
Ele utilizou uma tabela de 64 posições para gerar uma senoide...agora eu só não entendi como ele conseguiu gerar as notas....por favor tentem entender, afinal vcs entendem mais de C do que eu...

Ôooooo fabim, que coisa é essa de "tio"....? é vô....
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 » 03 Mar 2010 11:31

Depois de perceber a falha que relatei no código do Marcelo, tive vontade de ver como poderia ser gerar estas freqüências com uma tabela de seno.

Escolhendo tamanho da tabela e taxa de amostragem/varredura corretas, o código (cálculos) podem ser minimizados para usar instruções binárias, como o deslocamento.

Testei uma opção no velho 8051 e quem quiser pode baixar o projeto no keil pra debug e ver as formas de onda aqui.

Código: Selecionar todos
void timer1 (void) interrupt 1
{
#define   TABLE_SIZE   (sizeof(bin_data))
#define   MAX_INDEX   (TABLE_SIZE-1)
#define   FA         (TAXA_AMOSTRAGEM-1)
#define   QTD_FREQ   (3)

   static   u16   u16_count;
   static   u16   u16_fi[QTD_FREQ];
   static   u16   u16_f[QTD_FREQ] = {
                           60,
                           697,
                           1209
                           };
   u8   u8_i;
   u16   u16_sum = 0;
      
   TL0 = RELOAD_LO;
   TH0 = RELOAD_HI;

   /*   0...(TAXA_AMOSTRAGEM - 1)   */
   ++u16_count;
   u16_count &= FA;

   for (u8_i = 0; u8_i < QTD_FREQ; u8_i++)
   {
      u16_fi[u8_i] = (u16) (((u32) (u16_count * u16_f[u8_i])) & MAX_INDEX);

      u16_sum += bin_data[u16_fi[u8_i]];
   }

   P0 = bin_data[u16_fi[0]];
   P1 = bin_data[u16_fi[1]];
   P2 = bin_data[u16_fi[2]];
   P3 = (u8) (u16_sum / QTD_FREQ);
}


Inseri um ruido de 60Hz ao DTMF.
Não testei na real, nem no Proteus, mas é possivel ver as formas de ondas no debug do Keil.
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 » 03 Mar 2010 13:40

tchelo, vamos lá então no seguinte.
Agora fiquei encucado com esta fuck aplicação, onde vai gerar sum de frequencias com este fuck calculo.

Vamos assim.
O fabim tem lá um 2148 com timer 1 e um match reset abilitado para 22050hz, e vai usar o dac de 10 bits para samplear a mistureba de frequencias, desta mistureba o fabim vai jogar para um fft na placa de som do pc, e pegar as frequencias geradas e suas amplitudes reais.

poderia o Sr, expricar corretamente como fica este fuck calculo, pois não entendi bulhufas de nadegas...

lembrando que o 2148 rodando a 56mips, e interrupções ocorrente com intermitencia de
1/22050 = 4,5351473922902494331065759637188e-5
e o arm executando uma instrução a cada
1/56kk = +/- 17nS

o arm com o calculo referido rodando na RAM, tem

2667 instruções, para executar o calculo, e ja deixar o valor para ser jogado no dac na proxima interrupt..


Tem como ? Vou testar na pratica pra ver se fica legalzim.

como a fifo da serial dele tem 32 bytes, pode fazer um ponteiro e capturar esses bytes referidos para as frequencias...
Veja cada 8° tem 12 pontos, se são 5 oitavas.
São 5 * 12 = 60/56teclas na verdade.. Por exemplo.

cada byte que chegar pode ser o valor de frequencia. tipo criar uma constante de multiplicação, ou simplesmente usar uma union pra pegar o valor da short, equivale a 0 a 65535...hz.. Á ja entendeu né?

Isto no caso a ser polifonico, tipo 4..5 notas simultaneas, não sei qual seria o a limitação em 56mips..





Marcelo Samsoniuk escreveu:vou colocar uma versao com comentarios e testada no linux:

Código: Selecionar todos
#include <stdio.h>
#include <math.h>

int main()
{
    FILE *fp; // file descriptor para placa de som no linux
    int i, s0, s1, k1, k2; // variaveis todas int de 32 bits
    char saida, table[256]; // wavetable qq, no exemplo uma senoide

    for(i=0;i!=256;i++) // inicializa wavetable com senoide
    {
      table[i] = (char)(127*sin(i*2.0*M_PI/256.0));
    }

    fp = fopen("/dev/dsp", "w"); // abre a placa de som

    if(fp) // se abrir, roda o codigo, senao vai embora
    {
        k1 = (256*697)/8000;  // k1 de linha  1 697hz
        k2 = (256*1209)/8000; // k2 de coluna 1 1209hz
                              // 1,1 corresponde ao DTMF "1"

        printf("coeficientes: 697Hz => %d, 1209Hz => %d\n",k1,k2);             

        for (i = 0;; i++) // loop eterno
        {
            s0 = table[(unsigned char) (i*k1)]; // primeiro resultado
            s1 = table[(unsigned char) (i*k2)]; // segundo resultado
            saida = (s0 + s1) / 2; // mixer simples
            fputc(saida+128, fp); // envia para a placa de som
                                  // a soma +128 no envio eh necessario
                                  // pq a placa trabalha com pcm nao
                                  // sinalizado, mas para processar audio
                                  // *sempre* use sinalizado
        }
    }
    return -1; // retorna erro se nao conseguir abrir o arquivo
}


para minimizar o problema de overflow, eu calculei o coeficiente antes e multipliquei depois... o problema eh que a menor frequencia vai ser 32Hz (coeficiente 1), enquanto que na maior frequencia (1/4 do sample rate) vc vai ter coeficiente 64, ou seja, na pratica vc soh gera 64 frequencias diferentes na faixa de 32 a 2000Hz.

trocando para:

Código: Selecionar todos
      k1 = (256*697);  // k1 de linha  1 697hz
      k2 = (256*1209); // k2 de coluna 1 1209hz 


e tambem:

Código: Selecionar todos
            s0 = table[(unsigned char)((i*k1)/8000)]; // primeiro resultado
            s1 = table[(unsigned char)((i*k2)/8000)]; // segundo resultado


voce garante capacidade de gerar corretamente de 1 a 2000Hz. porem comeca a ocorrer um overflow periodico, pois os coeficientes variam de 256 a 512000, ou seja, o coeficiente consome 19 bits, sobrando entao apenas 12 bits para o contador i, de modo que ele faz overflow em apenas 4096 contagens (quase 2x por segundo!). mas se vc declarar i como uma variavel long long de 64 bits, o overflow ira demorar alguns anos para ocorrer.

outra alternativa eh usar ponto flutuante:

Código: Selecionar todos
    float k1,k2;
...
        k1 = 256.0*697.0/8000.0;  // k1 de linha  1 697hz
        k2 = 256.0*1209.0/8000.0; // k2 de coluna 1 1209hz
...
            s0 = table[(unsigned char)((int)(i*k1))]; // primeiro resultado
            s1 = table[(unsigned char)((int)(i*k2))]; // segundo resultado


daih fica similar ao primeiro caso lah em cima, soh que agora os coeficientes variam de 0.032 a 64 com grande precisao. usando ponto flutuante de precisao simples, vc consegue sintetizar qq frequencia corretamente e o overflow do inteiro i vai ocorrer apenas depois de 2h de sintese continua da frequencia maxima.

uma forma de resolver o problema de overflow dos indices seria tambem usar um indice separado para cada canal, porem todos incrementando de forma sincronizada de acordo com o sample rate... fica como licao de casa para vc testar isso :) hehehe
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 barboza » 03 Mar 2010 13:44

Só não esqueça de limitar o índice da tabela ao seu range.
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 » 03 Mar 2010 15:06

entao vonnilmam, a diferenca de ponto fixo e ponto flutuante eh que com ponto fixo vc fica sujeito a overflow durante as operacoes, enquanto que com ponto flutuante vc minimiza o problema.

por exemplo, no calculo de (i*256*f)/8000 com valores inteiros vc faz primeiro as multiplicacoes para que a divisao nao zere o resultado se os valores de i e f forem pequenos. porem fazer a conta antes representa um overflow se os valores de i e f forem grandes! eh um dilema :)

para fugir disso, a primeira ideia eh usar ponto flutuante, assim vc pode fazer a conta k=256.0*f/8000.0 uma unica fez e usar o coeficiente de ponto flutuante para obter i*k. em principio isso gera um problema: falta de hardware para lidar com ponto flutuante em processadores baratos.

normalmente isso nao eh um problema, pq ponto flutuante pode ser perfeitamente emulado. mas o problema entao comeca a ser performance: trabalhar com um float tipico implica operacoes de 24 bits para a mantissa e 8 bits para o expoente. para um processador 32 bits com instrucao de multiplicacao e divisao, eh moleza.

outra jogada eh usar ponto fixo. supondo que vc tem 32 bits, vc pode jogar 10 bits para a parte decimal e 22 para a parte inteira, assim vc consegue cacular o coeficiente 256*f/8000 (que ficaria equivalente a 256*f/8 nesse caso) com precisao de 1/1000 com maior performance que usando ponto flutuante.

mas da mesma forma, um processador de 32 bits ajuda.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

lá é lá

Mensagempor aos » 03 Mar 2010 16:02

só pra esquentar a "briga lá é lá"
a frequencia fundamental de uma nota é mesma em qualquer instrumento.
oque muda é o timbre(ou se quiser chamar forma de onda, serie de harmonicos, componentes como: atack, decay, etc.)

dá uma olhada aqui:

http://caraipora.tripod.com/esc_temp_freq_.htm
aos
Bit
 
Mensagens: 17
Registrado em: 02 Jun 2009 21:15
Localização: Rio de Janeiro

Mensagempor vtrx » 03 Mar 2010 16:31

só pra esquentar a "briga lá é lá"
a frequencia fundamental de uma nota é mesma em qualquer instrumento.
oque muda é o timbre(ou se quiser chamar forma de onda, serie de harmonicos, componentes como: atack, decay, etc.)

Qualquer músico sabe disso,é assim que numa orquestra o maestro pode reger a qualquer instrumento,todos leem a mesma partitura,não existe partitura de Lá para piano ou Lá para guitarra.
Mes este assunto ja não faz mais parte desse tópico.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor fabim » 03 Mar 2010 17:01

la, la la la la la al ala alalalala ?

la la /;?

la*la=la/la°..

la:

1° lalalalalala
2° la mimi la
3° la mimi la

Agora, o lá da guitarra, equivale a frequencia de qual 8° do piano ?

Isso é muito complicado...
prefiro ficar nos fourrier, DFT, FFT, IFT.. coisas do tipo
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 proex » 03 Mar 2010 18:43

"..Agora, o lá da guitarra, equivale a frequencia de qual 8° do piano ? ""

Depende de que Lá da guitarra vc esta se referindo.



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

Mensagempor vtrx » 03 Mar 2010 19:51

Agora, o lá da guitarra, equivale a frequencia de qual 8° do piano

Heheh,A guitarra geralmente tem duas oitavas,essas duas oitavas são as mesmas do piano até duas oitavas ,acima disso o piano terá mais 'Lá' mas de oitavas acima,mas é Lá hehe.
Olha,o arquivo La1 é de uma guitarra com distorção,é tocado Lá ,depois uma oitava acima e depois duas oitavas acima.http://www.mandeibem.com.br/?cod=33201019474657287
O arquivo Lá 2 são as mesmas notas tocadas com efeito 'oitavador',todas as 3 notas são Lá mixadas com uma oitava acima,mas é tudo Lá..hehehehe.
http://www.mandeibem.com.br/?cod=3320101948531267
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor ribeiro220 » 01 Jul 2010 13:24

Continuação parte 2.................
Retomando o tópico..............


Achei interessante a ídeia do fabim de tabela unica e mudar velocidade de scan e do proex,1 tabela pra cada nota.
Agora,a minha dúvida(embora o tópico foi criado pelo volnilman)nas duas situações(tabela unica e varias tabelas)se eu usar somente um Pic,quando eu apertar 2 ou mais teclas(polifonia),como que vai sair o som?
No meu raciocinio,a tabela unica vai te dar a soma das 2 ou mais teclas pressionadas,ou seja um batimeno de frequencias que não vai ser igual as 2 notas tocando simultaneamente,correto?
Nas varias tabelas(uma pra cada nota)só vai sair o som de uma nota,acredito que na hora que apertar outra tecla junto,o som vai mudar pra outra frequencia(tabela) ou seja:
Em ambos os casos,será preciso de 1 pic pra cada nota!!!!????

Se estiver errado,desculpem-me :D

Grato à todos
ribeiro220
Bit
 
Mensagens: 42
Registrado em: 04 Mai 2007 21:06

AnteriorPróximo

Voltar para PIC

Quem está online

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

x