18
1 Instrumentação e Aquisição de Sinais Mestrado Integrado em Engenharia Electrotécnica e de Computadores Introdução ao Matlab Objectivos São objectivos deste documento: Identificar no que consiste a ferramenta de software Matlab. Apresentar o princípio de funcionamento. Introduzir as funcionalidades básicas. Demonstrar a sua utilização em sistemas de aquisição de dados, instrumentação virtual e telemetria. Exercitar a sua utilização através da resolução de alguns problemas. O que não será abordado neste documento: Desenvolvimento de aplicações GUI (Graphical User Interface). Compilação de rotinas. Simulink. Informação detalhada de rigorosamente nada. Para informação detalhada consulte a documentação extremamente bem elaborada que a Mathworks desenvolveu. Introdução O Matlab é um programa de computador concebido e distribuído pela empresa americana MathWorks 1 . Constitui um ambiente de trabalho orientado para, a execução sistemática de operações matemáticas (cálculo numérico), o desenvolvimento de modelos analíticos, a simulação, controlo, ensaio e monitorização de modelos (sistemas), a manipulação simbólica. A Figura 1 apresenta um esquema onde é possível identificar as vertentes de aplicação do Matlab e de uma sua extensão, o Simulink. 1 http://www.mathworks.com

Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

Embed Size (px)

Citation preview

Page 1: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

1

Instrumentação e Aquisição de

Sinais

Mestrado Integrado em Engenharia Electrotécnica e de Computadores

Introdução ao Matlab

Objectivos

São objectivos deste documento:

Identificar no que consiste a ferramenta de software Matlab.

Apresentar o princípio de funcionamento.

Introduzir as funcionalidades básicas.

Demonstrar a sua utilização em sistemas de aquisição de dados,

instrumentação virtual e telemetria.

Exercitar a sua utilização através da resolução de alguns problemas.

O que não será abordado neste documento:

Desenvolvimento de aplicações GUI (Graphical User Interface).

Compilação de rotinas.

Simulink.

Informação detalhada de rigorosamente nada. Para informação detalhada

consulte a documentação extremamente bem elaborada que a Mathworks

desenvolveu.

Introdução

O Matlab é um programa de computador concebido e distribuído pela empresa

americana MathWorks1. Constitui um ambiente de trabalho orientado para,

a execução sistemática de operações matemáticas (cálculo numérico),

o desenvolvimento de modelos analíticos,

a simulação, controlo, ensaio e monitorização de modelos (sistemas),

a manipulação simbólica.

A Figura 1 apresenta um esquema onde é possível identificar as vertentes de

aplicação do Matlab e de uma sua extensão, o Simulink.

1 http://www.mathworks.com

Page 2: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

2

O Matlab existe em várias plataformas e sistemas operativos: Windows, MacOS, Linux

e diversas variantes de Unix (workstations). As várias implementações são bastante

próximas entre si. Iremos apenas abordar a existente no Windows.

O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel),

responsável pelo ambiente gráfico e no qual encontra-se uma biblioteca de rotinas

internas que executam as funções base do programa. A funcionalidade do programa

pode, e na prática tem de ser, incrementada recorrendo a bibliotecas de funções

externas que se designam por toolboxes. O Simulink e as aplicações específicas que

surgem na Figura 1 são efectivamente conjuntos de toolboxes.

O Matlab constitui um produto comercial de elevado custo, dificilmente ao alcance de

um consumidor individual. Contudo, existe uma versão com um custo relativamente

modesto, a Student Edition, que naturalmente apresenta funcionalidades limitadas. Esta

versão inclui o programa base propriamente dito, um ambiente gráfico modular dedicado

à reprodução e simulação de modelos (Simulink), e algumas bibliotecas de funções que

permitem explorar o programa na sua vertente numérica2. O Simulink começou por ser

uma toolbox do Matlab, mas foi crescendo ao ponto de se tornar um produto por mérito

próprio e com toolboxes específicas. Apesar de necessitar do núcleo de cálculo do

Matlab, é possível adquirir separadamente, com uma versão minimalista do Matlab e não

acessível directamente.

A versão de estudante não possui duas toolboxes necessárias para a aquisição de

sinais e a manipulação de instrumentos que são,

Data Aquisition Toolbox - permite a ligação a placas de aquisição,

Instrumentation Toolbox - estabelece a interface com os instrumentos de medida,

e que são parte integrante da aplicação “Test & Measurement” que consta da Figura 1.

Estas estão, no entanto, disponíveis nos computadores do laboratório, e na sala LTI do

DEEC.

2 A constituição exacta do pacote oferecido na versão para estudante do Matlab varia um pouco com a versão.

Figura 1 Estrutura funcional do Matlab e do Simulink. Imagem retirada da página da Mathworks onde é possível

consultar informação detalhada sobre os vários blocos: http://www.mathworks.com/products/pfo/ .

Page 3: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

3

Início e conceitos básicos

A instalação do Matlab é simples e directa, apenas é necessário ter alguns cuidados

relativamente às toolboxes que são instaladas. No caso da versão para estudante é

