collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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

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

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • 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: 09 de Junho de 2019, 12:49 por Njay »

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.481
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.598
    • 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: 257
Re: Desafio: State Variable Filter
« Responder #3 em: 22 de Junho de 2015, 14:37 »

kF é a frequencia do cutoff ?

e o kQ ?

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • 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.598
    • 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 »

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • 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?

Online jm_araujo

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

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • 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.598
    • 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.733
  • 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.598
    • 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.

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • 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.598
    • 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.