Você está na página 1de 14

FATORES HUMANOS E ENGENHARIA DE USABILIDADE

Lista de exercícios – Módulo 4


Instruções gerais para a resolução da lista:

a. Revise os slides da aula (arquivo M4-SlidesFHUS.pdf disponível no Moodle).


b. Leia o artigo abaixo (arquivo PaperAOA.pdf disponível no Moodle)

Andrade AO, Pereira AA, Galvão Pinheiro Jr C, Kyberd PJ (2013) Mouse emulation based on
facial electromyogram. Biomed Signal Process Control 8:142–152.
https://doi.org/10.1016/j.bspc.2012.09.001

c. Estude o programa em C# disponível em

https://github.com/aoandrade/FHUS/blob/5109372fdd3dbb605c47c1352402c55c9c47abcc/
ProgramaEmuladorDeMouse.zip

d. Leia o material disponível em (Arquitetura e organização do jogo.docx e


Arquitetura_Organização_RehaBEElitation.pptx – ambos os arquivos estão disponíveis
na plataforma Moodle).

Q1. Dado o diagrama de estados abaixo, e considerando a máquina de estado finito definada
no exemplo dado em aula (disponível no slide), desenhe o diagrama de estados das variáveis
Fx e Fy (veja as definições no slide).

1
Q2. Faça um programa em C# que compute as seguintes características. Para a característica
AutoCorrAbs, adote o valor de m=2. Exemplifique o uso do programa para calcular o valor de
cada uma das características para o vetor

X = [0.25, -2.28, 1.11, 0.42, -1.46, 0.19, -0.75, -0.29, 1.71, -0.78, -1.30, -0.11, -0.76, 1.46,
2.44, 1.83, 0.33, 0.60,-0.74, -1.70]

R:

using System;

class Program

static double CalculateMAV(double[] x)

double sum = 0.0;

foreach (var value in x)

sum += Math.Abs(value);

return sum / x.Length;

static double CalculateStdAbs(double[] x, double mav)

double sumSquaredDiff = 0.0;

foreach (var value in x)

sumSquaredDiff += Math.Pow(Math.Abs(value) - mav, 2);

return Math.Sqrt(sumSquaredDiff / x.Length);

2
static double CalculateAutoCorrAbs(double[] x, int m)

int N = x.Length;

double mean = CalculateMAV(x);

double sum = 0.0;

for (int t = 0; t < N - m; t++)

sum += Math.Abs(x[t] - mean) * Math.Abs(x[t + m] - mean);

return sum / (N - m);

static void Main()

double[] X = { 0.25, -2.28, 1.11, 0.42, -1.46, 0.19, -0.75, -0.29, 1.71, -0.78, -1.30, -0.11, -
0.76, 1.46, 2.44, 1.83, 0.33, 0.60, -0.74, -1.70 };

// Calcular MAV

double mav = CalculateMAV(X);

Console.WriteLine($"MAV: {mav}");

// Calcular StdAbs

double stdAbs = CalculateStdAbs(X, mav);

Console.WriteLine($"StdAbs: {stdAbs}");

// Calcular AutoCorrAbs para m=2

int m = 2;

double autoCorrAbs = CalculateAutoCorrAbs(X, m);

Console.WriteLine($"AutoCorrAbs para m={m}: {autoCorrAbs}");

Q3. Na interface eletromiográfica definida na aula (ver slide) quais os critérios para a definição
dos estados (LOW ou HIGH) dos 2 canais de eletromiografia (X e Y)?

R: FX (X): LOW: Pode ser definido como LOW quando uma condição específica não é
atendida (por exemplo, uma variável do sistema está abaixo de um limiar). HIGH: Pode ser
definido como HIGH quando a condição é atendida.

3
FY (Y): LOW: Pode ser definido como LOW em uma situação específica (por exemplo, quando
um sensor não detecta uma condição relevante). HIGH: Pode ser definido como HIGH
quando a condição é detectada.

Q4. Defina distância Euclidiana, e desenvolva um programa em C# que realize o cálculo da


distância Euclidiana entre dois vetores, de qualquer dimensão. Exemplifique o uso do
programa para calcular as distâncias entre os vetores, P1P2, P1P3 e P2P3.

P1 = [1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0]

P2 = [1.2 2.5 3.3 4.7 5.3 6.2 7.1 8.3 9.1 9.8]

