Dúvidas Ep 2 Menor

Dúvidas Ep 2 Menor

por Shayenne Luz Moura -
Número de respostas: 19

Olá professor,

No enunciado do ep você escreveu:

"A entrada pode ser analisada com a sequência [inlet~] -> [fft~] -> [cartopol~]."

 

Eu tentei criar a sequência e tive o seguinte resultado:

"

cartopol~
... couldn't create

"

Não consegui encontrar o porquê desse problema.

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

Oi, Shayenne!

Me parece que sua instalação do pd-extended pode não estar completa (ou você não está usando o pd-extended). Tente rodar isso:

mqz@fourier:~$ cd /usr/lib/pd-extended/extra/
mqz@fourier:/usr/lib/pd-extended/extra$ find | grep cartopol
./cyclone/cartopol~.pd_linux
./cyclone/cartopol-help.pd
./cyclone/cartopol.pd_linux
./cyclone/cartopol~-help.pd

No pd-vanilla deveria ser fácil usar o [cartopol~] usando antes um [import cyclone].

Espero que ajude!

Marcelo

 

Em resposta à Marcelo Queiroz

Re: Dúvidas Ep 2 Menor

por Shayenne Luz Moura -

Olá professor,

na última aula você fez alguns exemplos com vetores que recebiam a magnitude e a fase do sinal.

Não consegui reproduzir isso e não encontro exemplos de como fazer. Você poderia disponibilizar os exemplos da aula?

 

Também estou tendo dificuldade em representar as equações, estou usando [expr] mas são necessários vários e o patch está ficando bastante poluído. Não sei se isso é um problema, mas está difícil até para eu entender.

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

Oi, Shayenne!

Estou enviando em anexo os patches que fizemos juntos na última aula, e que plota o espectro de magnitude. Eu não havia postado porque estão feios pra caramba, mas se ajudar, tá valendo.

Abraço,

Marcelo

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Carlos Eduardo Elmadjian -

Também vou aproveitar o tópico pra postar uma dúvida sobre o ep2_menor:

Na parte de interpolação quadrática, não estou muito certo quanto à notação:

a) F[k-1], F[k] e F[k+1] são bins consecutivos da FFT em que k é o índice da maior magnitude?

b) Na expressão do polinômio quadrático, a função de estimativa de frequência F(x) tem como parâmetro 'x', mas na fórmula a notação é um 'X' (maiúsculo). O que essa diferença significa?

c) Testei com algumas entradas a interpolação e o resultado de F(x) nem se aproxima do esperado. Reparei então que encontrando os valores de A, B, C e k para as minhas entradas, F(x) tem raiz complexa. Não consigo ver como F(x), definido dessa forma, irá produzir um valor real (sempre). Estou parado nesse ponto.

Em resposta à Carlos Eduardo Elmadjian

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

Vamos lá, Carlos Eduardo:

a) Os valores F[k-1], F[k] e F[k+1] são valores reais/não-negativos do espectro de magnitude (saída esquerda do [cartopol~]). Como F[k] é o valor máximo deste vetor, deve valer que F[k-1]≤F[k] e também que F[k+1]≤F[k].

b) aquilo foi um typo, considere X=x.

c) Pelo item (a), F(x) é uma função quadrática com termo quadrático negativo e com máximo F[k]>0, logo ela tem duas raízes reais; mas isso é mais ou menos irrelevante pois queremos encontrar o ponto de máximo, que é o índice x*. O código em octave abaixo ilustra essas fórmulas:

i = 1:100; % uma faixa de valores arbitrária
F = 100*sin(i.*log(i)/50)./(abs(i-35)+100); % uma função arbitrária
figure(1);
plot(i,F);
[Fmax,k] = max(F) % k é o índice correspondente ao máximo
A = (F(k+1)-2*F(k)+F(k-1))/2 % parâmetros do enunciado
B = (F(k+1)-F(k-1))/2
C = F(k)
x = linspace(k-1,k+1,100); % intervalo que contém o máximo do polinômio interpolador
Fx = A*(x-k).^2+B*(x-k)+C; % função polinomial interpolada no intervalo [k-1,...,k]
figure(2);
plot(x,Fx); % plota a função quadrática
k-B/(2*A) % índice fracionário correspondente ao máximo

Mas há de fato um erro aí no enunciado, pois a estimativa produzida deve ser a frequência associada ao índice fracionário x*, e portanto ela deveria seguir a fórmula (x*)*R/N. Corrigi o enunciado e já postei a versão nova.

