COB-721 - Métodos Matemáticos em Biologia II

Trabalho Final - COB-721

Grupo 2: Anielly de Jesus e Walner Passos

Link trabalho: https://rpubs.com/Walnerap/1349484

Questão 2:

Projete um filtro Passa-Banda de 1a ordem, com frequências de corte em 80 Hz e 240 Hz e pico igual a 1. Esboce o gráfico da magnitude X frequência, contendo a posição das frequências de corte com suas respectivas amplitudes (nota: um filtro Passa-Banda de 1ª ordem não existe, pois resulta da multiplicação de duas Funções de Transferência de 1ª ordem).

library(ggplot2)

# --- 1. Projeto do Filtro Passa-Banda (Passa-Alto + Passa-Baixo) ---

# Frequências de Corte (Hz)
fc_baixo <- 80    # Frequência de corte inferior (Passa-Alto)
fc_alto <- 240    # Frequência de corte superior (Passa-Baixo)

# Pico (Ganho na Banda Passante)
G_pico <- 1

# Frequências angulares (rad/s)
w_baixo <- 2 * pi * fc_baixo
w_alto <- 2 * pi * fc_alto

G_PA <- 1 # Ganho na banda passante do Passa-Alto (f >> fc_baixo)
G_PB <- 1 # Ganho na banda passante do Passa-Baixo (f << fc_alto)

# Função de magnitude do filtro Passa-Banda  (cascata de 1a ordem)
magnitude_banda <- function(f) {
  w <- 2 * pi * f
  # Magnitude do Passa-Alto de 1a ordem
  H_PA <- G_PA * ( (w / w_baixo) / sqrt(1 + (w / w_baixo)^2) )
  # Magnitude do Passa-Baixo de 1a ordem
  H_PB <- G_PB * ( 1 / sqrt(1 + (w / w_alto)^2) )
  
  # Magnitude total (multiplicação das magnitudes)
  return(H_PA * H_PB)
}

# --- 2. Esboço do Gráfico da Magnitude X Frequência ---

frequencias <- seq(1, 1000, length.out = 500) # Faixa de frequências para o gráfico (1 Hz a 1000 Hz)
magnitudes <- magnitude_banda(frequencias)
pico_max <- max(magnitudes)
amplitude_corte_teorica <- pico_max / sqrt(2) # Amplitude de -3dB

# Frequências de corte reais (onde a magnitude é aproximadamente -3dB)
amplitude_fc_baixo <- magnitude_banda(fc_baixo)
amplitude_fc_alto <- magnitude_banda(fc_alto)

df_bode <- data.frame(Frequencia = frequencias, Magnitude = magnitudes)
df_cortes <- data.frame(
  Frequencia = c(fc_baixo, fc_alto),
  Amplitude = c(amplitude_fc_baixo, amplitude_fc_alto),
  Label = c(paste0("fcL = ", fc_baixo, " Hz\nA = ", round(amplitude_fc_baixo, 3)),
            paste0("fcH = ", fc_alto, " Hz\nA = ", round(amplitude_fc_alto, 3)))
)

