Dúvidas EP

Dúvidas EP

by Pierre-Marie Lévêque -
Number of replies: 13
Tenho algumas dúvidas sobre o Pd...

- Função de Hamming

Existe uma função de Hamming que já existe no sistema (hamming~). Dá para usar essa, ou é melhor criar essa função de novo a partir da formula?

- Frequência de maior amplitude

É fácil pegar a amplitude máxima, mas como fazer para selecionar a frequência associada à esse valor ?

- O "block"

Aparentemente o block~ não está funcionando... alguém entende por quê ?


obrigado pela ajuda !!!!!
abs
Pierre-Marie
In reply to Pierre-Marie Lévêque

Re: Dúvidas EP

by Marcelo Queiroz -
Olás!

Sobre a função de hamming, ela não faz parte do Pd (eu por exemplo não a tenho aqui). Talvez seja de alguma biblioteca de externals. Não tenho nada contra usá-la. Há uma implementação disto também num dos exemplos que vimos em aula (I07 - phase vocoder).

Para pegar a frequência de máxima amplitude, não é difícil fazer do jeito usual, percorrendo o vetor e armazenando em algum lugar o índice que realizou o máximo. Em C seria algo como for (imax=0, i=1;i<N;i++) if (v[i]>v[imax]) imax=i; (só que com caixinhas... smile

O block~ funciona sempre no patch em que ele for definido, e em seus subpatches. Dê uma olhada no help. Ou então mande mais detalhes da dificuldade que você está tendo.
In reply to Marcelo Queiroz

Re: Dúvidas EP

by Pierre-Marie Lévêque -
Obrigado!
Vou dar uma estudada...

PM
In reply to Pierre-Marie Lévêque

Re: Dúvidas EP

by Fernando Raganhan -
Um problema que eu tive com o block foi receber o erro "'error: dac~: bad vector size" quando usava um block diferente de 64 (default). Encontrei num lista o porque, os objetos adc~ e dac~ são implementados utilizando um um bloco de tamanho 64 harcoded então a parte do código que precisa de um bloco diferente precisam estar em um subpatch diferente.

link
http://lists.puredata.info/pipermail/pd-list/2002-08/007792.html

[]'s
In reply to Fernando Raganhan

Re: Dúvidas EP

by Arthur Tofani -
Você não pode ter block~ e adc~ ou dac~ no mesmo patch. pra resolver isso, faça no patch principal um subpatch recebendo o sinal do adc~, tipo isso:

[adc~]
|
[pd outropatch]

e nesse tal outropatch coloque um inlet~ recebendo o que vem do principal. aí, nessa tela, vc pode criar um [block 4096 1 1], em qq lugar da janela. ele não fica ligado a nada:

[inlet~]
|
[blalblabla (qq coisa que mexa no sinal que veio do adc~ da tela principal)
só pra reforçar, nessa tela vc não vai poder colocar dac~, pelo mesmo motivo de ter o block lá.

pelo menos foi isso que eu entendi.
[]s
In reply to Arthur Tofani

Re: Dúvidas EP

by Pierre-Marie Lévêque -
Funcionou para mim !
Valeu !
In reply to Pierre-Marie Lévêque

Re: Dúvidas EP

by Andrew Kurauchi -
Na saída dos eventos musicais é dito para fazer a comparação |(f0atual - f0anterior)/f0anterior| > 0.03.
Esse f0anterior é a freqüência da nota anterior, ou a última freqüência recebida?
Por exemplo, a última freqüência recebida foi 444Hz, e a freqüência atual é 452Hz. Devo comparar 452 com 444 ou com 440 (444Hz seria avaliado como um Lá = 440Hz)?
Fiquei com essa dúvida porque se comparo com a freqüência recebida anteriormente, e for aumentando a freqüência atual suficientemente devagar, |(f0atual - f0anterior)/f0anterior| será menor do que 0.03 e o programa vai achar que a nota nunca muda.
Não sei se ficou claro...

Obrigado!
In reply to Andrew Kurauchi

Re: Dúvidas EP

by Marcelo Queiroz -
Olá, Andrew!

Sim, sua dúvida ficou clara. Possivelmente o enunciado não esteja tão claro neste ponto. Quando você reporta um início de nota na saída de texto do Pd, você também coloca uma frequência fundamental, que é a frequência real detectada (antes do arredondamento do d), por exemplo d=0 e f=444Hz. A sugestão é que este valor f0anterior=444Hz seja comparado com as frequências fundamentais das janelas seguintes, como um critério preliminar necessário para permitir que a nota mude (só muda se |(f0atual-f0anterior)/f0anterior|>0.03).

Por exemplo, se na primeira janela você obteve d=0 com f0=444 e na janela atual você obtém d=1 com f0=453, então a condição preliminar |(453-444)/444|<=0.03 indica que você não deve reportar um novo evento. Nas janelas seguintes, se você continuar obtendo frequências entre 430.68(=444*0.97) e 457.32(=444*1.03), você não vai reportar um evento novo, pois a condição |(f0atual-444)/444|<=0.03 continuará valendo, independentemente do valor arredondado de d ficar oscilando entre 0 e 1 (qualquer valor acima de 452.89 daria a entender que a nota seria d=1). Ou seja, a memorização do f0anterior do momento em que você reporta o início de nota efetivamente "recalcula" os limites inferior e superior de tolerância para aquela nota, como [f0anterior*0.97...f0anterior*1.03]. Isso permitirá que uma pessoa entoe uma nota qualquer, mesmo fora da escala cromática (valores de d inteiros), e sua nota seja reportada uma única vez, desde que o som não se afaste demais de sua frequência inicial.

Espero ter ajudado!


In reply to Marcelo Queiroz

Re: Dúvidas EP

by Andrew Kurauchi -
Olá professor!

Obrigado! Dúvida esclarecida!
In reply to Andrew Kurauchi

Re: Dúvidas EP

by Andrew Kurauchi -
Mais uma dúvida! hehe

Na saída da forma de onda, caso consideremos o sinal como um evento musical, devemos mostrar 3 períodos completos da forma da onda da freqüência fundamental, ou do sinal original, ou nenhum dos dois?

Obrigado!
In reply to Andrew Kurauchi

Re: Dúvidas EP

by Marcelo Queiroz -
Não sei o que você está chamando de forma de onda da frequência fundamental, mas é claro que a saída não deve ser 3 períodos de uma senóide pura. O usuário deve ver 3 períodos completos do sinal que ele está produzindo, ou seja do sinal original. Saber qual é o trecho da janela da entrada que corresponde a esta visualização passa por duas etapas: estimar a frequência fundamental (para saber quantos pontos da entrada correspondem a 3 períodos) e estimar a fase do harmônico que corresponde à fundamental (para estabilizar a forma de onda).

Observe que o tabread4~ permite a leitura com índices fracionários, então é fácil definir o tamanho da janela de saída da forma de onda com N pontos (N fixo, por exemplo 1000) e ler da janela de entrada N pontos linearmente espaçados entre k0 (fracionário) e k0+3*R/f_0.

In reply to Marcelo Queiroz

Re: Dúvidas EP

by Andrew Kurauchi -