collapse

* Links de Robótica

* Posts Recentes

Medir Agua que está no Poço por edeweld
[Hoje às 09:15]


Ajuda Projecto IR / RF por pmj_pedro
[Ontem às 16:23]


CNC Laser 60w por nandotx
[15 de Outubro de 2017, 19:01]


Equipar laboratorio por LVirtual
[13 de Outubro de 2017, 08:34]


Arranjo de Berbequim por jm_araujo
[13 de Outubro de 2017, 08:34]


Escolher ligações por dropes
[08 de Outubro de 2017, 23:26]


Perfis V-Slot vs C-Beam vs Bosch vs 8020 por senso
[08 de Outubro de 2017, 18:22]


Ideias para construir um quadrúpede simples por Njay
[07 de Outubro de 2017, 22:12]


Meu projecto - Arm Robot com arduino por Diogo Bento
[05 de Outubro de 2017, 20:54]


Alimentar arduino nano com 12V por helderjsd
[05 de Outubro de 2017, 16:26]

Autor Tópico: À procura da distorção de audio  (Lida 1808 vezes)

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

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.100
    • Tróniquices
À procura da distorção de audio
« em: 22 de Setembro de 2015, 02:05 »
Não sei onde hei-de meter o tópico, fica aqui.
A 13 de Junho de 2015, escrevi assim a uns amigos:


Ontem às 2h da manhã resolvi voltar a pegar no NanoTone. O efeito da distorção estava-me atravessado na garganta, e era um empecilho que me incomodava, como estar sempre a engolir em seco.