aconselhável instalar todas as toolboxes. No caso da versão completa, comercial, é

importante uma escolha criteriosa das toolboxes a instalar uma vez que a instalação

completa pode ocupar bem mais de 1 GB (no caso de FAT32, pode mesmo chegar aos 4

GB). Existem algumas toolboxes que importa garantir que são instaladas (na versão

comercial):

Signal Processing Toolbox.

Data Acquisition Toolbox.

Instrument Control Toolbox.

É igualmente útil instalar a toolbox “Excel Link” que permite transferir com facilidade

estruturas de dados (variáveis) entre o Matlab e o Excel.

Após a instalação do programa, a primeira vez que é executado surge no écran a

janela apresentada na Figura 2, que corresponde ao ambiente de trabalho do Matlab.

A comunicação com o programa e com as várias bibliotecas de funções do Matlab é

feita por intermédio da janela da direita (ver fig. 2), designada por “Command Window”,

onde são escritas as linhas de comando. No Matlab existem três tipos de comandos:

Internos – funções aritméticas e algébricas elementares, comandos de

representação gráfica e de interface com os periféricos habituais (disco, écran

e teclado)

Funções externas – são ficheiros editáveis, com extensão “.m” que executam

uma operação, com uma estrutura similar às funções das linguagens de

programação, como o Pascal ou o C, e com espaço de memória próprio.

Aceitam argumentos e devolvem argumentos – por valor e por referência.

Figura 2 Janela de funcionamento típico do Matlab e que surge na primeira vez que o programa é executado.

Page 4: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

4

Execução em „fornada‟3 - ficheiros com extensão “.m”, que contêm linhas de

comando idênticas às inseridas na janela de comando e que utiliza o espaço de

memória geral do programa.

Na Figura 3 é possível visualizar a utilização da janela de comando e o exemplo de

comandos internos do Matlab, neste caso a assinatura4 de variáveis e os comandos disp

e whos.

O primeiro, disp, é utilizado para visualizar uma matriz sem que o nome do

identificador da mesma seja apresentado, e o segundo, whos, é empregue para mostrar

na janela de comando o conteúdo do espaço de memória geral acessível ao utilizador.

Neste caso, apenas está definida a variável „s‟, assinada na primeira linha de comando

com o conteúdo de uma linha de texto (string). É pertinente observar que no final da

primeira linha de comando, aparece um „;‟. Se este não estiver presente o Matlab

apresenta na linha de comando o conteúdo da variável, neste caso seria o conteúdo de

„s‟.

a. Variáveis, Estruturas de Dados

Uma característica importante do Matlab é o facto de internamente o Matlab encarar

os operandos como matrizes, e todas as operações serem efectuadas sobre matrizes.

Números isolados internamente são considerados matrizes de um único elemento e

variáveis de texto (strings) são consideradas matrizes unidimensionais (vectores) cujos

elementos correspondem aos caracteres ASCII. Isto mesmo pode ser constatado no

exemplo da Figura 3 quando é executado o comando whos e é indicado que a variável

„s‟ corresponde a uma matriz linha (1x11) com 11 elementos, em que cada elemento é

do tipo carácter (char). A Figura 3 mostra ainda que no Matlab não é necessária uma

reserva antecipada de espaço de memória para a criação de uma variável, como é

3 Batch processing. 4 Importa aqui esclarecer que assinar significa atribuir, fixar, determinar, aprazar, dar, designar, marcar, intimar, aplicar,

repartir, distribuir, mostrar, apontar etc e corresponde à forma moderna, pós 1911, do verbo assignar.

Figura 3 Exemplo da utilização da janela de comando, e de alguns comandos internos do Matlab.

Page 5: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

5

habitual em linguagens estruturadas como o Pascal ou o C. No Matlab as variáveis são

todas dinâmicas, sendo possível criar, apagar, redimensionar ou modificar a sua

natureza (data type) em qualquer momento, sem que com esse procedimento se torne

instável. Como veremos adiante, por esta extremamente conveniente comodidade, é

necessário “pagar” um preço elevado em termos de desempenho.

No Matlab estão disponíveis as estruturas5 e tipos6 de dados elementares que são

habitualmente encontradas nas linguagens de programação estruturada, ainda que com

identificadores diferentes. A Figura 4 apresenta um esquema em árvore das várias

estruturas e tipos de dados elementares do Matlab e a Tabela 1 uma sua descrição um

pouco mais pormenorizada.

Para criar de forma directa uma matriz, por exemplo na linha de comandos, existem

várias possibilidades. Iremos de seguida apresentar alguns exemplos,

h = []; …matriz nula ou vazia .

h = [2,3,4]; …vector linha 2 3 4 .

h = 2:1:4; …vector linha 2 3 4 .

h = [2;3;4]; …vector coluna

2

3

4

.

h = [2,3,4;5,6,7;8,9,0]; …matriz bidimensional

2 3 4

5 6 7

8 9 0

.

Tabela 1 Tabela com uma descrição mais pormenorizada dos tipos e estruturas de dados no Matlab.

Tipo de dado Exemplo Descrição

