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.