Ir ao conteúdo
  • Cadastre-se

Algoritmos para processamento digital de sinais.


Felipe Electronic

Posts recomendados

  • 2 semanas depois...

Voltando a ativa, ou parcialmente...

Mestre Paulo perdoe esse que vos escreve... dessa vez não foi pra estudar não, terminei meu mestrado, mas quando abri os olhos... pô casei! Ai já viu não é...

Enfim, estou trazendo um link quente para o analisador de espectro, na verdade pensando sobre o assunto enquanto estive no tibet, achei que esses displays inteligentes da 4D systems (baratinhos!) poderiam deixar a IHM do nosso spectrum bem legal não acha? vejam:

http://www.4dsystems.com.au/products

 

É por um desses, e esquece o HW do display... a boa notícia que tenho pra vocês a respeito desse spectrum em projetos recentes que tive, esqueçam a matemática pesada da FFT, não precisamos entender o algoritmo em detalhes (apenas alguns parametros), além do mais tomei conhecimento de uma outra transformada que me pareceu matematicamente mais fácil de desenvolver:

A chirp Z transform...

A propósito @aphawk  e @MatheusLPS a que ponto andam as pesquisas dos projetos?

Abs!

:)

Link para o comentário
Compartilhar em outros sites

Mestre @,

Arre !!!! Caramba, pensei que tinha acontecido alguma coisa grave ( bom.... Casar é grave também kkkk ) !

Parabéns, e ainda mais com uma visita ao Dalai Lama para pegar inspiração, voce está renovado !

Legal esses displays, eu tenho uns 3 desses tipos comigo, só estou esperando um uso legal. São semelhantes.

O Vtrx andou utilizando displays desse tipo, mas para ficar rápido, só com Arm a 90 Mhz, dá uma procurada no tópico que ele fez.

Eu pesquisei uma solução legal, é a transformada Hartley, existe uma library para o Arduino, muito legal, bem rápida ocupa metade da memória Ram e menos da metade do processamento da FFT. Com ela dá para trabalhar em tempo real , mesmo a 16 Mhz.

Dá uma olhada nisto :

http://wiki.openmusiclabs.com/wiki/ArduinoFHT

Mas se precisar de mais velocidade, posso tocar o Atmega328 a 32 Mhz...

Essa que voce falou, chirp Z, nem faço ideia kkkkk ! estou velho demais, meu amigo !

Eu consegui fazer um excelente display matricial, com o Max7219, com 4 matrizes fica uma grande tipo 16x16, e comprei 25 matrizes especiais, bicolores mas para o Max7219 !!! Assim dá para fazer até tipo acima de +3db acender cor diferente, no topo.

Outra ideia è acrescentar mais duas matrizes, fazer uma tipo 24c x 16l, assim podemos mostrar stereo.

Bom, vamos trocando ideias ok ?

Um abraço , e bem vindo mais uma vez !

Paulo

Link para o comentário
Compartilhar em outros sites

@

 

Heheheh, até tomei um susto quando recebi a notificação sua.

 

Sobre a questão de como anda o projeto. Ele está parado. Como Paulo mencionou, a gente acaba sempre precisando de um uC muito parrudo para fazer os cálculos. Mas como você tem uma ideia nova, mas aguardar.

 

@aphawk

 

Esse site que você lincou, eu já tinha lido ele. Exatamente esse artigo. Só que mais uma vez, toda rotina de FFT que vejo, utiliza assembly em alguns pontos do código. Como nao sei nada, fica complicado.

 

Falou

Link para o comentário
Compartilhar em outros sites

@aphawk 

 

Gostei dessa transformada Hartley, vou dar uma olhada de como está implementada no arduino, e ver o que da pra otimizar.

 

Sobre o display, você tem deles? vende a quanto? to esperando a 3 meses o meu chegar e nada dos correios hahaha!

 