int8, uint8,

int16, uint16, int32, uint32,

int64, uint64

uint16(65000)

Inteiros com ou sem sinal. Alguns tipos de inteiros requerem menor

espaço de armazenamento que os tipos single ou double. Todos os tipos de inteiros, com a excepção de int64 e uint64, podem ser empregues

em operações matemáticas.

5 Data structures, no anglo-saxónico. 6 Data types, no anglo-saxónico.

Figura 4 Taxionomia dos tipos e estruturas de dados no Matlab.

Page 6: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

6

single single(3 * 10^38) Números de precisão simples (32 bits). Menor espaço de

armazenamento mas menor precisão e alcance inferior.

double 3 * 10^300 5 + 6i

Números de precisão dupla (64 bits). É o tipo de dados que o Matlab utiliza por defeito. Matrizes bidimensionais podem ser esparsas.

logical magic(4) > 10 Valores lógicos 1 ou 0 para representar verdadeiro ou falso,

respectivamente. Matrizes bidimensionais podem ser esparsas.

char 'Hello'

Carácter. Linhas de texto (strings) são representadas como vectores de

caracteres. Para matrizes que contenham mais do que uma linha de texto (string), é preferível recorrer ao tipo cell array.

cell array a{1,1} = 12; a{1,2} = 'Red';

a{1,3} = magic(4);

Matriz ou vector de células indexadas, cada uma delas capaz de armazenar uma matriz ou vector de dimensão diferente e de tipo de

dados diferente.

structure a.day = 12; a.color = 'Red';

a.mat = magic(3);

Estruturas de dados por campos no estilo do Pascal e do C. Cada campo da estrutura pode armazenar uma matriz ou vector de dimensão e tipo

diferentes.

function handle @sin Ponteiro para uma função. É possível passar function handles a outras

funções.

user class polynom([0 -2 -5]) Objectos construídos a partir de classes definidas pelo utilizador.

Java class java.awt.Frame Objectos construído a partir da classe Java.

Ex. 1

Um exemplo um pouco mais complexo de utilização de estruturas de dados, e em particular de

estabelecimento de vectores e matrizes, consiste na criação dum vector com os instantes de

amostragem de um sistema de aquisição de dados. Iremos concretizar o exemplo para uma

frequência de amostragem de 500As-1, durante um intervalo de tempo de 1s, o que naturalmente

corresponde a um total de 500 amostras.

Sol.

>>Fa = 500;

>>t = 0:1/Fa:(1-1/Fa);

Na primeira linha é identificada a frequência de amostragem, e na segunda criado o vector

com os instantes de amostragem propriamente ditos. Como vimos anteriormente, „t‟ é um

vector linha cujo primeiro elemento é 0, o intervalo entre valores de „t‟ é 1/Fa, e o valor

final é (1-1/Fa), i.e., : :i ft t t t . Sendo a frequência de amostragem de 500 amostras

por segundo e o vector de instantes de tempo correspondentes a um intervalo de 1

segundo, o número de elementos de „t‟ só pode ser 500. Isto mesmo pode ser verificado

se fizermos,

>>length(t)

ans =

500

A possibilidade de redimensionar dinamicamente as estruturas de variáveis no Matlab

é extremamente conveniente e prática, como é possível constatar no seguinte exemplo.

Ex. 2

Suponhamos que queremos que o vector dos instantes temporais corresponda não a 1 mas a 2

segundos.

Page 7: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

7

Figura 5 Alteração da lista de

directorias onde o Matlab procura os comandos e funções externos.

Sol.

Uma solução que evidencia bem a versatilidade da dinâmica de redimensionamento de

variáveis é,

>>t = [t, t+1];

Neste caso a variável „t‟ é redimensionada para corresponder a um novo vector linha no qual a

primeira metade do vector se mantém inalterada e ao qual é acrescentado uma réplica do

vector adicionado de uma constante, neste caso 1s. Internamente o Matlab elimina a variável

antiga e cria uma nova.

Se em vez de „,‟ tivéssemos utilizado „;‟ em [;], a variável „t‟ seria uma matriz de 2 linhas, com

a primeira linha correspondente aos instantes de 0 a 1-1/Fa e a segunda correspondente aos

instantes de 1 a 2-1/Fa.

Podemos verificar que efectivamente o vector coluna na nossa solução corresponde ao

pretendido, e em particular que se assegura correctamente a continuidade na transição do

primeiro segundo, da seguinte forma,

>>(t(500-9:500+11)-t(500-10:500+10))*500

ans =

Columns 1 through 10 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

Columns 11 through 20

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 Column 21

1.0000

Na linha de comandos, a instrução t(500-9:500+11) corresponde a uma sub-matriz, neste

caso sub-vector, constituído pelas posições 491 a 511, com incrementos unitários (está

implícito: 500-9:1:500+11).

b. Comandos e funções externas

A biblioteca de comandos e funções do Matalab é extremamente rica e pode ser

subdividida em rotinas e comandos internos e externos. Os comandos e funções

externos tomam a forma de ficheiros de texto com a extensão “.m”. Também é