P3 = [10 20 30 40 50 60 70 80 90 100]

R:

using System;

class Program

static double EuclideanDistance(double[] p, double[] q)

if (p.Length != q.Length)

throw new ArgumentException("Os vetores devem ter a mesma dimensão.");

double sum = 0.0;

for (int i = 0; i < p.Length; i++)

double diff = q[i] - p[i];

sum += diff * diff;

return Math.Sqrt(sum);

static void Main()

double[] P1 = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };

double[] P2 = { 1.2, 2.5, 3.3, 4.7, 5.3, 6.2, 7.1, 8.3, 9.1, 9.8 };

double[] P3 = { 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0 };

4
// Distância entre P1 e P2

double distanceP1P2 = EuclideanDistance(P1, P2);

Console.WriteLine("Distância entre P1 e P2: " + distanceP1P2);

// Distância entre P1 e P3

double distanceP1P3 = EuclideanDistance(P1, P3);

Console.WriteLine("Distância entre P1 e P3: " + distanceP1P3);

// Distância entre P2 e P3

double distanceP2P3 = EuclideanDistance(P2, P3);

Console.WriteLine("Distância entre P2 e P3: " + distanceP2P3);

Q5. Se na questão 4, os vetores P1 e P2 representassem atividades de ruído, e P3 de sinal


eletromiográfico, como poderíamos definir um limiar para discriminar ruído de sinal?

R: Através da comparação das médias dos vetores P1 e P2 com o vetor P3. Se a média de P3
estiver significativamente diferente das médias de P1 e P2, você pode usar essa diferença
como um critério para discriminar sinal de ruído:

# Cálculo da média dos vetores de ruído

mean_P1 = np.mean(P1)

mean_P2 = np.mean(P2)

# Escolha de um intervalo como limiar (pode ser ajustado conforme necessário)

limiar_inf = min(mean_P1, mean_P2)

limiar_sup = max(mean_P1, mean_P2)

# Verificação se os valores de P3 estão fora do intervalo

result = (P3 < limiar_inf) | (P3 > limiar_sup)

print("Valores de P3 fora do intervalo:", P3[result])

Q6. Definição de ruído e sinal: cálculo de limiares

a) Implemente uma função em C# que calcule o limiar (th) capaz de discriminar ruído
atividade eletromiográfica. A sua função deve receber como parâmetros de entrada as
seguintes variáveis: xn (série temporal discreta que representa uma atividade de

5
ruído); w (tamanho da janela de processamento em ms); fs (frequência de amostragem
de xn em Hz). A função deve retornar o valor de th.

R: using System;

class Program

static void Main()

// Exemplo de uso da função

double[] xn = { /* Sua série temporal discreta aqui */ };

double w = 50; // Tamanho da janela em ms

double fs = 1000; // Frequência de amostragem em Hz

double th = CalcularLimiar(xn, w, fs);

Console.WriteLine($"O limiar calculado é: {th}");

static double CalcularLimiar(double[] xn, double w, double fs)

int tamanhoJanela = (int)(w * fs / 1000); // Convertendo o tamanho da janela


para o número de amostras

int numeroJanelas = xn.Length / tamanhoJanela; // Calculando o número de


janelas

double somaQuadrados = 0;

// Calculando a soma dos quadrados das amplitudes em cada janela

for (int i = 0; i < numeroJanelas; i++)

for (int j = 0; j < tamanhoJanela; j++)

int indice = i * tamanhoJanela + j;

somaQuadrados += xn[indice] * xn[indice];

// Calculando a média dos quadrados das amplitudes

double mediaQuadrados = somaQuadrados / (numeroJanelas * tamanhoJanela);

6
// Calculando o desvio padrão

double desvioPadrao = Math.Sqrt(mediaQuadrados);

// Definindo um fator (por exemplo, 3) para multiplicar o desvio padrão e obter


o limiar

double fatorLimiar = 3;

// Calculando o limiar

double th = fatorLimiar * desvioPadrao;

return th;

b) Use a função implementada de forma a calcular o valor de th para um ruído xn,


amostrado a partir de uma distribuição uniforme. A duração total do ruído deve ser de
10 segundos, a frequência de amostragem deve ser de 500 Hz e o tamanho da janela
de processamento deve ser de 50 ms.

R: using System;

class Program

static void Main()

// Configuração dos parâmetros