A distorção que implementei originalmente é um simples "hard clippig": amplificava o sinal absurdamente e depois saturava-o no limite do DAC. Mas uma distorção de guitarra é por um lado uma função de derivada contínua e por outro vai reduzindo o ganho muito suavemente, redução que acelera nos extremos até saturar - como acontece por exemplo com um andar amplificador semicondutor. A curva de transferência é mais ou menos aquilo a que em matemática se chama um sigmóide (https://en.wikipedia.org/wiki/Sigmoid_function). Esta curva de ganho é que cria o som característico de guitarra distorcida, introduzindo uma riqueza harmónica gradual e muito diferente de um hard-clipping (amplificação constante = 1 e saturação instantânea nos extremos).

Então andei por aí a vasculhar nesta grande biblioteca chamada Internet e o 1º sigmóide que encontrei foi esta função (gráfico em anexo):

f3(x) = -2/3, x < -2/3
f3(x) = x - x^3 / 3, -2/3 <= x <= 2/3
f3(x) = +2/3, x > +2/3


(https://ccrma.stanford.edu/~jos/pasp/Soft_Clipping.html)

Pareceu-me ter um clipping demasiado hard para o que eu imaginava, parecido quase com hard clipping. Mas a brincar com ela percebi que o "truque" para tornar a função constante "para lá" dos extremos sem que haja descontinuidade da derivada é encontrar os pontos em que a derivada é 0, e saturá-la aí.

Continuei à procura e encontrei uma discussão que começou em torno de um sigmóide complicado, e alguém sugere simplificar para:

fa(x) = atan(k * x) / k

(http://www.musicdsp.org/showone.php?id=104)

De facto a função arco-de-tangente (arctan, atan na informática) é um sigmóide que toda a gente do ramo das ciências conhece ou pelo menos está familiarizado por causa da função tangente. Nesta função fa() o parâmetro k permite ajustar a "agressividade" do clipping, que foi algo que me chamou inicialmente a atenção para esta página (ver gráfico animado no final da página!). Na prática acabei por ficar com k = 1 porque dá bons resultados, e portanto usar apenas a função atan directamente.
Ora calcular atan num microcontrolador é que é mais chato :), mas nesta mesma discussão outro alguém sugere a seguinte aproximação (chamei-lhe fatan de "fast atan") (gráfico em anexo):

fatan(x) = x / (1 + 0.28125 * x^2)

Encontrei este artigo que fala sobre esta aproximação, a que dei uma olhadela só por alto (quem sugeriu esta aproximação na discussão indicava apenas 0.28 para a constante e não 0.28125 como neste artigo):
http://www.embedded.com/design/other/4216719/Performing-efficient-arctangent-approximation

No entanto a fatan() trás escondidas 2 surpresas: |fatan| não chega bem a 1.0 (mas close enough), e a aproximação é boa quando o resultado está no intervalo [-1;1] mas fora deste intervalo ela não "satura", e começa a crescer em sentido contrário (gráfico em anexo). Já munido da experiência de ter andado a brincar com a f3() inicial, fui a http://www.derivative-calculator.net/ :) calcular a derivada de fatan() e depois calculei à mão os seus zeros em torno de fatan(x) = -/+1, que são -/+1.8856181 e cheguei então à "minha" 1ª função de soft clipping:

sclip(x) = fatan(-1.8856181), x < -1.8856181
sclip(x) = fatan(x), -1.8856181 <= x <= 1.8856181
sclip(x) = fatan(+1.8856181), x > +1.8856181


Podem ver este link directo para o cálculo da derivada da fatan, de que o site também mostra gráficos:
http://www.derivative-calculator.net/#expr=x%20%2F%20%281%20%2B%200.28125%20%2A%20x%5E2%29

E se por um momento pensaram que a coisa acabou aqui, enganaram-se :) . Esta função é muito bonita mas ainda usa números reais e não está escalada para usar o intervalo que me interessa do ADC (12 bits com sinal). Portanto tudo isto ainda foi transformado e optimizado para

inline int32 fatan (int32 x, int32 unit)
{
    // fatan = x / (1 + 0,28125 * x^2)
    // fatan = x / (unit + 0,28125 * x^2)
    // 0,28125 = 9 / 32
    // fatan = x / (unit + 9 * (x^2) / 32)
    return FPDIV(x, (unit + 9 * FPMUL(x, x, unit) / 32), unit);
}

inline int32 SoftClipper (int32 x)
{
    const int32  Unit = 1024;
    const int32  sat = PosREAL2FP(1.8856181, Unit);
    if (x > sat)
        return fatan(sat, Unit);
    else if (x < -sat)
        return fatan(-sat, Unit);
    return fatan(x, Unit);
}


Se colocar a Unit com mais ou menos metade do número de bits do ADC, como a saída é de -1 a 1 para uma entrada de -/+ ~1.9, fico logo com um soft clipper "natural" para o meu sistema, a saturar perto dos extremos da gama dinâmica (como se quer).
O site http://www.derivative-calculator.net/ faz outra coisa interessante. Antes de calcular a derivada, ele re-escreve a função simbólicamente, simplificando-a e convertendo todas as constantes reais para fracções. Aproveitei esse facto para rapidamente arranjar um substituto inteiro para 0.28125 (http://www.derivative-calculator.net/#expr=0.28125), que deliciosamente se consegue representar sem erro por 9/32, reparem na divisão por 32, e multiplicação por 9 (8 + 1) em caso de necessidade.
A macro PositiveREAL2FP() converte um número real positivo para ponto fixo com uma determinada unidade. FPMUL() e FPDIV() são macros para multiplicar/dividir em ponto fixo. fatan(-/+sat,Unit) são constantes, usei a função apenas por conveniência; na verdade já vi o GCC optimizar coisas deste género calculando a constante (quando é tudo constante e as funções são inline), mas não verifiquei se o está a fazer neste caso.

Pelo caminho ainda aprendi um nadinha de libreoffice BASIC, que usei para criar novas funções "built-in" para fazer experiências no "Excel". Ideal teria sido um matlab, octave, ou similar, sim. Também ainda me cruzei com o CORDIC (https://en.wikipedia.org/wiki/CORDIC). E outras 2 discusões a explorar melhor mais tarde:
http://www.dsprelated.com/showthread/comp.dsp/74732-1.php
http://www.kvraudio.com/forum/viewtopic.php?t=195315

Ainda em anexo, 2 exemplos da actuação do softclipping. Ainda hei-de arranjar uns WAVs, mas só depois de resolver o problema do ruído.

End-of-report...

Abraços

--

Tenho isto "alinhavado" num PSoC4 em tempo real, mas ainda com uns problemas para resolver. Além da distorção ainda tenho reveberação (o chip tem pouca RAM, só dá para reveberação), filtro LP, filtro HP, filtro MP, tremolo e auto-wah.
« Última modificação: 22 de Setembro de 2015, 15:11 por Njay »

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 1.921
Re: À procura da distorção de audio
« Responder #1 em: 22 de Setembro de 2015, 11:22 »
Boa explicação  ::)

Há muitos efeitos que se conseguem fazer em tempo real, ou próximo disso enquanto o processador o permitir, ao colocar divisões ou multiplicações com nºs faccionários a coisa torna-se mais exigente.

Gostei do exemplo n2º, creio ser o usado nas guitarras eléctricas, existe sim distorção, mas se for suavizado obtém-se um som mais agradável, daí muitos preferirem usar válvulas para o efeito... tudo analógico.

Também gosto de usar código em som, não é bem um desafio mas com bastante dedicação obtém-se bons resultados, alguns deles que até são simples mas que na realidade deram uma grande trabalheira.

Existem ICs dedicados para tudo, desde atrasos de linha com o TDA1022, AGCs, compressores/expansores, sintetizadores, etc... todos eles têm um problema em comum, geram ruído, isso em código pelo que é possível, fica-se em vantagem.
Depois também à a possibilidade de se trabalhar na edição do áudio, pode-se alterar a velocidade entre a entrada e saída para mudar o tom, é algo engraçado, come alguma memória mas pouca.

Um enorme desafio, isso sim vai ter de ter um micro à altura como o rpi, será de alterar em tempo real a voz para o tom correcto (já usado para quem não tem lá grande voz mas que quer cantar/repar wathever), se for mais além e se conseguir entender o que o Melodyne faz (referenciado no comentário de reposição de tom) + outros truques, teria o famoso GLaDOS, ainda não perdi a esperança ;)

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.641
    • Electronic Gear for Musicians