Sobre as rotinas da FFT, acho legal criar ela baseada na KissFFT, um fonte super simples em C portável para qualquer micro.

Outra dúvida, precisa ser realmente em Basic? Posso fazer o seguinte para acelerar o processo, compilar ela em C e exportar as funções para que fique acessíveis usando Basic. Vocês decidem (sim da pra fazer rápido até no CCS :D ).

 

@Matheus_LPS

 

Foi bom ficar fora por um tempo justamente pra dar uma reciclada, a conclusão que cheguei é que não vamos precisar de um micro tãaaao parrudo dependendo das especificações, vale lembrar que nao precisamos de um FFT em tempo real, o processamento pode ser feito a através de frames, daí decidimos uma taxa de atualização por segundos.

Infelzimente so poderei ajudar vocês com o código, pois meu laboratório ta em reforma, sem previsão para ficar pronto... logo a parte do display e montagem vai ter que ser com vocês.

Abs!


 

Link para o comentário
Compartilhar em outros sites

@aphwak, 

 

Sensacional o link da FHT, na verdade a Chirp Z transform opera no mesmo principio em que são descartada a parte complexa do sinal que vamos analisar, isso economiza uma RAM tremenda, Estou lendo agora as derivações matematicas da FHT, mas acho que da pra fazer um analisador de espectro com uma boa taxa de frames por segundo, e ainda da pra recorrer a alguns truques de DSP dentro do AVR e melhorar ainda mais a velocidade (buffers ping-pong por exemplo, e endereçamento circular)

 

@Matheus_LPS

Contem comigo com a parte de código, fora que quando ficar pronto certeza que vou montar também, isso é quando reformar meu lab ahahahahahah! Mas pretendo usar um ARM pra fazer uma versão minha até pelo costume :)

Abs!

Link para o comentário
Compartilhar em outros sites

@,

 

O Bascom também aceita Assembler no meio do código, e os AVR's tem algumas operações em que ele é muito rápido. Tem este link que ensina muito bem como fazer as operações matemáticas em Assembler, e com isso deve ficar um avião ....

 

http://www.avr-asm-tutorial.net/avr_en/calc/index.html

 

O código do link que eu te passei antes, que está em C, já usa um monte de truque para otimizar, eu gostei das funções extras que já normalizam o resultado para nós da maneira que for necessária ! 

 

O que eu preciso seria ver o algoritmo, a sequência de operações, para eu poder entender e fazer no Bascom. Tipo aquelas listagens de Fortran kkkk

 

Vamos fazer esse troço aí logo !

 

Paulo

Link para o comentário
Compartilhar em outros sites

Vale tomar um cuidadinho, pois nem todos os AVR possuem as instruções de multiplicação : MUL, MULS... o ideal seria combinar o estudo com um pouquinho do endereçamento indireto do AVR (que por sinal é maravilhoso), atenção "PIC users" endereçamento indireto que funciona bem, só nos PIC24, que aliás me fizeram perdoa - lo e reatar meu namoro com a Microchip :)

Paulo, saberia me dizer como funciona o processo de compilação do bascom? ou melhor poderia postar um sample do arquivo .o que aparece depois de compilado... eu poderia estudar ele e fornecer o compilado e as API em Bascom para acessar as funções... ou no pior caso escrever em assembly, para que qualquer usuario do AVR consiga usar...

E para as outras plataformas da pra fazer em C e portável, inclusive funcionando no CCS :)

Abs.

Felipe

Link para o comentário
Compartilhar em outros sites

@,

É bem interessante o processo do compilador. Eu tenho comigo dois livros avançados sobre o Bascom, onde mostram exemplos de códigos compilados e os respectivos arquivos em Assembler. É muito fácil identificar as instruções !

Já ví vários exemplos onde simplesmente se toma um pequeno cuidado com o básico, tipo stacks, e salvamento de pilhas, e se colocam milhares de instruçòes em Assembler, e cepois volta normal ao Basic....

