collapse

* Links de Robótica

* Posts Recentes

Power_OK Enermax por almamater
[Hoje às 12:10]


Feira de electricidade e eletrónica por edeweld
[Hoje às 02:02]


Recomendação de um opamp para um DAC r2r por jm_araujo
[Ontem às 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: Desafio: State Variable Filter  (Lida 8202 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Desafio: State Variable Filter
« em: 21 de Junho de 2015, 16:45 »
Desta vez é só o desafio, não há ofertas.
Andava aí a instruir-me um bocado por causa dum projecto que tenho em mãos e encontrei esta topologia de filtro que achei bastante interessante, especialmente para aplicar no domínio digital, e para áudio: o State Variable.

O filtro nasceu no mundo analógico (podem procurar na wikipedia) onde se constitui por 3 ampops e depois também saltou para o mundo digital. Tem algumas particularidades que o tornam muito interessante para audio e implementação em microcontroladores:

1) É relativamente leve de computar (e só precisa de 2 valores anteriores).

2) Os parâmetros são independentes e fáceis de calcular; os dados de entrada são a frequência de corte/central e o "damping" ou Q e saiem o kf e o kq usados no filtro.

3) É um filtro de 2ª ordem (12dB/oitava em vez dos 6dB/oitava de um filtro de 1ª ordem), portanto já tem um efeito que se nota bem.

4) Da mesma implementação podemos obter um LP (low pass), HP (high pass), ou um BP (band pass), só muda o ponto no cálculo de onde tiramos o output. Supostamente ele também faz um BR (band reject), mas nas experiências que fiz pareceu-me não fazer nada.

Vejam no final desta página uma demo interactiva de um LP com este filtro:
http://worrydream.com/Tangle/

Não encontrei nenhum "diagrama de diferença" (acho que é este o nome destes diagramas) que me agradasse por isso peguei no do site acima e modifiquei-o para mostrar aqui:



Baseado no diagrama fiz esta implementação (excerto), que incrivelmente saiu bem logo à 1ª :) ; não foi difícíl perceber como passar do diagrama para código; reparem que o diagrama está anotado com os nomes das variáveis no código:

    static int16  lp_prev = 0;
    static int16  bp_prev = 0;
    // State variable filter calculation.
    int16  s1 = ISCALE((int32)bp_prev, -kq, 256);
    int16  hp = sample + s1 - lp_prev;                   // high pass
    int16  bp = ISCALE((int32)hp, kf, 256) + bp_prev;    // bandpass
    int16  lp = ISCALE((int32)bp, kf, 256) + lp_prev;    // lowpass
    lp_prev = lp;
    bp_prev = bp;
    sample = lp ou hp ou bp...


O sinal de áudio (amostra) entra e sai na variável sample, que é de 16 bits. A macro ISCALE é uma multiplicação em ponto fixo, podem ignorar o 3º argumento e olhar para ela apenas como multiplicação dos 2 primeiros argumentos. Se quisermos um LP tiramos o sinal da variável lp, um HP da variável hp, etc.

Com isto acabei também por experimentar um efeito de guitarra que é muito fixe, o wah-wah, que consiste na variação periódica (auto-wah) ou consoante o sinal de entrada (wah "normal"), da frequência central de um filtro BP.

Alguém aceita o desafio de implementar isto num Arduino ou microcontrolador que quiserem? Portanto o desafio é, e se o aceitares (muahh ahh ahh ahh), fazer uma "caixa" onde entra audio por um lado e sai o áudio com efeitos pelo outro. Os efeitos que podem ser feitos só com este filtro incluem equalização (atenuação e boost) e wah wah. Posso ajudar.
« Última modificação: 21 de Junho de 2015, 17:02 por Njay »

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.142
Re: Desafio: State Variable Filter
« Responder #1 em: 21 de Junho de 2015, 17:56 »
Good good! Mas nao vou aceitar o desafio :/ :)

Ja agora deixo aqui uma dica, um algoritmo idêntico mas apenas para detectar a presença de uma frequência
https://en.wikipedia.org/wiki/Goertzel_algorithm

Por exemplo para detectar DTMF, beacons, etc..
Na altura que descobri isto pensei usa-lo para fazer os detectores de obstáculos IV e para detectar o beacon IV para um robot.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Desafio: State Variable Filter
« Responder #2 em: 21 de Junho de 2015, 18:12 »
Então, não te sentes capaz :)?

Conheço o Goertzel, já tive que integrar num PBX uma lib de dominio publico que o usa para detectar DTMF (tone_detect.c/.h).