Re: À procura da distorção de audio
« Responder #2 em: 22 de Setembro de 2015, 12:59 »
Tenho isto "alinhavado" num PSoC4 em tempo real, mas ainda com uns problemas para resolver. Além da distorção ainda tenho reveberação (o chip tem pouca RAM, só dá para reveberação), filtro LP, filtro HP, filtro MP, tremolo e auto-wah.


Boa explicacao e exemplificacao.
Gostei especialmente desta parte final.

Talvez agora passar para um Cortex-M4F com floating point, e capacidades DSP pois acredito q vai ajudar na computacao.
Ha alguns fabricantes q teem M4F com boa capacidade de RAM, ou entao quem sabe usar uma RAM externa paralela ligada ao micro. Mt rapida e super easy de usar.

Qts milisegundos tens no Reverb ?  estou curioso.
Tenho usado os chips analogicos p fazer umas brincadeiras, com a familia MN3007 e afins, completamente obsoletos e c muita procura no mercado paralelo de clones.

Sugestao, implementar uma entrada analogica p pedal de expressao e tornar o WahWah manual :)

Se precisares de beta-tester apita pois vou comecar a tocar ao vivo outra vez no inicio do ano q vem.


Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.100
    • Tróniquices
Re: À procura da distorção de audio
« Responder #3 em: 22 de Setembro de 2015, 16:08 »
Melodyne, GLaDOS.... tanta cena que desconheço :), tenho que ir ver. TDA1022 não é um "bucket brigade"? Deve ser do género desse MN3007, pareceu-me ser tb um BB. Vi isso numa revista de electrónica brasileira há mtos, mtos anos.

Isto não tem (pelo menos ainda :D ) qualidade suficiente sequer para hobby, mas obrigado pela oferta de beta-testing Sena :) O problema que ainda tenho tem essencialmente a ver com ruído; uma parte é da montagem (cozinhei uma cena à pressa, é um PCB genérico aberto e sem cuidado nenhum com routing), a outra penso que é ruído de quantitização, pois o sinal de entrada é fraco e o DAC tem poucos bits (9). Ainda tenho que dedicar algum tempo a perceber bem e a melhorar isto. A parte de software está razoável e não tenho grandes queixas dela, o CPU dá conta dos efeitos todos ligados em simultâneo e os efeitos em si soam razoavelmente bem. Se precisar de mais performance ainda tenho muita margem de manobra para optimizar o código, sem contar que posso prescindir de toda a interface de UART que tenho para controle, debug e monitorização (é cerca de 60% do programa todo!); também ainda posso ir buscar mais 7MHz, o chip faz 48MHz e estou a usar 41MHz. Não tenho falta de CPU power, tenho sim falta de RAM e DAC. De facto as RAMs são bastante baratas, ainda acabo a juntar-lhe uma.

