sexta-feira, 8 de fevereiro de 2013

Exportando dados do LTspice e lendo eles em um programa Python + ajuste de curvas

(Obs.: post técnico, mas nada que um mortal não consiga ler)

Esses dias, precisei ler dados gerados no LTspice em um programa Python. Aliás, essa é uma solução relevante para incluir gráficos do LTspice em trabalhos acadêmicos, papers etc... visto que ele não gera gráficos de boa qualidade visual quando impressos.

A solução é bem simples:

No LTspice desenhe o circuito, simule etc... Selecione o gráfico, mande File/Export para gerar um .txt, selecionem os sinais a serem armazenados no arquivo. Como exemplo usei o circuito abaixo e fiz uma análise CC, variando V1 e medindo a tensão antes dos diodos:



Vou chamar esses resultados de diodo.txt. O LTspice gera um arquivo delimitado por tabulações. Agora, para ler em Python, eu poderia usar a biblioteca csv, mas existe uma forma mais pythônica de ler esses dados e plotá-los: usando a função loadtxt da biblioteca NumPy.

Os parâmetros dessa são:
  • fname: nome do arquivo
  • dtype: tipo de dados esperado
  • delimiter: separador
  • skiprows: quantas linhas pular no começo
  • usecols: uma tupla que permite especificar as colunas que queremos pular
A partir daqui ficou óbvio do que precisamos: da fname e da skiprows (a primeira linha é cabeçalho). Assim, teremos o código a seguir:
(se não abrir: https://gist.github.com/renanbirck/4743036)

Ele pode ser usado com o arquivo diodo.txt que forneço de exemplo (aviso: 4 MB. Clique com o botão direito e mande salvar para o seu browser não sentar)

Obteremos isso:


Podemos mexer na legenda, etc etc... mas cheguei ao que eu queria demonstrar.

E agora, já que temos esses dados, podemos ajustar eles a um modelo. Visualmente, nota-se que eles parecem com uma tangente hiperbólica. Assim, façamos um modelo do tipo

e usaremos o método dos mínimos quadrados para ajustá-lo a uma função desse tipo (poderíamos usar qualquer outro método de otimização). O código então tornar-se-á:
(se não abrir: https://gist.github.com/renanbirck/4743133)

Após executarmos, obtemos o gráfico:


Como queríamos demonstrar, obtivemos um bom ajuste. O modelo é bem adequado; para visualizarmos os parâmetros bastaria um print p no final do código.

E nem doeu: foram exemplos adaptados do que eu encontrei na documentação do SciPy. :)

Quanto ao desempenho, a leitura dos dados leva 2 segundos, e o ajuste cerca de 15 segundos num i7-2670QM, mas isso pode (e vai) variar dependendo do chute inicial; para um trabalho mais avançado seria interessante e necessário fazer um meta-ajuste.

Nenhum comentário:

Postar um comentário

Não são lidos e não me responsabilizo pelo conteúdo deles.