possível a execução automática em „fornada‟ de um conjunto de comandos e funções

a partir de um ficheiro com a extensão “.m”. Para chamar e executar o conteúdo do

ficheiro “.m” é suficiente escrever o nome do mesmo a partir da linha de comandos do

Matlab, desde que o ficheiro esteja na lista de directorias onde o Matlab irá procurar

pelo ficheiro.

Antes de vermos como podemos criar, editar e a constituição de um

ficheiro “.m”, iremos indicar como alterar a lista de directorias onde o

Matlab procura os ficheiros. A Figura 5 mostra a localização da opção

de menu onde é possível alterar a lista de directorias que o Matlab

utiliza para procurar os comandos e funções externos. Esta opção abre

uma janela idêntica à que se encontra na

Figura 6. Nesta janela existem duas opções

para adição de directorias. Numa delas, add

folder, cada directoria é adicionada individualmente enquanto na outra, add with

subfolders, a directoria é adicionada conjuntamente com todas as subdirectorias que

Page 8: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

8

esta possa conter. É fundamental, depois de adicionadas as directorias, gravar a

configuração utilizando o botão save presente nessa janela.

Os ficheiros “.m” sendo ficheiros de texto, podem ser criados a

partir de qualquer processador de texto, incluindo os que vêm

por defeito com o Windows, o Notepad e o Wordpad. O Matlab,

contudo, também tem um editor que se revela particularmente

útil uma vez que oferece um modo debug e a identificação das

estruturas de programação com cores e identação automática.

Para criar um ficheiro “.m”, a partir do Matlab, existem duas

formas possíveis: i) através do menu – File/New/M-File;

ii) utilizando o botão de new document que aparece por

defeito à esquerda na barra de ferramentas (toolbar)

por baixo do menu. Qualquer das duas opções lança o editor de texto que, por

defeito, surge numa janela autónoma, ainda que possa ser inserida no ambiente

integrado do Matlab.

A criação de um ficheiro para execução automática ou “em fornada” é extremamente

simples. Consiste apenas na sequência de linhas que se escreveria na linha de

comandos. Não carece de qualquer inicialização nem tão pouco de instrução de

término. A criação de uma função é um pouco mais elaborada e pressupõe que a

primeira linha tenha como primeira palavra “function”. Na primeira linha, para além

da indicação de que se trata de uma função deve estar igualmente presente a

definição da função em termos dos argumentos e das saídas, bem como o nome, com

a seguinte estrutura,

funtion [saída1, saída2,...,saídan] = nome(arg1, arg2, ..., argn)

Ex. 3

Crie uma rotina que indique se um escalar é ou não ímpar.

Sol.

Uma solução possível, embora obviamente não única, é a seguinte

function o = odd(x)

o = mod(x,2);

Pode não ser óbvio como é que esta rotina funciona. Para o Matlab, qualquer número diferente

de zero, se analisado na perspectiva de booleano7, é considerado como verdadeiro. A função

mod devolve o resto da divisão inteira de x por 2, neste caso. Isto significa que apenas se x for

par é que a função mod devolve 0, correspondente a falso, cumprindo as especificações do

enunciado.

Outra solução possível, consideravelmente menos eficiente do ponto de vista de dispêndio

computacional, mas interessante por apresentar a estrutura if-then-else do Matlab, consiste

em,

function o = odd(x)

7 Booleano é uma estrutura de dados que só pode assumir dois valores: verdadeiro e falso.

Figura 6 Janela utilizada para a

adição manual das directorias onde o

Matlab procura as rotinas externas.

Page 9: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

9

if mod(x,2) == 0

o = False;

else

o = True;

end

Na linha do if é possível constatar que a igualdade, no Matlab, é questionada de forma

similar ao C, recorrendo ao operador booleano „==‟. Os operadores relacionais são iguais

no C e no Matlab, com a única excepção da diferença que no C é designado por „!=‟ e no

Matlab por „~=‟. A este propósito, e por consistência de linguagem, importa referir que o

til, „~‟, sózinho, é o operador de negação booleano.

Para editar um ficheiro “.m” já existente é suficiente, da linha de comandos do Matlab,

escrever “edit nomedoficheiro”. Para editar a função odd criada no exemplo anterior é

suficiente, após esta ter sido gravada, e o editor fechado, escrever, na linha de

comandos do Matlab,

>> edit odd

c. Data Acquisition Toolbox

A toolbox de aquisição de dados, Data Acquisition Toolbox, consiste numa biblioteca de

funções, comandos e procedimentos que permitem ao Matlab interagir directamente com

uma placa de aquisição de dados. Tendo-a instalado no Matlab, uma forma de se ter

uma panorâmica geral dos comandos disponíveis consiste em escrever, na linha de

comandos,

>>daqhelp

ou, para uma documentação bem mais extensiva,

>>doc daq

A lista é extensa e não iremos abordar todos os comandos e/ou funções. Iremos apenas

abordar o conjunto de funções e procedimentos necessários para uma aquisição de

sinais relativamente básica.