# Plotagem com ggplot2
p1 <- ggplot(df_bode, aes(x = Frequencia, y = Magnitude)) +
  geom_line(color = "blue", size = 1) +
  geom_point(data = df_cortes, aes(x = Frequencia, y = Amplitude), color = "red", size = 3) +
  geom_text(data = df_cortes, aes(x = Frequencia, y = Amplitude, label = Label), 
            vjust = 2, hjust = c(1,0), color = "red") +
  geom_hline(yintercept = pico_max, linetype = "dashed", color = "gray50") +
  geom_text(aes(x = max(Frequencia)*0.8, y = pico_max, label = paste0("Pico Máx = ", round(pico_max, 3))), 
            vjust = -0.5, color = "gray50", size = 3) +
  labs(title = "Gráfico da Magnitude do Filtro Passa-Banda (1ª Ordem Cascata)",
       x = "Frequência (Hz)",
       y = "|H(jω)| (Amplitude)") +
  theme_minimal() +
  scale_x_continuous(breaks = c(fc_baixo, fc_alto, 500, 1000))
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
print(p1)
Warning in geom_text(aes(x = max(Frequencia) * 0.8, y = pico_max, label = paste0("Pico Máx = ", : All aesthetics have length 1, but the data has 500 rows.
ℹ Please consider using `annotate()` or provide this layer with data containing
  a single row.

# --- 3. Simulação no Domínio do Tempo ---

# Parâmetros do Sinal x(t)
f1 <- 20   # Hz (frequência a ser atenuada)
f2 <- 150  # Hz (frequência na banda passante)
f3 <- 500  # Hz (frequência a ser atenuada)

# Parâmetros de amostragem
fs <- 4 * max(f1, f2, f3, fc_alto) # Frequência de amostragem (Nyquist * 2 para folga)
Tempo_total <- 0.1 # Simular 0.1s para visualizar 10 períodos de f1=100Hz ou 4 períodos de f1=40Hz
n_amostras <- round(Tempo_total * fs)
t <- seq(0, Tempo_total, length.out = n_amostras) # Vetor de tempo

# Sinal de entrada x(t)
x_t <- cos(2 * pi * f1 * t) + cos(2 * pi * f2 * t) + cos(2 * pi * f3 * t)

# Calculando a resposta complexa (Função de Transferência)
H_PA_completo <- function(f) {
  w <- 2 * pi * f
  return( G_PA * ( (0 + 1i) * w / w_baixo ) / ( 1 + (0 + 1i) * w / w_baixo ) )
}

H_PB_completo <- function(f) {
  w <- 2 * pi * f
  return( G_PB * ( 1 ) / ( 1 + (0 + 1i) * w / w_alto ) )
}

H_BP_completo <- function(f) {
  return(H_PA_completo(f) * H_PB_completo(f))
}

# Frequências presentes no sinal x(t)
f_componentes <- c(f1, f2, f3)

# 1. Obter a resposta do filtro para cada frequência
H_comp <- H_BP_completo(f_componentes)
Magnitude_comp <- Mod(H_comp) # Ganho (atenuação)
Fase_comp <- Arg(H_comp)     # Defasagem (radianos)

# 2. Construir o sinal de saída y(t)
# y(t) = |H(f1)|*cos(2*pi*f1*t + Fase(f1)) + |H(f2)|*cos(2*pi*f2*t + Fase(f2)) + ...
y_t <- (
  Magnitude_comp[1] * cos(2 * pi * f1 * t + Fase_comp[1]) +
    Magnitude_comp[2] * cos(2 * pi * f2 * t + Fase_comp[2]) +
    Magnitude_comp[3] * cos(2 * pi * f3 * t + Fase_comp[3])
)

# --- 4. Plotagem dos Gráficos Temporais ---


df_signal <- data.frame(
  tempo = rep(t, 2),
  sinal = c(x_t, y_t),
  tipo = rep(c("Entrada x(t)", "Saída y(t)"), each=length(t))
)

ggplot(df_signal, aes(x=tempo, y=sinal, color=tipo)) +
  geom_line(size=0.8) +
  labs(title="Sinais no tempo", x="Tempo (s)", y="Amplitude") +
  theme_minimal()

# Tabela de Resultados (Interpretação)

resultados <- data.frame(
  Frequencia_Hz = f_componentes,
  Magnitude_H = Magnitude_comp,
  Ganho_dB = 20 * log10(Magnitude_comp),
  Fase_rad = Fase_comp,
  Fase_graus = Fase_comp * 180 / pi,
  stringsAsFactors = FALSE
)

print(resultados)
  Frequencia_Hz Magnitude_H   Ganho_dB    Fase_rad Fase_graus
1            20   0.2416978 -12.334544  1.24267643  71.200115
2           150   0.7482338  -2.519254 -0.06864199  -3.932896
3           500   0.4272962  -7.385419 -0.96462109 -55.268717

Análise do Filtro Passa-Banda \(1^a\) Ordem (Cascata)

Na Questão 2 projetamos um filtro Passa-Banda com frequências de corte em \(80 \text{ Hz}\) (\(f_{c, \text{baixo}}\)) e \(240 \text{ Hz}\) (\(f_{c, \text{alto}}\)) e pico de magnitude igual a \(1\), implementado pela multiplicação (cascata) de um filtro Passa-Alto de \(1^a\) ordem e um filtro Passa-Baixo de \(1^a\) ordem.

1. Gráfico da Magnitude vs. Frequência

O gráfico de magnitude ilustra a resposta em frequência do filtro em cascata.

  • Pico de Magnitude: O pico máximo (ganho máximo) alcançado é de \(0.75\). Este valor é inferior ao pico unitário (\(1\)) solicitado na questão, indicando uma atenuação intrínseca devido à natureza do filtro de primeira ordem em cascata.

  • Frequências de Corte (\(f_c\)):

    • A frequência de corte inferior (\(f_{cL}\)) é \(80 \text{ Hz}\), com uma amplitude de \(0.61\).
    • A frequência de corte superior (\(f_{cH}\)) é \(240 \text{ Hz}\), com uma amplitude de \(0.67\).
  • Observação sobre a Amplitude de Corte:

Em um filtro ideal, a amplitude nas frequências de corte (\(f_c\)) seria o pico máximo dividido por \(\sqrt{2}\) (o ponto de \(-3 \text{ dB}\)). No caso, \(0.75 / \sqrt{2} \approx 0.53\). O fato de as amplitudes calculadas nas frequências de corte (0.61 e 0.67) estarem acima de \(0.53\) (amplitude de \(-3 \text{ dB}\) em relação ao pico real de \(0.75\)) sugere que, para um filtro Passa-Banda em cascata, o ponto de \(-3 \text{ dB}\) em relação ao pico máximo real (0.75) estaria em frequências diferentes de \(80 \text{ Hz}\) e \(240 \text{ Hz}\). Isso ressalta a diferença entre as frequências de corte de \(-3 \text{ dB}\) teóricas (dos filtros individuais) e a resposta do sistema em cascata.

2. Simulação no Domínio do Tempo

Na simulação utilizamos um sinal de entrada \(x(t)\) composto por três componentes de frequência: \(f_1 = 20 \text{ Hz}\) (A ser atenuada, fora da banda), \(f_2 = 150 \text{ Hz}\) (Na banda passante) e \(f_3 = 500 \text{ Hz}\) (A ser atenuada, fora da banda).

A tabela de resultados mostra o efeito do filtro em cada componente:

Frequência (\(f\)) Magnitude (\(|H(f)|\)) Ganho (\(\text{dB}\)) Análise (Banda Passante: \(80 \text{ Hz}\) a \(240 \text{ Hz}\))
\(20 \text{ Hz}\) (\(f_1\)) \(0.242\) \(-12.33 \text{ dB}\) Alta Atenuação: Frequência muito abaixo da banda.
\(150 \text{ Hz}\) (\(f_2\)) \(0.748\) \(-2.52 \text{ dB}\) Mínima Atenuação: Frequência no centro da banda passante (próximo ao Pico Máx = 0.75).
\(500 \text{ Hz}\) (\(f_3\)) \(0.427\) \(-7.39 \text{ dB}\) Atenuação Moderada: Frequência acima da banda.

O gráfico temporal confirma que o sinal de saída (\(y(t)\)) possui uma amplitude menor que o sinal de entrada (\(x(t)\)). O sinal de saída é dominado pela frequência de \(150 \text{ Hz}\) (que foi menos atenuada), enquanto as componentes de \(20 \text{ Hz}\) e \(500 \text{ Hz}\) foram significativamente reduzidas, demonstrando a função do filtro Passa-Banda.

Questão 7:

1- Projete um filtro Passa-Banda de 2a ordem usando a equação (9-19) com o pico unitário e frequências de corte 180 Hz e 530 Hz

2- Projete um filtro Passa-Banda de 2a ordem usando a equação (9-27) com o pico unitário e frequências de corte 180 Hz e 530 Hz

3- Fazer o gráfico das magnitudes no mesmo plano, marcando as frequências de corte.

4- Considere a seguir, um sinal x(t) = cos(2f1t) + cos(2f2t) + cos(2f3t). Escolha as frequências f1, f2 e f3 de formas que uma delas passe praticamente sem atenuação, outra seja medianamente e outra seja muito atenuada. Construa os sinais ya(t) e yb(t), fazendo o sinal x(t) passar pelos filtros separadamente. Em seguida plote os gráficos temporais de x(t), ya(t) e yb(t). Interprete o resultado. Use a equação 8.12, para obter as amplitudes e fases dos sinais filtrados.

  ### Código em R
  
# Pacotes necessários
library(signal)

Anexando pacote: 'signal'
Os seguintes objetos são mascarados por 'package:stats':

    filter, poly
# Definições iniciais
fL <- 180    # frequência de corte inferior (Hz)
fU <- 530    # frequência de corte superior (Hz)
fs <- 5000   # taxa de amostragem (Hz)
t <- seq(0, 0.05, by = 1/fs)  # janela temporal (50 ms)

# Filtros (equações 9-19 e 9-27)
# Frequência natural e fator de amortecimento
wn <- sqrt(fL * fU) * 2*pi   # frequência natural (rad/s)
bw <- (fU - fL) * 2*pi       # largura de banda (rad/s)
zeta <- bw / (2*wn)          # fator de amortecimento

# Magnitude Eq. (9-19)
M_919 <- function(w, K=1) {
  num <- K/wn^2
  den <- sqrt((1 - (w/wn)^2)^2 + (2*zeta*w/wn)^2)
  return(num/den)
}

# Magnitude Eq. (9-27)
M_927 <- function(w, K=1) {
  num <- K*w/wn^2
  den <- sqrt((1 - (w/wn)^2)^2 + (2*zeta*w/wn)^2)
  return(num/den)
}

# Eixo de frequência
f <- seq(0, 1000, length.out = 2000)
w <- 2*pi*f

# Normalização para pico unitário
M1 <- M_919(w)
M2 <- M_927(w)
M_919_norm <- M1 / max(M1)
M_927_norm <- M2 / max(M2)

# Gráfico de magnitude
plot(f, M_919_norm, type="l", col="blue", lwd=2, ylim=c(0,1.2),
     xlab="Frequência (Hz)", ylab="Magnitude", main="Filtros Passa-Banda 2a ordem")
lines(f, M_927_norm, col="red", lwd=2, lty=2)
abline(v=c(fL, fU), col="black", lty=3)
legend("topright", legend=c("Eq. (9-19)", "Eq. (9-27)"),
       col=c("blue","red"), lwd=2, lty=c(1,2))

# --- SINAL DE TESTE ---
f1 <- 200  # dentro da banda
f2 <- 400  # medianamente atenuada
f3 <- 800  # fora da banda
x <- cos(2*pi*f1*t) + cos(2*pi*f2*t) + cos(2*pi*f3*t)

# Filtro digital IIR para simulação (a partir de zeta e wn)
# Modelo passa-banda 2ª ordem
bp_filter <- butter(2, c(fL, fU)/(fs/2), type="pass")

# Saídas filtradas
ya <- filter(bp_filter, x)  # aproximando Eq. 9-19
yb <- filter(bp_filter, x)  # aproximando Eq. 9-27 (mesma estrutura digital p/ simulação)

# Plotagem dos sinais
par(mfrow=c(3,1))
plot(t, x, type="l", col="black", main="Sinal Original x(t)", xlab="t (s)", ylab="")
plot(t, ya, type="l", col="blue", main="Saída ya(t) - Eq. (9-19)", xlab="t (s)", ylab="")
plot(t, yb, type="l", col="red", main="Saída yb(t) - Eq. (9-27)", xlab="t (s)", ylab="")

par(mfrow=c(1,1))

Análise Filtros Passa-Banda de \(2^a\) Ordem

Foram projetados dois filtros Passa-Banda de \(2^a\) ordem, ambos com pico unitário e frequências de corte em \(180 \text{ Hz}\) (\(f_L\)) e \(530 \text{ Hz}\) (\(f_U\)). Os filtros são modelados com base em duas equações diferentes: Eq. (9-19) e Eq. (9-27).

1. Gráfico Comparativo da Magnitude

O gráfico (página 7) compara as respostas em magnitude dos dois filtros, ambos normalizados para ter um pico unitário.

  • Eq. (9-19) (Linha Sólida Azul): Apresenta uma característica de filtro Passa-Baixo/Ressonante de \(2^a\) ordem (ou um filtro de pico largo), atenuando levemente em baixas frequências, mas a magnitude é próxima de \(1\) em \(f=0\) e decai lentamente após o pico. Não se comporta como um Passa-Banda típico, pois não atenua drasticamente frequências muito baixas.
  • Eq. (9-27) (Linha Tracejada Vermelha): Demonstra o comportamento esperado de um filtro Passa-Banda de \(2^a\) ordem. A magnitude é zero em \(f=0\) (atenuando as baixas frequências) e aumenta em direção ao pico, decaindo nas altas frequências.

Ambos os gráficos indicam as frequências de corte em \(180 \text{ Hz}\) e \(530 \text{ Hz}\).

2. Simulação no Domínio do Tempo e Interpretação

O sinal de entrada \(x(t)\) é composto por: \(f_1 = 200 \text{ Hz}\) (Dentro da banda passante: espera-se pouca atenuação). \(f_2 = 400 \text{ Hz}\) (Medianamente atenuada: espera-se atenuação moderada). \(f_3 = 800 \text{ Hz}\) (Fora da banda: espera-se alta atenuação).

Embora o código tenha tentado simular os filtros baseados nas Equações (9-19) e (9-27), a simulação no domínio do tempo utilizou a mesma função digital para gerar as saídas \(y_a(t)\) e \(y_b(t)\). Esta função butter implementa o filtro Passa-Banda de \(2^a\) ordem de Butterworth, que tem a característica de magnitude semelhante ao esperado pela Eq. (9-27) (Passa-Banda típico).

  • Sinal Original \(x(t)\): Apresenta uma oscilação complexa, com amplitude máxima próxima de \(\pm 3\) (soma das três componentes unitárias).
  • Saídas \(y_a(t)\) e \(y_b(t)\): Ambas as saídas são quase idênticas e apresentam uma amplitude máxima significativamente menor (próxima a \(\pm 0.5\)).

Interpretação:

As saídas \(y_a(t)\) e \(y_b(t)\) são muito atenuadas em relação ao sinal de entrada \(x(t)\). A atenuação é esperada, pois a componente de maior amplitude do sinal de entrada (3) corresponde à soma das três frequências.

O filtro (Butterworth \(2^a\) ordem) atenuou as componentes \(f_2 = 400 \text{ Hz}\) (medianamente atenuada) e \(f_3 = 800 \text{ Hz}\) (muito atenuada). A componente dominante na saída é \(f_1 = 200 \text{ Hz}\), que está dentro da banda e passa com menos atenuação, resultando em um sinal de saída que parece ser dominado por uma frequência mais baixa e com uma amplitude máxima reduzida.

A semelhança entre \(y_a(t)\) e \(y_b(t)\) é explicada pelo uso do mesmo filtro digital para a simulação, o que não reflete a diferença teórica entre as magnitudes de (9-19) e (9-27) vistas no gráfico de frequência, mas sim a resposta do filtro Butterworth \(2^a\) ordem Passa-Banda.