Neste momento tou a fazer a aquisição a 36Ksps com o ADC de 12 bits, a fazer o processamento todo numa interrupção de timer com cálculo intermédio de 32bits (ponto fixo), e a escrever para um DAC de 9 bits (não por esta ordem; a escrita no DAC é a 1ª coisa na interrupção, para não se introduzir jitter). O DAC tem poucos bits para isto; ainda quero experimentar uma saída de PWM filtrada, que dá para ter 16 bits, antes de ir para um DAC externo. O tempo de propagação da entrada para a saída é basicamente um periodo de sampling, ou seja neste momento 27.7us.

40.88ms de buffer de reverb. E tem perfeitamente espaço para meter um pedal externo para controlar o wah (ou outro parametro doutro efeito, ou até mais pedais). Neste momento controlo isso por UART.

Tenho algumas ideias de como tornar isto numa pequenina caixa alimentada por 2 pilhas AA/AAA, seria um nano pedal de agarrar a uma guitarra (daí o NanoTone, mas tenho que procurar outro nome que este tá mto batido), com alguns botões a controlar uma matriz de LEDs que permite configurar se cada efeito está ON/OFF e qual a ordem de alguns dos efeitos. A ideia era ser uma cena mesmo pequena e simples; o PSoC4 tem algum hw porreiro para isto como ADC, DAC (infelizmente de poucos bits, mas são IDACs o que permite mais flexibilidade) e ampops, que estou a usar como pré-amplificador e buffer de saída. No proof-of-concept, além do prototyping kit PSoC4 (que custa uns 5 ou 6€) só tenho uma dúzia de passivos incluindo fichas e botões.
« Última modificação: 22 de Setembro de 2015, 16:23 por Njay »

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.126
Re: À procura da distorção de audio
« Responder #4 em: 22 de Setembro de 2015, 16:24 »
40.88ms de buffer de reverb. E tem perfeitamente espaço para meter um pedal externo para controlar o wah (ou outro parametro doutro efeito, ou até mais pedais). Neste momento controlo isso por UART.

Uma vez andei a pensar fazer umas cenas na area, mas mais ligadas a syntetizadores.
Uma ideia que tinha na altura e nao descobri se ja existe, era implementar um algoritmo que "parametrizasse" a onda e depois reproduzisse o mesmo durante algum tempo de modo a fazer um efeito "reverb"
Isto no fundo pode ser considerado uma compressao de muitas perdas. Mas por exemplo, se extraires as harmonicas do sinal, depois podes continuar a usa-las para fazer o efeito (do teu processador) e ao mesmo tempo faz soar a reverb..
Penso que isto tambem se pode chamar "resynthesis"

Outra opcao mais facil, eh fazers o reverb com um passa baixo e menos bits. (ganhas assim mais tempo de reverb)
Depois tambem podias usar isso (o facto de ter levado com um passa baixo) e usar um metodo qq de compressao (ex: delta)

Estas solucoes trocam RAM por CPU power.

Bom trabalho!

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.100
    • Tróniquices
Re: À procura da distorção de audio
« Responder #5 em: 22 de Setembro de 2015, 16:48 »
Sim, é uma boa ideia, a de reduzir a fidelidade do sinal atrasado. Estou a guardar a sample toda usando 16bits, podia reduzir para 8 bits / sample no buffer e ficava logo com o dobro do tempo máximo de reverb. Ainda por cima só estou a mixar (na sample actual) 75% da sample atrasada, só aí já estou a deitar fora alguma informação. Hei-de experimentar isso.

Acho que isso que tás a falar de parametrizar a onda, existe, ou existiu, para voz, e chamava-se vocoder, penso que era usado exactamente em... telemóveis :). Não sei se depois passaram para GSM (o algoritmo de compressão de voz).

Este é o meu andar de entrada. Se alguém tiver alguma sugestão... O ampop faz parte do PSoC4, não tenho mais ampops livres. O meu desenho inicial era fantástico, tinha muitos MOhm de impedancia de entrada (montagem não-inversora e ref de entrada em Vdda/2 em vez de GND)... mas depois quando o montei rapidamente percebi que nunca iria funcionar numa guitarra, porque ambos os fios de entrada de sinal tinham que ser blindados :\ . O ruído era abismal.