Abraço,

Marcelo

 

Em resposta à Marcelo Queiroz

Re: Dúvidas Ep 2 Menor

por Shayenne Luz Moura -

O que nós temos que devolver é o resultado da interpolação comparado com a estimativa ou só a estimativa?

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

> O que nós temos que devolver é o resultado da interpolação comparado com a estimativa ou só a estimativa?

Depende de quem é "nós" na frase. O objeto rastreiaF0~ deve devolver 3 valores de frequência pelos outlets. Já o arquivo texto que vocês devem anexar deve trazer para cada tamanho de bloco, frequência e método considerado (são 27 combinações), o valor do erro em cents.

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Nicolas Figueiredo -

Professor,

Quando faço N=64, há uma grande variação nas estimativas. Para um [osc~ 1000], por exemplo, a estimativa por diferença de fase varia de 300Hz até 1600Hz. Não sei se isso é um erro de implementação, porque para Ns maiores o valor de f0 estimado fica bem estável e próximo do esperado. Mas na hora de avaliar os erros, devo tentar pegar o maior erro?

Em resposta à Nicolas Figueiredo

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

Oi, Nicolas!

Pode haver sim variações, pois uma onda de 1000Hz tem um período igual a 44.1 amostras, o que é quase o tamanho da janela considerada (64 amostras). Note que os bins da FFT estarão espaçados de 689Hz, então a frequência de 1000Hz cai entre os bins k=1 e k=2. Mas os valores que você mencionou têm algo de estranho que pode sugerir um erro de implementação: as estimativas deveriam estar caindo no intervalo [689,1378], se você está obtendo valores tão baixos quanto 300 é porque a interpolação quadrática talvez esteja considerando o intervalo entre k=0 e k=1. Não estou seguro de que isso pudesse ou não pudesse acontecer, mas veja por favor se o seu "k" está oscilando assim nestas estimativas.

Isso provavelmente tem relação com a questão da "assimetria" da interpolação quadrática que discutimos hoje em aula: 1000Hz está mais próximo de 689Hz (k=1) do que de 1378Hz (k=2), o que sugeriria que o máximo deveria recair sobre o índice k=1. Mas a variação grande de fase e o período incompleto da senoide faz com que o espectro fique demasiadamente "borrado" (experimente observar o gráfico do espectro de magnitude) e talvez esse máximo esteja mesmo oscilando, talvez entre k=1 e k=2. Provavelmente se computássemos uma interpolação cúbica usando os valores armazenados em k=0,1,2,3 para estimar o máximo a estimativa fosse bem mais confiável/estável. Mas não é isso o que o EP pede... sorriso

 

Em resposta à Nicolas Figueiredo

Re: Dúvidas Ep 2 Menor

por Carlos Eduardo Elmadjian -

- Nicolas, a minha implementação também estava com esse problema de às vezes mostrar valores abaixo de 689Hz para esse caso, mesmo com o k correto. Notei que isso só acontecia quando o delta(k) não caía dentro do intervalo [-pi, pi], o que pode ser corrigido como sugerido no enunciado.

- Professor, últimas dúvidas antes de entregar:

1) Quando a frequência é baixa (ex. 100Hz) e com uma janela pequena (ex. 64), é natural que k corresponda sempre ao primeiro índice da magnitude. Se k pertence a [0 .. N/2], a estimativa de frequência de pico sempre resultará em zero, gerando uma inconsistência no cálculo de erro, já que log(0) não está definido. Coloco então "-inf" para esse caso na tabela de erros?

2) Para a estimativa de interpolação quadrática, quando k fica nos extremos (zero ou freq. de Nyquist), os vizinhos não definidos pela varredura (ex.: k = -1 ou k = N/2 +1) devem ser zero ou algum valor refletido (conjugado)?

3) Sobre a coleta de erros, fiquei com uma dúvida parecida com a do Nicolas: devemos escolher o maior erro gerado para cada estimativa dentro de um intervalo de tempo (ex. 1 seg)? Ou devemos usar outro critério de seleção dos dados (média, mediana, menor-maior, aleatório...)? Pergunto isso porque o enunciado deu a entender que para cada uma das 27 combinações deve haver um único valor.

(Ah, ainda não está aberto um link para depósito do EP...)

[]s e obrigado pela atenção sorriso

Em resposta à Carlos Eduardo Elmadjian

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

Oi, Carlos Eduardo!

Faz total sentido esse exemplo dos 100Hz com 64 amostras. k=0 corresponde a f=0Hz, e o erro em cents será -inf mesmo.

