Olá professor. Estou com algumas dúvidas sobre entrada/saída dos objetos. Não entendi como funciona o objeto coll para leitura de arquivos txt. Gostaria também de saber como implementar uma função "floor", pois não encontrei nenhum objeto que faz isso (se houver fale por favor). Outra dúvida é onde devo colocar os dados de saída da resposta impulsiva para depois transformá-la em um arquivo .wav (seria em um array?). Grato desde já.
Oi, Vito!
A documentação do objeto [coll] é bastante completa, por isso seria importante você colocar sua dúvida de forma mais específica.
O objeto [int] (e também a função int() dentro de um [expr]) trunca um valor fracionário na sua parte inteira. Isso é exatamente um floor no caso de um argumento positivo, e no caso de um argumento negativo isso produz um valor uma unidade acima do que seria o floor correto (então precisa tratar separadamente o caso positivo e negativo).
A resposta impulsiva deve ser produzida em um array sim, dimensionado conforme o tamanho estipulado na entrada. Lembre-se que os raios entram na resposta impulsiva de forma cumulativa, então sempre precisa ler o valor antigo, somar o novo, e armazenar.
Abraço,
Marcelo
Também não me dei bem com o [coll], preferi usar o [textfile] seguido de um [unpack] gigante.. Funcionou direitinho..
Perfeito, Alessandro, o [coll] era só uma sugestão, quem preferir seguir a dica do [textfile] fique à vontade!
Marcelo
No caso o textfile me pareceu mais coerente mesmo. Mas estou testando o patch em fase final, e estou em dúvida quanto ao valor I que foi citado no EP. Ele deve der dado em porcentagem (exemplo I = 0.7 = 70%), ou deve ser o numerador da fração, onde 100 já é o denominador citado na fórmula? Pois os valores de Ae e Ad estão dando muito baixos mesmo para coeficientes de absorção baixíssimos (0.2).
Olás!
Vito, a descrição "Fração (%)" está mal-escrita... Em todas as fórmulas onde aparece I*T/100 está implícito que I é o numerador (I=70 em 70%). Para que eu possa testar os programas usando os mesmos arquivos de entrada, vamos convencionar que essa é a interpretação correta (e que a palavra "Fração" estava errada), ok?
Marcelo
OK! Grato.
Eu estou com algumas dúvidas na primeira parte da resposta impulsiva...
Se eu entendi até aqui, no final precisamos aplicar aquele grupo de laços, substituindo o comentário /*processa raio da sala (i, j, k)*/ por aquela fórmula para a amplitude no ouvido esquerdo e no ouvido direito; Ai = ( (1 - alpha) ^ (|i| + |j| + |k|))/ci
Minha dúvida então é: como eu sei em que posição do vetor entra essa amplitude que eu acabei de calcular?
Obrigado,
Antonio
Oi, Antonio!
A posição no vetor corresponde ao tempo de atraso de chegada dessa reflexão (te e td no enunciado) convertidos em índice de amostra (levando em consideração que o vetor representa um sinal com 44100 amostras por segundo).
Marcelo
Obrigado, professor!
É possível fazer um vetor com esse tamanho no puredata? Ou teremos que usar algum truque para guardar eficientemente?
Antonio
Oi, Antonio!
Consegui criar um vetor no Pd com tamanho 1000000 sem grandes problemas... isso daria 22 segundos de áudio, é muito tempo para uma resposta impulsiva (a Notre Dame tem reverberação de 8.5 segundos...). Acredito que você não terá problemas, mas poste aqui qualquer dúvida.
Marcelo
Professor, o tamanho do array é o tempo da resposta impulsiva (definido no arquivo texto) vezes 44100, certo? Meu problema está sendo definir os índices.
Professor, fiquei com duas dúvidas:
- No calculo das posições das fontes virtuais (PX, PY e PZ), o que significam os colchetes utilizados na formula ? Suponho que seja uma operação "div".
-Os expoentes "i" de "(-1)^i", não deveriam ser "i" para calcular PX, "j" para calcular PY e "k" para calcular PZ? No enuciado é utilizado "i" como expoente para todos...
Bruno, se me permite explicar, aquilo são na verdade símbolos de floor, função "chão" (exemplos: floor(3.45)=3, floor(5.1112)=5, floor(-4.3)=-5 ), que no pd se calcula com [int], ou "int" dentro do [expr], e quanto aos expoentes, acho que saiu errado no enunciado mesmo rs. Tem que tomar cuidado com o floor para valores negativos, pois no Pd ele calcula com uma unidade acima do que devia. Para resolver isto usei um [moses 0] fora do [expr], e um [- 1] para as saídas negativas.
Professor seria possível adiar a entrega do EP3 pra 14/12, ajudaria bastante pra que terminasse todos os objetivos propostos, sei que dificulta um pouco no seu prazo de correção, mas ainda assim seria de grande ajuda. Imagino que muitos tenham se enrolado com tantas provas do final de semestre e estejam um pouco atrasado.
Por isso peço que reconsidere tal prazo.
Abraço.
Igor Oliveira Borges
Pessoal, vamos por partes:
Vito: o tamanho de cada vetor da resposta impulsiva é 44100*T. Se você quer colocar uma informação no instante correspondente a t segundos, o índice correspondente é int(t/44100+0.5) (o +0.5 é para arredondar, mas se quiser deixar truncado sem +0.5 também não há grande problema).
Bruno: a resposta do Vito para as suas dúvidas está quase perfeita. O símbolo corresponde ao floor() e os expoentes são i, j e k. A única observação é que int() (truncamento da parte fracionária) e floor() (maior inteiro menor ou igual ao argumento) são operações diferentes, e o Pd computa *corretamente* o int(), ou seja int(-2.9)=-2, e para se obter floor(-2.9)=-3 deve-se adaptar a saída do int() (se x<0 e x<int(x) então floor(x)=int(x)-1; se x<0 e x==int(x) então floor(x)=x <== atenção a este caso!).
Igor: como eu expliquei antes as notas têm que estar no Júpiter no dia 15. Fica impossível deixar a entrega para o dia 14. O máximo que dá para ajudar é mudar a entrega para o sábado dia 13 até 23:55. Vou fazer a alteração no PACA agora.
Marcelo
Professor, o índice correspondente não seria int(t*44100)? Pois dividindo, a resposta impulsiva fica com apenas um pico gigante no inicio, agora vezes, que é o que eu acho que era pela equação de conversão ( T(ms) = N (amostra)/44100 ), fica com cara de resposta impulsiva, com os valores decaindo com o tempo.
Sim, Vito, claro, int(t*44100). Desculpe-me, estou fazendo muitas coisas simultaneamente, e o chaveamento mental está começando a dar tilt.
E será int(t*44100+0.5) se quiser arredondar ao invés de truncar.
Haha sim, compreendo, acontece rs.
Tenho uma pergunta sobre o desempenho da auralização~: Como eu entendi devemos implementar a convolução no domínio do tempo. Então temos (com uma resposta impulsiva de 1s) pelo menos 44100 multiplicações, 44100 adições etc. para cada amostra de entrada. Com uma SR de 44100/s temos então 22 micro segundos para fazer tudo isso ... Na minha experiência isso não é viável.
Minhas perguntas: Entendi mal? Não estou vendo o truque?
Oi, Thilo!
Você terminou a implementação e ela não funcionou? Funciona com uma resposta impulsiva menor?
Não há nenhum truque esperado na implementação. É natural que cada máquina tenha um limite diferente para a quantidade de operações factíveis em 22 microssegundos (ou melhor dizendo, em 1.45 milissegundos, que é o tamanho do bloco default). A partir desse ponto a operação do Pd em tempo real irá "engasgar", o que não quer dizer necessariamente que a implementação esteja errada.
Minha sugestão pragmática é testar o objeto [auraliza_sala~] gravando a saída dele com um [writesf~ 2] (ao invés de usar o [dac~] ou [output~]). Se a saída gravada em arquivo estiver correspondendo ao esperado, então está tudo bem, não se preocupe! Se preferir, dá até para fazer esses testes com "pd -batch arquivoteste.pd" (basta criar um arquivo que dispare com [loadbang] todas as mensagens de inicialização necessárias para começar a auralização).
Marcelo
Obrigado pela resposta.
Sim implementei e funciona. Os problemas na minha implementação começam +/- com 15 amostras na IR (até agora). Alguém consegue muito mais?
Vou implementar sua sugestão.
Thilo.
Professor, o senhor não fez a alteração da data de entrega no PACA. A data ainda está adiada para amanhã às 23:55?
Oi, Vito! Eu havia feito a alteração sim, ou melhor, eu já defini o link de entrega com a data nova. Não alterei apenas no enunciado.