Código-fonte:
using Plots, DSP, LinearAlgebra, LaTeXStrings, Markdown, FFTW, DataFrames, OffsetArrays
pyplot()
= Markdown.parse
mkdn function rd(x; d=2)
return round(x, digits = d)
end;
using Plots, DSP, LinearAlgebra, LaTeXStrings, Markdown, FFTW, DataFrames, OffsetArrays
pyplot()
= Markdown.parse
mkdn function rd(x; d=2)
return round(x, digits = d)
end;
[2,5pt] Você recebe a TDF de um sinal amostrado com uma taxa \(f_a=8\)kHz, com os valores \[\begin{align*} X[0] &= 5 & X[1] &= 3 + j4 & X[2] &= 1 - j & X[3] &= 0\\ X[4] &= 0 & X[5] &= 0 & X[6] &= 1 + j& X[7] &= 3 - j4 \end{align*}\] Responda:
[1,0pt] Assumindo que foi usado um número inteiro de períodos do sinal para calcular a TDF, determine os coeficientes \(x_k\) da série de Fourier do sinal.
A frequência correspondente à \(k\)-ésima raia da TDF é \(f_k = k\Delta f\), com \(\Delta f=\frac{f_a}{N}\). No nosso caso, \(N=8\), então
= 8_000
fa = 8
N = fa / N
Δf mkdn("``f_k = $Δf k``")
\(f_k = 1000.0 k\)
E como foi usado um número inteiro de períodos, as raias da TDF correspondem às raias da SF, com um fator de \(N\). Assim, a série de Fourier fica
= [5, 3+4im, 1+im, 0, 0, 0, 1-im, 3-4im]
Xk = DataFrame()
xk :k] = 0:N-1
xk[!,:fk] = xk[!,:k]*Δf
xk[!, :xk] = Xk / N
xk[!,"|xk|"] = abs.(Xk/N)
xk[!, "∠xk (°)"] = [abs(a) > 1e-10 ? rd.(angle.(a)*180/π) : 0.0 for a in Xk]
xk[!, xk
8 rows × 5 columns
k | fk | xk | |xk| | ∠xk (°) | |
---|---|---|---|---|---|
Int64 | Float64 | Complex… | Float64 | Float64 | |
1 | 0 | 0.0 | 0.625+0.0im | 0.625 | 0.0 |
2 | 1 | 1000.0 | 0.375+0.5im | 0.625 | 53.13 |
3 | 2 | 2000.0 | 0.125+0.125im | 0.176777 | 45.0 |
4 | 3 | 3000.0 | 0.0+0.0im | 0.0 | 0.0 |
5 | 4 | 4000.0 | 0.0+0.0im | 0.0 | 0.0 |
6 | 5 | 5000.0 | 0.0+0.0im | 0.0 | 0.0 |
7 | 6 | 6000.0 | 0.125-0.125im | 0.176777 | -45.0 |
8 | 7 | 7000.0 | 0.375-0.5im | 0.625 | -53.13 |
[0,5pt] Escreva a expressão do sinal \(x(t)\).
Cada raia da SF corresponde a um cosseno no sinal: \[\begin{align*} x(t) &= 0.625 + 2\times 0.625\cos\left(2\pi t + 53.13\degree\right) + 2\times 0.1768\cos(4\pi t + 45\degree)\\ &=0.625 + 1.25\cos\left(2\pi t + 53.13\degree\right) + 0.3536\cos(4\pi t + 45\degree), \end{align*}\] com \(t\) em ms.
[1,0pt] Qual seria a TDF resultante se fossem usados \(N_1 = 16\) pontos para o cálculo?
Neste caso seriam tomados 2 períodos do sinal para fazer a TDF, e a frequência correspondente à \(k\)-ésima raia seria a metade da anterior (no caso, \(500\)Hz). Assim, no caso do sinal deste exercício as raias correspondentes a \(k\) ímpar seriam nulas, e as raias pares teriam amplitude dobrada:
= [5, 3+4im, 1+im, 0, 0, 0, 1-im, 3-4im]
Xk = DataFrame()
Xk2 :k] = 0:2N-1
Xk2[!,:fk] = Xk2[!,:k]*Δf/2
Xk2[!, :Xk] = zeros(Complex, 2N)
Xk2[!,:Xk][1:2:end] = Xk*2
Xk2[!,"|Xk|"] = zeros(2N)
Xk2[!,"|Xk|"][1:2:end] = abs.(Xk*2)
Xk2[!, "∠Xk (°)"] = zeros(2N)
Xk2[!, "∠Xk (°)"][1:2:end] = [abs(a) > 1e-10 ? rd.(angle.(a)*180/π) : 0.0 for a in Xk]
Xk2[!, Xk2
16 rows × 5 columns
k | fk | Xk | |Xk| | ∠Xk (°) | |
---|---|---|---|---|---|
Int64 | Float64 | Complex | Float64 | Float64 | |
1 | 0 | 0.0 | 10+0im | 10.0 | 0.0 |
2 | 1 | 500.0 | 0+0im | 0.0 | 0.0 |
3 | 2 | 1000.0 | 6+8im | 10.0 | 53.13 |
4 | 3 | 1500.0 | 0+0im | 0.0 | 0.0 |
5 | 4 | 2000.0 | 2+2im | 2.82843 | 45.0 |
6 | 5 | 2500.0 | 0+0im | 0.0 | 0.0 |
7 | 6 | 3000.0 | 0+0im | 0.0 | 0.0 |
8 | 7 | 3500.0 | 0+0im | 0.0 | 0.0 |
9 | 8 | 4000.0 | 0+0im | 0.0 | 0.0 |
10 | 9 | 4500.0 | 0+0im | 0.0 | 0.0 |
11 | 10 | 5000.0 | 0+0im | 0.0 | 0.0 |
12 | 11 | 5500.0 | 0+0im | 0.0 | 0.0 |
13 | 12 | 6000.0 | 2-2im | 2.82843 | -45.0 |
14 | 13 | 6500.0 | 0+0im | 0.0 | 0.0 |
15 | 14 | 7000.0 | 6-8im | 10.0 | -53.13 |
16 | 15 | 7500.0 | 0+0im | 0.0 | 0.0 |
[3,0pt] O sinal \(x(t)\) foi amostrado a uma taxa de \(f_a = 9\)kHz, obedecendo ao critério de Nyquist. É necessário subir a taxa de amostragem para \(12\)kHz.
Projete um sistema para efetuar a troca de taxa. Deseja-se que a distorção do sinal (na banda do sinal) seja menor ou igual a \(0.001\), e que a atenuação das imagens no espectro seja de pelo menos \(70\)dB.
Desenhe um diagrama do sistema necessário para a troca de taxa, e projete um filtro que atenda às especificações pedidas.
Neste caso \(f_a=9\)kHz e \(f_b=12\)kHz, ou seja, é necessário usar um interpolador e um decimador tais que
= 9_000
fa = 12_000
fb = fb // fa
αf = numerator(αf)
L = denominator(αf)
M display(mkdn("``\\frac{f_b}{f_a} = \\frac{$fb}{$fa}= \\frac{$L}{$M}``"))
display(mkdn("Taxa de aumento da frequência: ``L = $L``"))
mkdn("Taxa de redução da frequência: ``M = $M``.")
\(\frac{f_b}{f_a} = \frac{12000}{9000}= \frac{4}{3}\)
Taxa de aumento da frequência: \(L = 4\)
Taxa de redução da frequência: \(M = 3\).
O sistema para aumento de taxa funcionaria como no diagrama a seguir:
flowchart LR
x(("x(t)"))-->Amostragem(nTa)
Amostragem-->|"x[n]=x(nTa)"|L("↑L")
L-->|"xᵢ[m]"|F(FPB)
F-->|"xf[m]=x(mTa/L)"|M("↓M") M-->xm(("x[ℓ]=x(ℓTb)"))
flowchart LR x(("x(t)"))-->Amostragem(nTa) Amostragem-->|"x[n]=x(nTa)"|L("↑L") L-->|"xᵢ[m]"|F(FPB) F-->|"xf[m]=x(mTa/L)"|M("↓M") M-->xm(("x[ℓ]=x(ℓTb)"))
O filtro precisa tem ganho \(L=4\) e frequência de corte \(\omega_c=\pi/4\).
\[\begin{align*}
\delta_p &= 0{,}001, & \delta_r &= 10^{-70/20}
\end{align*}\] O limite da banda do sinal não foi especificado, então há várias respostas possíveis para calcular o comprimento do filtro.
Assumindo por exemplo que o limite da banda-passante do sinal seja \(8\)kHz, se for usada janela de Kaiser teremos os valores a seguir (note que há várias respostas corretas para esta pergunta): \[\begin{align*} \omega_p &= \frac{8\times 2\pi}{9\times 4}= \frac{4}{9}\pi, & \omega_r &= 2\pi-\omega_p = \frac{5}{9}\pi. \end{align*}\] Neste caso, temos \(\Delta\omega = \pi/9\), e \[ A = 20\log_{10}(\min(\delta_p,\delta_r)) \]
= 4π/9
ωp = 5π/9
ωr = π/4
ωc = ωr - ωp
Δω = 0.001
δp = 10^(-70/20)
δr = -20log10(min(δp, δr))
A mkdn("``\\delta_r = $(rd(δr; d=7))``, ``A = $A``")
\(\delta_r = 0.0003162\), \(A = 70.0\)
= ceil(Int, (A-8)/2.285Δω + 1) N
79
O parâmetro de forma \(\beta\) do filtro de Kalman é dado pela expressão
if A < 21
= 0
β elseif A <= 50
= 0.5842(A-21)^0.4 + 0.07886(A-21)
β else
= 0.1102(A-8.7)
β end
6.75526
Deste modo, o filtro fica
= (N-1)/2
Lf = 0:N-1
n = (ωc/π) * sinc.(ωc/π * (n .- Lf))
hd = kaiser(N, β/π)
wk = hd .* wk
h = range(0, π, length = 500)
ω = freqresp(PolynomialRatio(h, [1]), ω)
H plot(ω/π, abs.(H), lw = 2, xlabel = L"\omega/\pi", label = L"|H(e^{j\omega})|")
[2,5pt] Tem-se disponível um conversor A/D de \(6\) bits capaz de operar a uma taxa de amostragem de até \(50\)MHz. Qual é a precisão máxima que seria possível conseguir usando sobreamostragem sem realimentação (como visto em aula) para um sinal de música com banda até \(f_{\max}=20\)kHz?
O valor máximo de da taxa de sobreamostragem \(M\) neste caso é
= 40_000 # fa = 2fmax
fa = 50_000_000
fb = fb//fa M
1250//1
A taxa de sobreamostragem define a redução do ruído de quantização pela fórmula \[ \sigma_{6\text{ bits}}^2 = \frac{2^{-2\times 6}}{3} = \frac{1}{M}\frac{2^{-2\times B}}{3}, \] e portanto \[ B = 6 + \frac{1}{2}\log_2(M), \] ou seja,
= 6 + 0.5*log2(M) B
11.143856189774723
mkdn("A precisão máxima conseguida é então equivalente a um conversor A/D usando ``B = $(rd(B))`` bits.")
A precisão máxima conseguida é então equivalente a um conversor A/D usando \(B = 11.14\) bits.
[2,0 pt] Um filtro de duas dimensões separável é tal que \(h[n_1, n_2] = h_1[n_1] h_2[n_2]\).
[1,0 pt] Mostre pela definição que \(H(\omega_1, \omega_2)\) também é separável.
Pela definição, \[\begin{align*} H(\omega_1, \omega_2) &= \sum_{n_1=-\infty}^\infty \sum_{n_2=-\infty}^\infty h[n_1, n_2] e^{-j\omega_1 n_1}e^{-j\omega_2 n_2}= \sum_{n_1=-\infty}^\infty \sum_{n_2=-\infty}^\infty h_1[n_1] h_2[n_2] e^{-j\omega_1 n_1}e^{-j\omega_2 n_2}\\ &= \sum_{n_1=-\infty}^\infty h_1[n_1] e^{-j\omega_1 n_1} \sum_{n_2=-\infty}^\infty h_2[n_2] e^{-j\omega_2 n_2} = H_1(\omega_1) H_2(\omega_2). \end{align*}\]
[1,0 pt] Imagine um filtro com resposta em frequência \[ H(\omega_1, \omega_2) = \begin{cases} 1, & \omega_1^2 + \omega_2^2 \le \pi/3,\\ 0, & \pi/3 < \omega_1^2 + \omega_2^2, |\omega_1|\le \pi, |\omega_2|\le \pi. \end{cases} \] um filtro com essas características pode ser separável? Justifique. Dica: pense em como o ganho do filtro pode variar para um valor de \(\omega_1\) fixo, à medida que \(\omega_2\) varia, e vice-versa. Pense em especial no que isso significa para os pontos em que o ganho do filtro deve ser igual a zero.
Um filtro com uma resposta assim não pode ser separável, pois uma circunferência não pode ser descrita como um produto de duas funções de uma só variável. Isto pode ser visto de maneira simples considerando os pontos em que \(H(\omega_1, \omega_2)=0\). Se o filtro fosse separável, \[ H(\hat{\omega}_1, \hat{\omega}_2)=0 \Rightarrow \begin{cases} H_1(\hat{\omega}_1) = 0 & \text{e/ou}\\ H_2(\hat{\omega}_2) = 0. \end{cases} \] Mas neste caso, todos os pontos na linha \(\omega_1=\hat{\omega}_1\) ou na coluna \(\omega_2=\hat{\omega}_2\) seriam nulos. Considere por exemplo o ponto \(\hat{\omega}_1=\hat{\omega}_2=0{,}8\pi/3\). Claramente temos \(\hat{\omega}_1^2+\hat{\omega}_2^2=2\times 0{,}8^2(\pi/3)^2>(\pi/3)^2\) (veja a figura abaixo). Neste caso, todos os pontos em ao menos uma das duas retas vermelhas teriam de ser iguais a zero.
= range(0, 2π, length = 500)
θ = π/3
r plot(r*cos.(θ), r*sin.(θ), lw = 2, xlabel = L"\omega_1",
= L"\omega_2", fill = (0, 0.2, :green), label = "",
ylabel = 1)
aspect_ratio 1 = ω̂2 = 0.8π/3
ω̂plot!([ω̂1], [ω̂2], marker = (:xcross, 8), label = "")
plot!([-1, 1], fill(0.8π/3, 2), lw = 2, label = "", color = :red)
plot!(fill(0.8π/3, 2), [-1, 1], lw = 2, label = "", color = :red)