O esquema de interpolação que eu passei usa F[k-1], então implicitamente considera que k>=1, o que não vai acontecer nesse caso; eu deveria ter sido mais cuidadoso. A solução natural seria considerar F[-1]=F[N-1] nesse caso. Note que não faz sentido conjugar valores do espectro de magnitude (que é real), e em particular também é verdade que F[-1]=F[1] (há simetria tanto em torno do 0Hz quanto em torno de Nyquist).

Quanto à coleta de erros, não precisa ser muito rigoroso, basta anotar um valor (veja que essa parte do trabalho é manual...). A ideia é que nos casos não-extremos esse valor variará pouco, e queremos ter uma ideia de como os erros dos métodos se relacionam.

Vou abrir o link para o depósito.

Abraço,

Marcelo

 

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Alessandro Palmeira -

Posso usar o objeto [tabminmax] ao invés de percorrer o vetor para encontrar o valor máximo?

Em resposta à Alessandro Palmeira

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

> Posso usar o objeto [tabminmax] ao invés de percorrer o vetor para encontrar o valor máximo?

Em princípio não houve restrições de uso de objetos neste exercício, diferentemente do que ocorreu no primeiro trabalho maior. Entretanto, me parece que o próprio enunciado responde à sua pergunta: "Um índice k ...  deve ser computado fazendo uma varredura simples da tabela correspondente, numa implementação semelhante à utilizada no primeiro trabalho maior". sorriso

 

Em resposta à Marcelo Queiroz

Re: Dúvidas Ep 2 Menor

por Shayenne Luz Moura -

Estou em dúvida quanto aos resultados...

A frequência de pico e a diferença de fase dão sempre o mesmo valor, isto está correto?

E algumas vezes os resultados são +, isso faz sentido?

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

Oi, Shayenne!

A frequência de pico e a diferença de fase deveriam dar sempre valores diferentes. Uma é kL/R (k inteiro) e outra é xL/R (x fracionário obtido pelas fórmulas da interpolação quadrática). x=k só aconteceria quanto o pico é perfeitamente simétrico, isso é quando F[k-1]=F[k+1]. Faça o seu patch imprimir esses x fracionários para te ajudar a depurar.

Esse "+" que você fala provavelmente é porque não cabem todos os dígitos significativos na caixa de número que você está usando para visualizar. Clique nas propriedades e aumente o tamanho da caixa.

Abraço,

Marcelo

Em resposta à Marcelo Queiroz

Re: Dúvidas Ep 2 Menor

por Shayenne Luz Moura -

kL/R?

 

A fórmula não é kR/N? E a diferença de fase não é a que possui o delta?

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

Sim, kR/N, escrevi sem consultar o enunciado, me desculpe.

A diferença de fase é a do Delta sim... acabei respondendo a pergunta errada... falei sobre a interpolação quadrática. De qualquer modo, não é para os métodos darem o mesmo valor normalmente. O esperado é que o erro seja menor na diferença de fase, maior na interpolação quadrática e muito maior no pico da FFT.

 

Em resposta à Shayenne Luz Moura

Re: Dúvidas Ep 2 Menor

por Antonio Abello -

Professor, alguma sugestão sobre como fazer o de fase? Precisamos de dois vetores? Como guardar o valor do k anterior para consulta?
Até agora interpretei o delta como sendo a diferença entre fase[k] e fase[k-1]. Só depois de testar percebi quão errado está...

EDIT: dei uma olhada no pdf melhor, já vi como fazer. Desculpa! :P


Outra coisa curiosa. Quando eu faço o programa funcionar pelo bang~, ele devolve valores altíssimos, completamente fora da realidade, mas quando eu uso o metro não importa quão rápido eu o deixe ainda continua normal o resultado. Pode ser que a caixinha number (ctrl+3) que recebe o resultado esteja interpretando uma série de resultados como um só e somando de alguma maneira?

Em resposta à Antonio Abello

Re: Dúvidas Ep 2 Menor

por Marcelo Queiroz -

> Quando eu faço o programa funcionar pelo bang~, ele devolve valores altíssimos

Isso não faz muito sentido... é necessário usar o bang~, de outro modo você não garante que estará pegando por exemplo a diferença de fase entre dois blocos consecutivos (o metro não terá esse tipo de precisão). Muito provavelmente eu não entendi o que você falou. De todo modo, substitua a caixinha de número por um print para ver se esses valores altíssimos estão realmente sendo produzidos pelo outlet do [rastreiaF0~].