<jupyter_start><jupyter_text>SLITD's e EDLCC's  Introdução Ferramentas computacionais têm uma grande importância na análise e projeto de sinais e sistemas modernos. Equações de Diferenças Lineares com Coeficientes Constantes (EDLCC's) são fundamentais na representação/descrição de sistemas simples e mais complexos. Felizmente, ferramentas de software atuais tornam possível a manipulação dessas EDLCC's em diversos domínios sem muito esforço. Equações de Diferenças Lineares de Coeficientes Constantes são completamente caracterizadas pelos conjuntos de coeficientes ${a_k}$ e ${b_k}$. Podemos usar tais ferramentas como **PyLab** (apresentação gráfica) e o pacote *signal* do **Scipy** (computação científica) para projetar filtros de alta performance, particularmente no domínio do tempo discreto. As funções de projeto de filtros calculam os coeficientes ${a_k}$ e ${b_k}$ em resposta aos requisitos de projeto fornecidos pelo projetista. Em geral, usamos os projetos de filtros na simulação de sistemas maiores. Os sistemas são representados por EDLCC's, normalmente, em três domínios: tempo, frequência e Z (freq. complexa). Os conjuntos de coeficientes constantes, $a_k$ e $b_k$, existem e são os mesmos nos três domínios citados. Portanto, esses **coeficientes definem o sistema** em qualquer que seja o domínio de representação.Aqui estão algumas da relações entrada-saída nos domínios citados:Domínio do tempo: **Resposta ao Impulso**: $$y[n]=\sum_{k=-\infty}^{\infty}x[k].h[n-k]$$Domínio do tempo: **EDLCC**:$$y[n]+a_1.y[n-1]+...+a_{N-1}.y[n-(N-1)+a_N.y[n-N]=b_0.x[n]+b_1.x[n-1]+...+b_{M-1}.x[n-(M-1)+b_M.x[n-M]\;\;\;\;\;\;(1)$$$$y[n]=\sum_{k=0}^{M}{b_k.x[n-k]}-\sum_{k=1}^{N}{a_k.y[n-k]}$$Domínio Z: **Função de Transferência**: $$H(z)=\frac{\sum_{k=0}^{M-1}b_k.X(z-k)}{\sum_{k=1}^{N-1}a_k.Y(z-k)}$$Domínio da frequência: **Resposta em Frequência**: $$H(\Omega)=\frac{\sum_{k=0}^{M-1}b_k.X(\Omega-\Omega_k)}{\sum_{k=1}^{N-1}a_k.Y(\Omega-\Omega_k)}$$ A resposta ao impulso, $h[n]$, convoluída pela entrada, $x[n]$, produz a saída do sistema, $y[n]$.O teorema da convolução para as transformadas de Fourier aplicado à resposta ao impulso, $h[n]$, produz a **Resposta em Frequência** do sistema, $H(\Omega)$, ou seja, a razão do espectro da saída pelo espectro da entrada, $Y(\Omega)/X(\Omega)$.O teorema da convolução para a Transformada-z produz a saída no domínio z, $Y(z)$, como produto da entrada, $X(z)$, e a **Função Sistema (Função de Transferência)**, $H(z)$, que é a Transformada-z da **Resposta ao Impulso**.  EDLCC - Resposta ao Impulso A Resposta ao Impulsiva de um SLITD, $h[n]$ pode ser obtida resolvendo-se a equação (1) para a entrada $x[n]=\delta[n]$ e assumindo o SLITD em repouso. Para um sistema **não recursivo**, ou seja, $a_k=0$ para $k = 1,2,...N$, a equação (1)  torna-se:$$y[n]=h[n]=\sum_{k=0}^M b_k.\delta[n-k]$$  Classificação de SLITD's Quanto a Duração da Resposta ao Impulso Se a Resposta Impulsiva $h[n]$ for finita, então o SLITD é classificado como sendo do tipo **FIR - *Finite Impulse Response***. Porém, se $a_k\neq0$, a Resposta Impulsiva $h[n]$ será de duração infinita, e o SLITD será classificado como sendo do tipo **IIR - *Infinite Impulse Response***.  Resolução de EDLCC's Existem vários métodos de resolução de uma EDLCC, para uma determinada entrada $x[n]$ e condições iniciais do SLITD: **Iterativo**:Baseia-se na construção de uma tabela de valores da entrada e da saída, a partir da avaliação da EDLCC para cada tempo $n$. Esse método é indicado quando se deseja calcular alguns poucos valores da saída (método essencialmente computacional) a partir do instante nulo: $n=0$. **Clássico** (Analítico):Resolução de equações diferenciais (usando autofunções como possíveis soluções da equação), que consiste em obter a solução homogênea  e a solução particular. Esse método é indicado quando se deseja conhecer o valor da saída para qualquer instante de tempo, visto que o método redunda numa expressão fechada para a saída, $y[n]$.**Transformada-Z**: Consistem na aplicação da Transformada-z Direta à EDLCC, para obter uma equação algébrica de fácil solução. Em seguida, aplica-se a Transformada-Z Inversa para obter a resposta do SLITD no domínio do tempo. Esse método, também, é indicado quando se deseja conhecer o valor da saída para qualquer instante de tempo, visto que o método redunda numa expressão fechada para a saída, $y[n]$.  Ferramentas Computacionais A figura seguinte mostra as funções chaves em **PyLab** e no módulo *signal* do pacote **Scipy** usadas na análise dos sistemas de tempo discreto nos diversos domínios.  **Domínio do Tempo**: você resolve equações de diferenças usando signal.lfilter(b,a,x).**Domínio z**: você pode encontrar o plano de polos e zeros da Função de Transferência $H(z)$ do sistema, usando ssd.zplane(b,a); e pode fazer a expansão em frações parciais, usando signal.residuez.**Domínio da Frequência**: você pode encontrar a Resposta em Frequência $H(\Omega)$ de um sistema de tempo discreto com signal.freqz(b,a,2\*pi\*f), onde $f$ é a variável frequência.  Procedimentos Seja um SLITD relaxado (c.i.’s nulas) descrito por sua EDLCC de segunda ordem:$$y[n] + 0,6 y[n-2] = 0,3x[n] + 0,5x[n-1] + 0,3x[n-2]$$Desenvolva um *script* para calcular e traçar a resposta do SLITD às seguintes entradas, usando o **método iterativo** para solucionar a EDLCC, $-5\leq n\leq20$:Impulso unitário: $x[n]=\delta[n]$Degrau unitário: $x[n]=u[n]$Exponencial: $x[n]=3.(0,4)^nu[n]$<jupyter_code>% pylab inline
# Procedimento 1 - letra (A)
from numpy import arange, zeros
from pylab import stem, title, xlabel, ylabel, subplot, grid, ylim, subplots
n = arange(-5,21)               # base de tempo
N = 2                           # ordem do SLITD: max_atraso(x,y)
iot = 5                         # índice da origem dos tempos
x = zeros(len(n)); x[iot] = 1   # entrada: impulso unitário
y = zeros(len(n))               # condições iniciais nulas

# print ' n   y[n]'
for item in n[N:]:
  m = item + iot                # posição no vetor
  y[m] = -0.6*y[m-2] + 0.3*x[m] + 0.5*x[m-1] + 0.3*x[m-2]   # EDLCC
  # print '%2d %+7.5f' % (item,y[m])

subplots(figsize=(18,6))        # estipula espaço físico para os gráficos

# Gráfico 1: sinal da Entrada, x[n]
subplot(121)
marca,linha,eixo = stem(n,x)
setp(marca,'markerfacecolor', 'r'); setp(linha,'color', 'r'); setp(linha,'linewidth',3)
title('Entrada - $\delta[n]$',fontsize=16,color='r')
grid('on'); xlabel('$n$',fontsize=16); ylabel('Amplitude',fontsize=16); ylim(-0.5,1.5)

# Gráfico 2: sinal da Saída, y[n]
subplot(122)
marca,linha,eixo = stem(n,y)
setp(eixo,'color','k'); setp(linha,'linewidth',3)
title('Resposta ao Impulso - $h[n]$',fontsize=16,color='b'); ylim(-0.5,0.7)
grid('on'); xlabel('$n$',fontsize=16); ylabel('Amplitude',fontsize=16)<jupyter_output>Populating the interactive namespace from numpy and matplotlib
{'fraction_non_alphanumeric': 0.13621117106606387, 'fraction_numerical': 0.01458363715910748, 'mean_word_length': 4.917169974115617, 'pattern_counts': {'":': 0, '<': 4, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '655438', 'license': 'Apache-2.0', 'n_tokens_mistral': 2709, 'n_tokens_neox': 2606, 'n_words': 837, 'path': "03-EDLCC/SLITD's e EDLCC's.ipynb", 'repo_name': 'kaw19/pds', 'size': '6857'}