Um dos primeiros comandos que deve ser executado, prévio ao início de qualquer sessão

de aquisição de dados, é a averiguação de quais placas de aquisição estão disponíveis no

computador,

>>daqhwinfo

ans =

ToolboxName: 'Data Acquisition Toolbox'

ToolboxVersion : '2.9 (R2006b)'

MATLABVersion: '7.3 (R2006b)'

InstalledAdaptors : {2x1 cell}

Esta função é de execução obrigatória a primeira vez que se corre o Matlab após a

instalação de uma nova placa de aquisição. A saída desta função é uma estrutura de

dados que consiste em 4 campos, o mais importante dos quais corresponde ao Installed

Page 10: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

10

Adaptors que, no caso do exemplo anterior consiste num vector coluna de 2 células8.

Para conhecer as designações dos 2 sistemas de aquisição identificados é suficiente

escrever,

>>ans.InstalledAdaptors

ans =

'parallel'

'winsound'

No presente exemplo, a rotina indica que o computador dispõe de 2 dispositivos para

aquisição de dados. O primeiro é via porta paralela e o segundo via placa de som.

Iremos, de seguida, apresentar uma sequência demonstrativa da utilização da placa de

som para a aquisição de sinais. A placa de som tem 4 limitações importantes: i) as

entradas não têm ganhos variáveis; ii) as frequências de amostragem constituem um

conjunto discreto muito reduzido (5 ou 6 frequências disponíveis, ainda que variável

consoante o fabricante da placa) e com fraca largura de banda (< 22kHz), iii) a

impedância de entrada típica é baixa, 10kΩ e iv) a entrada tem acoplamento AC. Ainda

assim, a placa de som constitui uma abordagem muito interessante para a realização de

um osciloscópio digital de baixo custo com 2 canais.

i) Aquisição

O primeiro passo para a utilização da placa de som, e de facto, qualquer placa de

aquisição no Matlab, consiste no recurso à função analoginput. A forma como esta rotina

é chamada depende um pouco do fabricante da placa de aquisição, mas é sempre o

mesmo para a placa de som. Assim, para a placa de som faríamos,

>>ai = analoginput('winsound')

Display Summary of Analog Input (AI) Object Using 'Realtek AC97 Audio'.

Acquisition Parameters: 8000 samples per second on each channel.

8000 samples per trigger on each channel.

1 sec. of data to be logged upon START.

Log data to 'Memory' on trigger.

Trigger Parameters: 1 'Immediate' trigger(s) on START.

Engine status: Waiting for START.

0 samples acquired since starting.

0 samples available for GETDATA.

AI object contains no channels.

Para uma placa de aquisição da National Instruments, por exemplo, teríamos de

escrever,

>>ai = analoginput('nidaq',‟dev1‟)

Display Summary of Analog Input (AI) Object Using „National Instruments PCI-6013‟.

8 Ver Tabela 1.

Page 11: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

11

Acquisition Parameters: 1000 samples per second on each channel.

1000 samples per trigger on each channel.

1 sec. of data to be logged upon START.

Log data to 'Memory' on trigger.

Trigger Parameters: 1 'Immediate' trigger(s) on START.

Engine status: Waiting for START.

0 samples acquired since starting.

0 samples available for GETDATA.

AI object contains no channels.

A indicação de „dev1‟ a seguir à designação do fabricante é variável e deverá ser

confirmada pelo utilitário da National Instruments, MAX – Measurement & Automation.

Em ambos os casos, a variável „ai‟ é uma estrutura de dados especial, do tipo

analoginput, e que constitui um ponteiro para o dispositivo. Esta estrutura contém um

conjunto relativamente extenso de propriedades da placa de aquisição que podem ser

consultadas e alteradas. É possível ter uma ideia das propriedades disponíveis fazendo,

>>get(ai)

BufferingConfig = [512 30] BufferingMode = Auto

Channel = [0x1 aichannel]

ChannelSkew = 0 ChannelSkewMode = None

ClockSource = Internal

DataMissedFcn = @daqcallback EventLog = [1x0 struct]

InitialTriggerTime = [0 0 0 0 0 0] InputOverRangeFcn = []

InputType = AC-Coupled

LogFileName = logfile.daq Logging = Off

LoggingMode = Memory LogToDiskMode = Overwrite

ManualTriggerHwOn = Start

Name = winsound0-AI Running = Off

RuntimeErrorFcn = @daqcallback

SampleRate = 8000 SamplesAcquired = 0

SamplesAcquiredFcn = [] SamplesAcquiredFcnCount = 1024

SamplesAvailable = 0

SamplesPerTrigger = 8000 StartFcn = []

StopFcn = [] Tag =

Timeout = 1

TimerFcn = [] TimerPeriod = 0.1

TriggerChannel = [1x0 aichannel]

TriggerCondition = None TriggerConditionValue = 0

TriggerDelay = 0 TriggerDelayUnits = Seconds

TriggerFcn = []

TriggerRepeat = 0 TriggersExecuted = 0

TriggerType = Immediate Type = Analog Input

UserData = []

WINSOUND specific properties:

