Você está na página 1de 18

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
1
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.

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/ .

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.
2
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.

Figura 2 Janela de funcionamento típico do Matlab e que surge na primeira vez que o programa é executado.
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.

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

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


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.
4
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.

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

No Matlab estão disponíveis as estruturas 5 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.

2
 
h = [2;3;4]; …vector coluna  3 .
 
4
 
2 3 4
 
h = [2,3,4;5,6,7;8,9,0]; …matriz bidimensional  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, Inteiros com ou sem sinal. Alguns tipos de inteiros requerem menor
int16, uint16, espaço de armazenamento que os tipos single ou double. Todos os tipos
uint16(65000)
int32, uint32, de inteiros, com a excepção de int64 e uint64, podem ser empregues
int64, uint64 em operações matemáticas.

5
Data structures, no anglo-saxónico.
6
Data types, no anglo-saxónico.
5
Números de precisão simples (32 bits). Menor espaço de
single single(3 * 10^38)
armazenamento mas menor precisão e alcance inferior.

3 * 10^300 Números de precisão dupla (64 bits). É o tipo de dados que o Matlab
double
5 + 6i utiliza por defeito. Matrizes bidimensionais podem ser esparsas.

Valores lógicos 1 ou 0 para representar verdadeiro ou falso,


logical magic(4) > 10
respectivamente. Matrizes bidimensionais podem ser esparsas.

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


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

a{1,1} = 12; Matriz ou vector de células indexadas, cada uma delas capaz de
cell array a{1,2} = 'Red'; armazenar uma matriz ou vector de dimensão diferente e de tipo de
a{1,3} = magic(4); dados diferente.

a.day = 12; Estruturas de dados por campos no estilo do Pascal e do C. Cada campo
structure a.color = 'Red'; da estrutura pode armazenar uma matriz ou vector de dimensão e tipo
a.mat = magic(3); diferentes.

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


function handle @sin
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., t  ti : t : tf . 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.

6
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 5 Alteração da lista de
directorias onde o Matlab procura Figura 6. Nesta janela existem duas opções
os comandos e funções externos.
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

7
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; Figura 6 Janela utilizada para a
ii) utilizando o botão de new document que aparece por adição manual das directorias onde o
Matlab procura as rotinas externas.
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.
8
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
9
Adaptors que, no caso do exemplo anterior consiste num vector coluna de 2 células 8.
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.
10
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

11
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
12
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.
13
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)

14
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')

15
O aspecto final do gráfico deverá ser qualquer coisa do género do representado na
Figura 7.
Aquisição Placa de Som
0.5
Esquerdo
0.4 Direito

0.3

0.2

0.1

A/V
0

-0.1

-0.2

-0.3

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

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,

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


2s da placa de som.

>>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,

16
>>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.

17
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

18

Você também pode gostar