Existe um recurso no Bascom que é incrívelmente poderoso, que é o Overlay, onde consigo declarar estruturas "paralelas" às variàveis, vou passar um link para voce entender, e com isto fica bem mais fácil acessar as variáveis direto do Assembler :

http://www.mcselec.com/index.php?option=com_content&task=view&id=307&Itemid=57

Quanto ao Assembler e o Bascom, tem estes links :

http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=11695&highlight=asm

http://avrhelp.mcselec.com/index.html?mixing_asm_and_basic.htm

Uma coisa que voce pode ver também é que o Bascom é compatível com o Proteus !!! Assim voce pode observar o código gerado direto nele.

Mais tarde vou escanear as páginas dos livros e posto aqui, junto com uns arquivos de exemplo.

Paulo

Link para o comentário
Compartilhar em outros sites

@aphawk,

Obrigado pelos links, o processo de compilação sempre serão similares em relação a outras linguagens, estudei os outputs mas creio que a melhor forma de portar a FHT para o AVR usar com Bascom ou C será fazer em assembly mesmo e exportar a chamada da função pra C ou Basic.

Essencialmente isso é fácil pois basta saber como funciona o "calling convention" do Basic, ou seja quando chamamos uma função com parametros em quais registradores vão as variaveis passadas como parametro.

Eu tenho um palpite que é quase certeza que vai assim: primeiro parametro em R0, segundo em R1, terceiro em R2, quarto em R3 e demais parametros vão no stack... Tem que ver como se comporta em caso de parametros de 16bits ou seja as variaveis estão fora do modelo "small" de memoria (onde ficam os primeiros 256 bytes) dai fica facinho acessar usando o endereçamento indireto dos AVR (que por sinal é maravilhoso)  através dos registros X,Y e Z :)

Continuarei pesquisando, mas pretendo fazer a primeira versão usando C para depois passar para o assembly, em todo caso ao terminar e testar a primeira versao, aconselho que veja o código paulo, costumo comentar muito bem cada linha que escrevo, creio que irá portar com certa facilidae ao Basic.

Abs.

Link para o comentário
Compartilhar em outros sites

Vamos lá comecei a escrever os templates da FHT, irei testar a peça de código no labview ou mesmo no Matlab para saber se está tudo funcionando corretamente.

Depois gerarei um pequeno modulo em C e vocês vão portar pro projeto do analisador... Eu como estou bem corrido, vou deixar pra embarcar no micro que tenho e montar um protótipo mais pra frente...

Espero terminar de escrever em 1 semana e reservar mais uns 4 dias pra testar ele :)

Abs

Link para o comentário
Compartilhar em outros sites

@aphawk, @ e demais membros,

 

Peguei aquele programa indicado pelo Paulo da FHT e estou brincando com ele aqui. Portei uma parte para o CCS já. Ainda estou apenas simulando. O primeiro exemplo consegui a saída igual do autor do código. Falta um bocado ainda.

 

Fiquei muito tempo tentando descobrir um erro no meu port. Era o CCS me jogando no mato.

 

Tipo, em C ANSI a gente faz isso:

 

fx[k + n] = (fx[k] - temp16bit1) >> 1;

 

Mas no CCS, se por acaso, o termo fx[k] - temp16bit1 for negativo, ele não me dá o shift para a direita correto. Vixi, fiquei umas 5 horas debugando para pegar essa disgreta.

 

Amanhã continuo:

 

0WgqYWQ.png

 

Falou

Link para o comentário
Compartilhar em outros sites

@MatheusLPS,Legal que voce esta se aprofundando no Core do CCS,pois acho um ótimo compilador com interface muito boa,apenas peca por não seguir o C ANSI como deveria e gerar o código objeto um pouco 'sujo'.

Eu tambem ja fiquei um tempo analisando o ASM gerado para descobrir o porque de um código não funcionar como devia.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!