BitsPerSample = 16 StandardSampleRates = On

Page 12: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

12

Como se pode ver, a lista de propriedades é consideravelmente extensa e completa.

Destas, há algumas que são mais importantes: i) ChannelSkew, ii) InputType, iii)

SampleRate, iv) SamplesPerTrigger, v) TriggerType por serem recorridas mais vezes que

as restantes. É possível saber mais informação sobre a funcionalidade de cada

propriedade escrevendo daqhelp seguido do nome da propriedade,

>>daqhelp channelskew

CHANNELSKEW double

ChannelSkew specifies the time, in seconds, between consecutive scanned hardware channels.

ChannelSkew applies only to scanning hardware and not to simultaneous

sample and hold (SS/H) hardware.

For scanning hardware, ChannelSkew is configurable only when

ChannelSkewMode is set to Manual. If ChannelSkewMode is set to Minimum or

Equisample, then ChannelSkew is automatically set to the appropriate device-specific read-only value. For SS/H hardware, the only valid

ChannelSkew value is 0. SS/H hardware includes Agilent Technologies devices and sound cards.

The ChannelSkew value is specified in seconds.

The value of ChannelSkew cannot be modified while the object is running.

See also ChannelSkewMode.

É possível obter documentação mais extensa sobre as várias propriedades escrevendo

doc seguido do nome da propriedade. É igualmente possível obter descrição prática, ao

nível dos limites possíveis e tipo de valores através da função propinfo,

>>propinfo(ai,'channelskew')

ans =

Type: 'double'

Constraint: 'bounded' ConstraintValue: [0 0]

DefaultValue: 0

ReadOnly: 'whileRunning' DeviceSpecific: 0

Neste caso, e por se tratar de uma placa de som que, como todas, dispõe de aquisição

simultânea, o atraso entre canais é necessariamente 0 e não pode ser alterado – o valor

mínimo e máximo são iguais.

O passo seguinte para a aquisição de dados via placa de som consiste na adição de um

canal físico. A placa de som dispõe de 2 canais para aquisição – esquerdo e direito que,

numericamente, correspondem aos canais 1 e 2,

>>ch = addchannel(ai,[1 2])

Index: ChannelName: HwChannel: InputRange: SensorRange: UnitsRange: Units:

1 'Left' 1 [-1 1] [-1 1] [-1 1] 'Volts'

2 'Right' 2 [-1 1] [-1 1] [-1 1] 'Volts'

O código anterior criou precisamente 2 canais físicos, o esquerdo e o direito. Se

quiséssemos apenas adquirir dados do canal direito teríamos de ter escrito,

ch = addchannel(ai, 2). A variável ch é uma estrutura especial que contém a descrição

Page 13: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

13

dos canais físicos adicionados e que é igual, no caso de haver apenas 1 estrutura de

canais por placa de aquisição, ao campo ou propriedade Channel de „ai‟.

Agora que temos criadas estruturas que indexam e programam a placa e os canais de

aquisição que nos interessam, é necessário alterar a frequência de aquisição e o tempo

de aquisição ou número de amostras.

A frequência de aquisição é alterada recorrendo à propriedade de ai, SampleRate,

>>set(ai,'samplerate',20000)

Warning: This hardware could not support the requested value of 20000.00 for SampleRate. SampleRate has been set to

22050.00.

Este exemplo de código é em tudo igual ao seguinte, mostrando uma forma alternativa

de alterar as propriedades das estruturas, em particular, da analoginput,

>>ai.SampleRate = 20000;

Warning: This hardware could not support the requested value of 20000.00 for SampleRate. SampleRate has been set to

22050.00.

Neste caso o Matlab avisa-nos que a frequência de aquisição de 20000 amostras por

segundo não é permitida pela placa de som e que colocou a frequência de 22050Aps. De

facto, a limitação pode não ser da placa de som mas resulta antes da propriedade

específica da placa de som, StandardSampleRates, ter o valor On. Com esta propriedade

activa, o conjunto de frequências de amostragem disponíveis é extremamente reduzido

e quase sempre o resultado de 44100/n. As placas de aquisição dedicadas normalmente

não apresentam esta limitação, mas é fundamental, sempre que se altera a frequência

de aquisição, verificar se esta foi aceite pela placa de aquisição e utilizar, em contas

futuras, o valor que ela efectivamente actualiza no campo SampleRate.

Uma vez estabelecida a frequência de aquisição, há que indicar o tempo de aquisição ou,

alternativamente, o número de amostras. Naturalmente que o tempo de aquisição, ,

se relaciona com o número de amostras, , e frequência de amostragem, , pela

relação,

A propriedade existente em „ai‟ que permite alterar o número de amostras a adquirir e,

por consequência, o tempo de aquisição, é SampelsPerTrigger. Por exemplo, para

fazermos uma aquisição de 2s a uma frequência de 44100/4 amostras por segundo,

teríamos,

>>ai.SampleRate = 44100/4;ai.SamplesperTrigger=44100/2

Display Summary of Analog Input (AI) Object Using 'Realtek AC97 Audio'.