Ah, dá para ligar directamente uns phones à saída e curtir sem amplificador (a saída do DAC é buffered por um dos ampops do PSoC4), mesmo com uma R de 56 Ohm que meti em série com a saída para não exceder a corrente máxima de saída do ampop. O sinal não é muito alto mas num ambiente silencioso dá perfeitamente.
« Última modificação: 23 de Setembro de 2015, 00:56 por Njay »

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.126
Re: À procura da distorção de audio
« Responder #6 em: 23 de Setembro de 2015, 09:11 »
Acho que isso que tás a falar de parametrizar a onda, existe, ou existiu, para voz, e chamava-se vocoder, penso que era usado exactamente em... telemóveis :). Não sei se depois passaram para GSM (o algoritmo de compressão de voz).

Acho que vocoder tem varios significados diferentes. Por exemplo um vocoder (synthetizador) que modula o pitch de uma entrada (ex micro, voz) de acordo com outro sinal.
Os algoritmos de compressao de voz, foram desenhados particularmente.. para as caracteristicas da voz, eh possivel que se considere que restora um sinal sintetizando-o.

Talvez o mesmo se podesse fazer para a guitarra. Estudar as caracteristicas do input e usar esse conhecimento para uma compressao e geracao em tempo real.

Por exemplo, existe este algoritmo para gerar "cordas pulsadas"
https://en.wikipedia.org/wiki/Karplus%E2%80%93Strong_string_synthesis

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 1.921
Re: À procura da distorção de audio
« Responder #7 em: 23 de Setembro de 2015, 14:17 »
Melodyne, GLaDOS.... tanta cena que desconheço :), tenho que ir ver. TDA1022 não é um "bucket brigade"? Deve ser do género desse MN3007, pareceu-me ser tb um BB. Vi isso numa revista de electrónica brasileira há mtos, mtos anos.
Pensei que fosse de teu conhecimento o jogo "Portal" é um clássico da "Valve".


TDA1022, sim é um "bucket brigade line", 512 memórias analógicas, creio ser através de condensadores ou algo parecido, são caros, mas com 2 dá para se alterar o pitch, gravando uma velocidade e reproduzindo alternadamente a outras velocidades.

Mesmo só tendo 512 memórias analógicas, é possível criar uma reverberação com baixo ruído.

A falha que estás a fazer é reproduzir em PWM, depois de tanto trabalho de código é bom que tivesses uma saída DAC.

A compressão / expansão de áudio podia ser usado à uns anos atrás em cassetes de áudio para aumentar a gama dinâmica delas, cheguei a comprar os ICs, além de caros o ruído de fundo desmotivou-me.

ps: ainda cheguei a criar um leitor MOD, 4 canais em que reproduzia samples a velocidades diferentes em simultâneo seguindo uma pauta, além dos efeitos exigidos, tudo em assemby AVR, fotos na minha pág.  ;)

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.100
    • Tróniquices
Re: À procura da distorção de audio
« Responder #8 em: 23 de Setembro de 2015, 18:59 »
Acho que vocoder tem varios significados diferentes. Por exemplo um vocoder (synthetizador) que modula o pitch de uma entrada (ex micro, voz) de acordo com outro sinal.
Os algoritmos de compressao de voz, foram desenhados particularmente.. para as caracteristicas da voz, eh possivel que se considere que restora um sinal sintetizando-o.
Sim, no limite da compressão, tens TTS :)

Citação de: KammutierSpule
Talvez o mesmo se podesse fazer para a guitarra. Estudar as caracteristicas do input e usar esse conhecimento para uma compressao e geracao em tempo real.

Por exemplo, existe este algoritmo para gerar "cordas pulsadas" (...)
Não estou mto por dentro desse mundo, mas parece que actualmente há algoritmos muito bons para gerar som de guitarra.

Nunca fui grande aficionado de (jogar :)) jogos dropes, e a maior parte dos que joguei foi no spectrum.

Não estou a usar PWM.

Em assembly, g'anda maluco hein :) . Conheço bem os MOD, compus alguns, e no PC tb cheguei a fazer uma espécie de MOD player (lia um formato custom e tinha menos efeitos), em Turbo Pascal (não me lembro se meti asm nesse projecto), que usava a SoundBlaster (programando a placa directamente claro, à Homem lol).