int duracaoTotalSegundos = 10;

double frequenciaAmostragem = 500; // Hz

double tamanhoJanela = 50; // ms

// Geração de um ruído amostrado a partir de uma distribuição uniforme

double[] xn = GerarRuidoUniforme(duracaoTotalSegundos,
frequenciaAmostragem);

// Cálculo do limiar usando a função CalcularLimiar

double th = CalcularLimiar(xn, tamanhoJanela, frequenciaAmostragem);

Console.WriteLine($"O limiar calculado para o ruído é: {th}");

static double[] GerarRuidoUniforme(int duracaoSegundos, double


frequenciaAmostragem)

7
int numeroAmostras = (int)(duracaoSegundos * frequenciaAmostragem);

double[] xn = new double[numeroAmostras];

Random rand = new Random();

for (int i = 0; i < numeroAmostras; i++)

// Amostrando a partir de uma distribuição uniforme entre -1 e 1

xn[i] = rand.NextDouble() * 2 - 1;

return xn;

static double CalcularLimiar(double[] xn, double w, double fs)

// Implementação da função CalcularLimiar conforme fornecido anteriormente

// ...

return th;

Q7. Implemente em C#, utilizando a instrução switch/case, a máquina de estado abaixo. Ilustre
o funcionamento desta máquina para o diagrama de tempo de estado disponível na questão 1.

8
Q8: Dado o diagrama espacial que ilustra o movimento de uma abelha em um cenário
bidimensional, com coordenadas X e Y, bem como os gráficos do deslocamento da abelha em X
e Y em função do tempo, responda:

a. Considerando que antes do tempo zero a abelha estava parada e que o tempo de
coleta (tc) do pólen é igual ao tempo de depósito (td) do pólen (tc = td = 200 ms),
desenhe o diagrama de estados que ilustre a tarefa da abelha de sair de sua posição
inicial, coletar o pólen (na flor com pólen) e depositar o pólen (na flor sem pólen). Em
sua solução considere uma máquina de 5 estados (1: repouso, 2: movendo ao longo do
eixo X a uma velocidade de 1 m/s, 3: movendo ao longo do eixo Y a uma velocidade de
1 m/s, 4: coleta do pólen, 5: depósito do pólen). Para transitar de um estado para
outro, obrigatoriamente deve-se retornar ao estado 1 e permanecer nele por 200 ms.
O tempo de transição de um estado para outro é desprezível.
b. Desenhe o diagrama da máquina de estados de acordo com as regras definidas no
item a.
c. Como poderíamos controlar a dificuldade do jogo por meio da variável velocidade de
movimento da abelha?

9
4
Abelha

3 Flor sem pólen

Flor com pólen


y 2

0
0 1 2 3 4
X

X
4
Distância (m)

3
2
1
0

0 1 2 3 4 5 6 7 8 9
Tempo (s)

Y
4
Distância (m)

3
2
1
0

0 1 2 3 4 5 6 7 8 9
Tempo (s)
10
Q9: Considerando a arquitetura básica dos componentes básicos de uma interface homem-
máquina, responda:

a) Qual a função de um sensor na interação homem-máquina?

R: Um sensor na interação homem-máquina tem a função de coletar informações do


ambiente ou do usuário e convertê-las em sinais elétricos ou digitais que possam ser
interpretados por um sistema computacional. Essas informações podem ser de
natureza variada, como temperatura, pressão, luz, som, toque, movimento, etc. Os
sensores são responsáveis por capturar dados do mundo real e torná-los disponíveis
para o sistema.

b) Qual a função de um atuador na interação homem-máquina?


R: Um atuador é responsável por converter sinais elétricos ou digitais do sistema em
ações físicas no ambiente ou em resposta ao usuário. Isso significa que ele traduz as
saídas do sistema em movimento, luz, som ou qualquer outra forma de resposta
perceptível pelo ser humano. Por exemplo, um atuador pode ser um motor que
move um cursor na tela, um alto-falante que emite som ou um motor que aciona
uma válvula.
c) Como o meio de transmissão, representado pelo cabo no diagrama, pode afetar o
processo de interação homem-máquina?
R: O meio de transmissão, representado pelo cabo no diagrama, desempenha um
papel importante na interação homem-máquina. A qualidade, a velocidade e a
confiabilidade da transmissão de dados através desse meio podem afetar
significativamente a eficácia da interação. Por exemplo, cabos danificados ou de má
qualidade podem causar perda de dados, atrasos na transmissão ou interferências, o
que pode prejudicar a experiência do usuário.
d) Como o filtro representado no diagrama acima pode afetar o processo de interação
homem-máquina?

