Aventurando-nos no EP3

Aventurando-nos no EP3

por Flávio Luiz Schiavoni -
Número de respostas: 8

Olá Marcelo, André e turma.

Estamos há alguns dias  aventurando-nos no PD para implementarmos o EP3 e, creio que por conta de inexperiência com o software, dando algumas cabeçadas. Compartilho elas convosco.

1 - Para calcular fases, usei o atan(i/r). Só que o atan já fazia a divisão e demorei um pouco para entender o porque de ele estar dando sempre o mesmo valor. Cabeçada! Resolvido removendo a divisão. Nada como ler o help.

2 - Para tocar a tabela, estava usando o tabplay~. Este objeto pode receber o sample inicial e sample final. Achei uma boa opção para fazer o overlap. Independente disto o Pure Data lia 64 samples por loop. Cabeçada! Resolvido com o uso do block~. Nada como ler as sugestões do professor.

3 - Não consegui carregar arquivos com mais de 4000000 samples pelo soundfiler. Parece que estoura o tamanho da tabela ou coisa assim. Ele até recebe um parâmetro -maxsize <valor> mas isto não ajuda muito pois não sei o tamanho de um arquivo antes de abri-lo. Acredito que isto não é um problema para esta aplicação mas fiquei com dúvidas se há outra maneira de fazer isto. Ainda dando cabeçada.

4 - O objeto que carrega o arquivo de áudio não me informa o samplerate deste arquivo. Para esta aplicação talvez isto não seja problema. Sei que gostaria de saber se o samplerate do arquivo é igual ao do PD e talvez converter o arquivo para tal taxa. Ainda em aberto.

5 - O external fornecido (fprint~) não consegue gravar a primeira linha do jeito que o exemplo grava. Ao passarmos para ele uma mensagem write ele grava apenas um argumento e depois disto um \n. Alterei o external fprintf~ para que o write imprima vários números e também foi resolvido. Nada como ter o código-fonte em mãos.

6 - Quando entrando 1024 amostras na FFT, tenho como saída 1024 valores porém depois da metade são quase todos iguais e gigantemente tendendo a infinito. Vi na explicação do exercício que só aproveitaria mesmo metade dos valores - 1. É isto mesmo? Caso afirmativo, como faço para jogár fora a segunda metade dos valores? Há uma maneira de dividir um bloco em 2 partes? Cabeçada em aberto.

7 - Fiquei na dúvida se para calcular as amplitudes devo dividir os valores por N ou não. Se não divido, alguns valores ficam maiores que 1.  Se divido eles ficam pequenos demais. Certeza que é cabeçada...

Sugestão para as cabeçadas em aberto serão muito bem vindas.

Abraços.

Em resposta à Flávio Luiz Schiavoni

Re: Aventurando-nos no EP3

por Flávio Luiz Schiavoni -

Mais uma dúvida.

O pvanalyzer~ está utilizando algum tipo de enjanelamento exponencial ou coisa assim? A comparação dos resultados da minha implementação e desta implementação tem sido um tanto brusca mesmo se usando os mesmos parâmetros N e M.

Em resposta à Flávio Luiz Schiavoni

Re: Aventurando-nos no EP3

por Andre Jucovsky Bianchi -

Sobre o item 3, do fonte do pd, arquivo src/d_soundfile.c, linhas 1115-1116:

/* ------- soundfiler - reads and writes soundfiles to/from "garrays" ---- */
#define DEFMAXSIZE 4000000      /* default maximum 16 MB per channel */

Em resposta à Flávio Luiz Schiavoni

Re: Aventurando-nos no EP3

por Andre Jucovsky Bianchi -

Sobre o item 4, nas linhas 655-661 do src/d_soundfile.c, dá pra ver que você pode passar a taxa de amostragem como argumento de criação do soundfiler. Pra isso, tem que usar -rate <TAXA> ou -r <TAXA>. Isso não está documentado no help do objeto. =/

Se a taxa não for passada na criação do objeto, na hora de abrir (linhas 2532-2536) ou escrever no arquivo (linhas 1364-1365), a taxa de amostragem é obtida a partir da funçao sys_getsr() (arquivo src/s_audio.c), que reflete a configuração de taxa de amostragem do PD.