Acquisition Parameters: 11025 samples per second on each channel.

22050 samples per trigger on each channel.

2 sec. of data to be logged upon START. Log data to 'Memory' on trigger.

Trigger Parameters: 1 'Immediate' trigger(s) on START.

Engine status: Waiting for START. 0 samples acquired since starting.

Page 14: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

14

0 samples available for GETDATA.

AI object contains channel(s):

Index: ChannelName: HwChannel: InputRange: SensorRange: UnitsRange: Units:

1 'Left' 1 [-1 1] [-1 1] [-1 1] 'Volts' 2 'Right' 2 [-1 1] [-1 1] [-1 1] 'Volts'

Embora na placa de som seja irrelevante o tipo de canal utilizado, uma vez que é fixo e

referenciado com gama de entrada de 1V, numa placa dedicada normalmente é possível

alterar o tipo de canal para Differential e ReferencedSingleEnded. A primeira

corresponde a uma entrada diferencial para medida de tensões flutuantes e a segunda

para tensões em que um dos terminais é o comum electrónico da placa de aquisição. Em

algumas placas existem mais variantes mas que, por serem demasiadamente

específicas, não iremos abordar aqui. Em qualquer caso, esta informação está contida no

campo ou propriedade, InputType,

>>ai.InputType

ans =

AC-Coupled

Outra propriedade que neste caso não deverá ser alterada mas que por vezes é

importante configurar é a origem do trigger ou disparo. O disparo, por defeito, é

imediato, i.e., ocorre assim que se dá o comando, start(ai). Não iremos entrar em

pormenores sobre as inúmeras variantes de disparo, mesmo porque muitas são

específicas de cada placa. Contudo, importa referir que com algumas condições de

disparo, e em algumas placas, é possível adquirir amostras anteriores à condição de

disparo, i.e., existe a possibilidade de recuperar pre-trigger data. Na placa de som

iremos utilizar o que vem por defeito,

>>propinfo(ai,'triggertype')

ans =

Type: 'string' Constraint: 'enum'

ConstraintValue: {'Manual' 'Immediate' 'Software'}

DefaultValue: 'Immediate' ReadOnly: 'whileRunning'

DeviceSpecific: 0

e que é Immediate.

Como foi indicado anteriormente, este tipo de disparo implica a necessidade de execução

do comando start(ai) para a sua ocorrência,

>>start(ai)

Este comando é relativamente simples e inóquo, mas convém esclarecer que o Matlab

lança a aquisição de sinal mas não fica à espera dos dados. É possível tentar obter os

dados antes de estes estarem terminados, traduzindo-se em incoerência de dados uma

vez que em algumas placas será devolvido o conteúdo de dados da última aquisição.

Para garantir que tal não acontece, é possível bloquear o Matlab adicionando a instrução,

wait,

>>start(ai),wait(ai,3)

Page 15: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

15

O segundo argumento de wait é o intervalo de tempo máximo, em segundos, a esperar

(timeout).

Após o retorno do Matlab à prompt da janela de comandos, os dados estão disponíveis e

podem ser obtidos através da função getdata,

>>dados = getdata(ai);

Se formos analisar o conteúdo da variável dados,

>>whos dados

Name Size Bytes Class Attributes

dados 22050x2 352800 double

verificamos que corresponde a uma matriz com 2 colunas. De facto, cada coluna

corresponde ao seu canal. Podemos fazer a visualização simples dos dados adquiridos

fazendo,

>>figure(1),plot(dados)

Se prestarmos atenção aos eixos do gráfico, vemos que nas abcissas temos amostras.

Isso normalmente não é interessante, pretendendo-se, de facto, a identificação do

instante de cada amostra, o que pode ser conseguido, por exemplo, construindo o

vector,

>> t = 0:1/ai.SampleRate:(2-1/ai.SampleRate);

Analisando o conteúdo deste vector observamos que consiste num vector linha com um

comprimento que é o dobro da frequência de amostragem. Nem sempre a configuração

de vector linha é a mais adequada. A transposição do vector pode ser conseguida de

forma extremamente simples recorrendo ao operador ´,

>>t = t‟;

Tendo construído o vector com os instantes temporais é agora simples tornar próprio o

eixo das abcissas, nomeadamente fazer com que corresponda aos instantes temporais,

>>figure(1),plot(t,dados(:,1),t,dados(:,2))

Chama-se à atenção para a forma como se acede individualmente às 2 colunas de

dados. Os dois pontos, : , antes da vírgula indicam que se pretende aceder a todas as

linhas. O elemento a seguir à vírgula indica o número da coluna.

O gráfico criado pode agora ser tornado um pouco mais legível acrescentando uma

grelha, títulos para os 2 eixos, para o gráfico e uma legenda por canal.

Assim, para criar uma grelha, é suficiente utilizar o comando, grid. A adição de um título

para as abcissas pode ser feito utilizando o comando xlabel, e para o eixo das ordenadas

utilizando o comando, ylabel. A inserção de um título geral para o gráfico é feito

utilizando o comando title e a legenda é inserida através do comando legend.

