Métricas do EP3

Métricas do EP3

por Marcelo Queiroz -
Número de respostas: 5

Olás!

Como prometido, aí vão as informações sobre o "trabalho real" que dá a implementação das duas partes do EP3.

O código da parte S que eu mostrei pra vocês na 3a, feita em external C, possui 250 linhas de código. Dessas, 150 são praticamente iguais ao código do fileosc~.c, que vocês têm. Ou seja, depois de entender o que é pra ser feito, o trabalho é o de escrever (e depurar) 100 linhas de código em C.

O André (monitor) escreverá em breve com detalhes sobre a parte A.

Em resposta à Marcelo Queiroz

Re: Métricas do EP3

por Andre Jucovsky Bianchi -

Oi, pessoal. Envio alguns comentários sobre a parte de análise do trabalho.

Sugiro que vocês dêem uma olhada no exemplo de phase vocoder que vem com o PD e uma pensada no trabalho antes de ler o os comentários a seguir, que talvez tirem um pouco da emoção de trabalhar em um terreno desconhecido. :-)

Sobre a parte de análise, uma primeira dica é que dá pra aproveitar bastante coisa do patch I07.phase.vocoder.pd de exemplo do PD.

Aquele patch utiliza um subpatch que calcula uma janela de Hamming e guarda o resultado em uma tabela (subpatch [pd hann-window]). Ele também utiliza duas tabelas para guardar os resultados das fases do último bloco para usar durante o cálculo dos parâmetros do bloco atual (subpatch [pd phase-tables]). Se a dupla for utilizar esses dois esquemas iguais ao da implementação do exemplo, toda essa infraestrutura tem que estar presente. O uso da janela de Hanning não está na especificação do trabalho mas o resultado sonoro é melhor com seu uso, além de que já está implementado no exemplo, então não dá muito mais trabalho.

O patch de exemplo calcula os parâmetros de uma janela e faz a ressíntese do som com as alterações na velocidade e altura (subpatch [pd fft-analysis]). Essa parte pode ser adaptada para retornar os resultados para impressão num arquivo usando o [fprintf~], de acordo com a especificação, ao invés de realizar a ressíntese. Tenham em mente que o subpatch de exemplo utiliza janelas com fator de sobreposição fixo, e que alguns pedaços de código (de blocos) servem especificamente para fazer a transposição de altura ou alterar a velocidade de ressíntese, então essas partes devem ser alteradas.

Abaixo está uma pequena lista dos objetos do PD que utilizei na minha solução e que podem ser bastante úteis. Todos os objetos do PD possuem um patch de ajuda associado com a explicação de como funcionam, que pode ser acessado com o botão direito e clique em Help.

  • [route]: roteia uma mensagem para um outlet específico de acordo com o primeiro símbolo da mensagem de entrada.
  • [trigger]: envia a entrada para os outlets na ordem da direita para a esquerda e convertendo de acordo com os argumentos de criação.
  • [arraysize]: obtém o tamanho de uma tabela, pode ser útil para o cálculo do período do sinal de entrada.
  • [pack]: empacota várias mensagens em uma só e envia a mensagem empacotada.
  • [block~]: define o tamanho do bloco de análise e o fator de sobreposição dos blocos.
  • [loadbang]: emite um bang quando do carregamento dum patch.

Eu dividi a minha solução em alguns patches para resolver o problema:

  • O primeiro patch, de entrada, serve só para enviar os parâmetros específicos (tamanho da janela, sobreposição e nomes dos arquivos de entrada e saída) para o subpatch de controle, em forma de mensagens. Esse patch possui cerca de 20 objetos.
  • O subpatch de controle cuida de ler o arquivo de entrada numa tabela, abrir o arquivo de saída para escrita, definir o tamanho da janela e a sobreposição, iniciar o processamento num subpatch de análise e desligar o processamento e fechar o arquivo depois que a tabela inteira foi analisada. Esse patch possui uns 50 objetos.
  • Um subpatch de análise realiza efetivamente a análise e cálculo dos parâmetros e retorna os valores para o subpatch de controle. Esse subpatch é uma adaptação do exemplo e possui menos objetos do que o exemplo, por conta das considerações acima.

É isso, espero que ajude a dar uma idéai de por onde seguir.

Em resposta à Andre Jucovsky Bianchi

Re: Métricas do EP3

por Andre Jucovsky Bianchi -

Oi, envio abaixo uma imagem de um subpatch para calcular um sinal módulo π / M.

Subpatch: fase modulo pi sobre M

A parte da direita recebe uma mensagem com o fator de overlap das janelas e calcula π / M.

Depois, vem o objeto [expr~], que implementa para o PD algumas funções parecidas com as da biblioteca de matemática do C e executa uma ou mais funções para todos os elementos dos vetores dados de entrada (veja a documentação para variações). Como todos os objetos ~, este também é executado com frequência (R*M)/N Hz sendo que R é a taxa de amostragem e N e M são, respectivamente, o tamanho do bloco de processamento digital e o fator de overlap, definidos por meio do objeto [block~].

Assim, a chamada [expr~ fmod($v1, $v2)] retorna o resto da divisão de cada elemento de $v1 por cada elemento de mesmo índice em $v2 e o resultado é enviado para o outlet. No caso, com o uso do objeto [sig~], todos os elementos de $v2 são iguais a π / M, então o que é enviado para o outlet é o resto da divisão dos números do sinal por π / M.

Em resposta à Andre Jucovsky Bianchi

Re: Métricas do EP3

por Bruno Perfetto -

Desculpe a ignorância...

Como faço um IF / ELSE no PD? É possível fazer comparação de strings?

Não consigo controlar o fluxo de execução de jeito nenhum com o [expr]...

Em resposta à Bruno Perfetto

Re: Métricas do EP3

por Andre Jucovsky Bianchi -

Bruno, os objetos [expr] e [expr~] só servem para realizar operações matemáticas.

Pra realizar o controle de fluxo, tem várias estratégias possíveis. Dê uma olhada no help dos objetos [route], [trigger] e [pack].

Explique um pouco melhor o que você está tentando fazer e a dificuldade que encontrou que fica mais fácil da gente dar uma dica.

Em resposta à Andre Jucovsky Bianchi

Re: Métricas do EP3

por Bruno Perfetto -

Ainda não olhei os patches sugeridos mas o que estou tentando fazer é verificar se o usuário ja setou as variaveis input e output pra então iniciar os calculos das senoides...