R: O filtro representado no diagrama é responsável por limitar ou modificar as


características do sinal que passa por ele. Os filtros são usados para remover ruídos,
suavizar sinais ou destacar determinadas frequências. A escolha do tipo e das
configurações do filtro pode afetar a precisão e a qualidade dos dados que são

11
processados pelo sistema. Um filtro inadequado pode causar distorções nos dados
de entrada ou saída, afetando a interpretação correta da informação.

e) Como a resolução do conversor analógico digital pode afetar o processo de interação


homem-máquina?

R: A resolução de um conversor analógico-digital (ADC) determina a precisão com


que um sinal analógico é convertido em um valor digital. Quanto maior a resolução,
mais detalhado e preciso será o resultado digital. Uma baixa resolução pode resultar
em perda de detalhes importantes, o que pode afetar a qualidade da interação. Por
exemplo, em um sensor de temperatura, uma resolução baixa pode não capturar
variações sutis de temperatura, enquanto uma resolução alta pode fornecer leituras
mais precisas e úteis para o usuário. Portanto, a resolução do ADC é crítica para a
precisão da interação homem-máquina em muitos contextos.

Q10: Dado as figuras abaixo, identifique os tipos de sensores que poderiam ser utilizados para
detectar os sinais das pessoas, e exemplifique um possível tipo de interface que poderia ser
desenvolvida a partir da combinação dos sinais coletados.

R: Sensor de temperatura com infravermelho:

Uma potencial interface derivada da combinação dos sinais de um sensor de temperatura


com infravermelho seria um sistema inteligente de controle térmico para ambientes. O
sensor coletaria dados precisos sobre a temperatura em diversas áreas, os quais seriam
processados para identificar padrões e variações térmicas. Essas informações seriam
apresentadas de maneira intuitiva em uma interface gráfica, permitindo que os usuários
visualizem mapas de temperatura do ambiente, destacando áreas quentes e frias.

R: Eletrodos para realização de EEG:

Uma potencial interface que poderia ser desenvolvida a partir dos sinais coletados de um
eletrodo de EEG (eletroencefalograma) consistiria em um sistema de controle cerebral para

12
dispositivos eletrônicos. Ao posicionar o eletrodo no couro cabeludo para capturar os sinais
elétricos gerados pela atividade cerebral, esses padrões seriam processados e classificados
em diferentes estados mentais, como relaxamento, foco, estresse ou atenção.

Q11: Dado os trechos de sinais abaixo, proponha/descreva um sistema de reconhecimento


capaz de discriminar padrões de oscilação cerebral de crianças e adultos.

Q12: Na figura abaixo, qual é a função dos módulos de segmentação/janelamento de dados,


extração de características e de classificação dos dados.

13
R: Na interface homem-máquina, a aplicação de módulos de segmentação/janelamento de
dados, extração de características e classificação desempenha um papel crucial em sistemas
que envolvem o processamento de sinais, como interfaces baseadas em dados biométricos
(por exemplo, sinais de eletromiografia ou eletroencefalografia). O processo começa com a
segmentação ou janelamento dos dados, onde a informação é dividida em segmentos
temporais menores, permitindo uma análise mais detalhada.

O módulo de extração de características identifica e extrai informações distintas desses


segmentos, como amplitude, frequência ou padrões de oscilação. Essas características são
essenciais, pois reduzem a complexidade dos dados, destacando aspectos relevantes para a
representação do conteúdo informativo dos sinais.

Por fim, o módulo de classificação categoriza os dados com base nessas características,
atribuindo rótulos ou classes a cada segmento, refletindo, por exemplo, a intenção de
movimento ou o estado emocional do usuário. Essa classificação é fundamental para traduzir
os sinais fisiológicos ou comportamentais do usuário em comandos compreensíveis para o
sistema, permitindo uma interação natural e intuitiva em contextos onde interfaces
convencionais podem não ser práticas. A escolha de algoritmos específicos para cada
módulo depende do contexto da aplicação, características dos dados e requisitos de
desempenho da interface homem-máquina.

14

Você também pode gostar