Ou seja, o PD não faz a detecção de taxa de amostragem automaticamente, mas te permite passar ela como argumento na hora de criar o [soundfiler]. Só tome cuidado para não tentar com arquivos maiores do que 16 MB. :-)

 

Em resposta à Flávio Luiz Schiavoni

Re: Aventurando-nos no EP3

por Andre Jucovsky Bianchi -

Sobre o item 6, os números depois da metade estão gigantemente tendendo a infinito ou a zero? A notação de ponto fluttuante em geral é igual à notação científica, e números muito pequenos são variações de xey, significando x.10y como esse exemplo no octave:

octave:1> 1 / 10000000000
ans =  1.0000e-10

Em resposta à Andre Jucovsky Bianchi

Re: Aventurando-nos no EP3

por Flávio Luiz Schiavoni -

9.7656e+06 (Acho que infinito mesmo...)

Definir 4000000 amostras como 16 MB é um negócio esquisito uma vez que isto pode variar dependendo do formato do arquivo. Estou usando 16 bits PCM. Acho que a conta dele é para 32 bits e que o 16MB significa 16.000.000 de bytes. Talvez ele converta.

Estas informações costumam estar no cabeçalho do arquivo wave e extrair estes meta-dados é apenas ler o cabeçalho do arquivo. Só por curiosidade: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ Não sei se seria muito caro para o sounfile fornecer estas informações.

Gostei do -r. Parece bom. Vou testar. Dá para forçar o tamanho com o atributo -maxsize. Se souber qual o tamanho do arquivo em samples...

Em resposta à Flávio Luiz Schiavoni

Re: Aventurando-nos no EP3

por Marcelo Queiroz -

Olás!

Sobre os itens em aberto:

1) A dica do enunciado é usar atan2~, que recebe a representação cartesiana (do jeito que é produzida pela FFT) e fornece as fases.

5) Esta questão de formatação (dois números na mesma linha ou 1 número por linha) não é muito relevante, o essencial é manter a ordem dos dados do jeito que serão lidos pelo ressintetizador.

6) Dependendo do objeto (fft~ ou rfft~) estes últimos valores nem serão computados. Sobre como selecionar os valores relevantes, é pra isso que existem aquelas mensagens "first M" e "last N" no fprintf~. Faça as contas com os blocos de áudio completos (é mais fácil) e na hora de produzir o resultado escreva só os valores correspondentes aos bins 1,2,...,N/2-1.

7) O help do fft~ tem a resposta: não é usada nenhum ajuste de constante, de tal modo que as amplitudes dos parciais relevantes para o EP terão que ser multiplicadas por 2/N, como no enunciado.

Abraços,

Marcelo

Em resposta à Marcelo Queiroz

Re: Aventurando-nos no EP3

por Flávio Luiz Schiavoni -

A alteração do fprintf~ foi bastante simples. Mudei o seguinte:

(...)

else if (!strcmp(s->s_name,"write")){
int i = 0;
for( i = 0 ; i < argc ; i++)
fprintf_float(x,atom_getint(&argv[i]));
fprintf_enter(x);
}else if (!strcmp(s->s_name,"repeat"))
(...)

static void fprintf_float(t_fprintf *x, t_float f){
if (x->x_hndl){
fprintf(x->x_hndl,"%d ",(int)f);
}
}

static void fprintf_enter(t_fprintf *x){
if (x->x_hndl){
fprintf(x->x_hndl,"\n");
}
}

Estou tentando gerar a mesma saída para poder ouvir o resultado da análise pelo patch de síntese disponibilizado. Tudo bem, concordo que era só alterar isto na mão.

Em resposta à Marcelo Queiroz

Re: Aventurando-nos no EP3

por Flávio Luiz Schiavoni -

Eu estava usando um tal [rsqrt~] em vez de [sqrt~]. Este tal [rsqrt~] é usado pelo Phase Vocoder do PD e não sei exatamente o que esta função faz. Usando [sqrt~] cheguei em resultados mais coerentes.

Eu tinha visto no enunciado que era para usar 2/N mas acabei seguindo as possibilidades que foram passadas em aula, ou seja, /N   /N^0.5 e sem multiplicar. Ajustado e agora os resultados estão mais coerentes.