Offline andElectrons

  • Mini Robot
  • *
  • Mensagens: 256
Re: Desafio: State Variable Filter
« Responder #3 em: 22 de Junho de 2015, 14:37 »

kF é a frequencia do cutoff ?

e o kQ ?

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.167
  • NERD!
Re: Desafio: State Variable Filter
« Responder #4 em: 22 de Junho de 2015, 14:43 »
São parâmetros calculados:
Citar
2) Os parâmetros são independentes e fáceis de calcular; os dados de entrada são a frequência de corte/central e o "damping" ou Q e saiem o kf e o kq usados no filtro.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Desafio: State Variable Filter
« Responder #5 em: 22 de Junho de 2015, 15:40 »
kf e kq são os "coeficientes" do filtro. São calculados assim:

kf = 2 * sin(pi * Fc / Fs)
kq = 1 / Q


Fs é a frequência de amostragem que estiveres a usar, Fc é a frequência de corte do filtro (passa alto e passa baixo) ou central (caso do passa banda). O Q é uma espécie de multiplicador (amplificador/atenuador) que actua na Fc; Q=1 não afecta o volume das frequências em torno de Fc (face ao que o filtro faz normalmente), se Q > 1 então o efeito do filtro é reforçado, se < 1 o efeito é atenuado. Na página que deixei há um simulador interactivo disto, para um passa baixo, podes mexer no gráfico e ver os valores de Q e Fc a mudarem e o efeito no gráfico da amplitude versus frequência.

Como temos aqui números reais, ou se utilizam floats (lento lento e código grande) ou simulam-se os reais com números em ponto fixo. Se nunca mexeram com números em ponto fixo, podem começar por implementar usando floats e uma frequência de amostragem baixa, e depois quando estiver a funcionar então passar para números em ponto fixo e aumentar a frequência de amostragem.
« Última modificação: 22 de Junho de 2015, 15:48 por Njay »

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.167
  • NERD!
Re: Desafio: State Variable Filter
« Responder #6 em: 22 de Junho de 2015, 16:19 »
Estava a ler mais um bocado sobre essa topoligia e encontrei este site:
http://www.earlevel.com/main/2003/03/02/the-digital-state-variable-filter/

Tem uma pequena diferença na topologia em relação ao teu diagrama:

O bandpass é todo "atrasado", e não só no feedback para o inicio como no teu. Será por isso que o teu Band reject não funcionou?

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.167
  • NERD!
Re: Desafio: State Variable Filter
« Responder #7 em: 22 de Junho de 2015, 16:25 »

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Desafio: State Variable Filter
« Responder #8 em: 22 de Junho de 2015, 17:36 »
Sim, é para a confusão :). Também vi um livro sobre o assunto e não mencionam o bandpass. Depois volto a investigar, na altura não era muito importante.

Offline ivitro

  • Mini Robot
  • *
  • Mensagens: 451
Re: Desafio: State Variable Filter
« Responder #9 em: 22 de Junho de 2015, 17:43 »
O que é suposto ter na saída?

Posso tentar implementar isso... diz-me a frequência de amostragem.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Desafio: State Variable Filter
« Responder #10 em: 22 de Junho de 2015, 19:01 »
O que é suposto ter na saída?
Áudio?... O objectivo é inventar. Entra audio, processa-se com filtros, passa bandas/baixo/bass-boost/whatever e sai esse audio processado. Em tempo real.

Citar
Posso tentar implementar isso... diz-me a frequência de amostragem.
A que tu quiseres/conseguires.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Desafio: State Variable Filter
« Responder #11 em: 22 de Junho de 2015, 19:13 »
Será que isso cabe nos pedacinho de "FPGA" que um PSoC4 tem?
Avr fanboy

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Desafio: State Variable Filter
« Responder #12 em: 22 de Junho de 2015, 19:43 »
Ainda não experimentei. Se couber, deve ser uma implementação "apertada", porque não há multiplicador em hw, teria que ser implementado. De resto faz-se bem com um PSoC4 ;), tens ampops e tudo.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.167
  • NERD!
Re: Desafio: State Variable Filter
« Responder #13 em: 22 de Junho de 2015, 22:42 »
Tem aqui umas dicas boas para uma implementação em Arduino com Atmega:
http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-realtime-audio-processing/

Se calhar ainda meto mãos ao desafio :D

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Desafio: State Variable Filter
« Responder #14 em: 23 de Junho de 2015, 01:48 »
Eheheh... se usares a tensão de referência interna para o ADC, ficas com mais "amplificação" da entrada.