>>grid;xlabel('t/s');ylabel('A/V');title('Aquisição Placa de Som'); legend('Esquerdo','Direito')

Page 16: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

16

O aspecto final do gráfico deverá ser qualquer coisa do género do representado na

Figura 7.

ii) Geração

Vimos até agora como adquirir sinais a partir da placa de som do computador, mas é

igualmente possível enviar sinais para a placa de som. O envio de sinais para a placa de

som permite a audição dos mesmos nos altifalantes do sistema, por um lado, e a

utilização da placa de som como um Arbitrary Waveform Generator recorrendo à sua

saída analógica (line out). À semelhança da entrada (line in), a versatilidade é reduzida.

O envio de sinais pode ser considerado o dual da aquisição. Os procedimentos são

similares e o número de passos idênticos. Assim, para criar a estrutura de identificação e

ajuste da saída da placa de som é necessário recorrer à função analogoutput,

>>ao = analogoutput('winsound')

Display Summary of Analog Output (AO) Object Using 'Realtek AC97 Audio'.

Output Parameters: 8000 samples per second on each channel.

Trigger Parameters: 1 'Immediate' trigger on START.

Engine status: Waiting for START. 0 total sec. of data currently queued for START.

0 samples currently queued by PUTDATA. 0 samples sent to output device since START.

AO object contains no channels.

De forma similar ao que aconteceu para a aquisição de sinal, para a saída é igualmente

necessário especificar o canal físico através da função addchannel,

>>cho = addchannel(ao,[1 2])

Index: ChannelName: HwChannel: OutputRange: UnitsRange: Units: 1 'Left' 1 [-1 1] [-1 1] 'Volts'

2 'Right' 2 [-1 1] [-1 1] 'Volts'

Como passo prévio à geração de sinal, é necessário programar as características da

placa, nomeadamente a frequência de amostra e o número de amostras. Estes

parâmetros constituem propriedades do handle criado para a saída, „ao‟. A lista de

propriedades do circuito de geração pode ser obtida fazendo,

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2-0.4

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

t/s

A/V

Aquisição Placa de Som

Esquerdo

Direito

Figura 7 Exemplo da figura resultante da aquisição de

2s da placa de som.

Page 17: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

17

>>get(ao) BufferingConfig = [512 2]

BufferingMode = Auto Channel = [2x1 aochannel]

ClockSource = Internal

EventLog = [1x0 struct] InitialTriggerTime = [0 0 0 0 0 0]

MaxSamplesQueued = 2.0112e+008 Name = winsound0-AO

RepeatOutput = 0

Running = Off RuntimeErrorFcn = @daqcallback

SampleRate = 8000

SamplesAvailable = 0 SamplesOutput = 0

SamplesOutputFcn = [] SamplesOutputFcnCount = 1024

Sending = Off

StartFcn = [] StopFcn = []

Tag = Timeout = 1

TimerFcn = []

TimerPeriod = 0.1 TriggerFcn = []

TriggersExecuted = 0

TriggerType = Immediate Type = Analog Output

UserData = []

WINSOUND specific properties:

BitsPerSample = 16 StandardSampleRates = On

As considerações sobre a frequência de amostragem e o número de amostras

colocam-se aqui de forma diferente do que acontece com a aquisição de sinais. Neste

caso é suposto já existir um conjunto de amostras e essas amostras têm associada uma

determinada frequência. O número de amostras é obviamente um dado do problema e

não uma variável.

Em virtude de uma aplicação importante e típica ser a geração de sinais periódicos, um

campo importante é o RepeatOutput. Neste campo é possível indicar o número de vezes

que o vector de dados introduzido é repetido. Isto permite que, de forma eficiente, seja

introduzido o vector de dados associado a apenas um período do sinal.

O envio de dados para a memória da placa de aquisição é efectuado pela função

putdata,

>>putdata(ao,dados)

Neste caso a variável dados é uma matriz com 2 colunas correspondentes aos 2 canais

de saída da placa de som. A geração propriamente dita só tem início após a execução do

comando start(ao), no pressuposto da condição de disparo (triggertype) ser do tipo

immediate.

Ex. 4

Adquira 5s da placa de som à frequência máxima e de seguida coloque na saída, repetindo a

saída 1 vez.

Page 18: Instrumentação e Aquisição de Sinais - Autenticação · O Matlab é constituído pelo núcleo do programa propriamente dito (Matlab kernel), responsável pelo ambiente gráfico

18

Sol.

Fa = 44100; Ta = 5;

ai = analoginput('winsound');

chi = addchannel(ai,[1 2]); ao = analogoutput('winsound');

cho = addchannel(ao,[1 2]); ai.SampleRate = Fa;

Fa = ai.SampleRate;

ao.SampleRate = Fa; ai.SamplesPerTrigger = Ta*Fa;

disp('Aquisição.....'); start(ai);

wait(ai,Ta*1.1);

dados = getdata(ai); putdata(ao,dados);

ao.RepeatOutput = 1; disp('Geração.....');

start(ao);

wait(ao,Ta*(ao.RepeatOutput+1)*1.1); daqreset