Wolfram Processamento de Sinais | Experimente!

Edite e execute qualquer trecho de código clicando dentro do código e pressionando
+
.
Análise & Processamento de Sinais. Processamento de sinais abrangente, integrado com cálculo, estatística e machine learning, para estudantes e profissionais de engenharia, finanças, medicina, entre outros.

Filtro Butterworth IIR de Baixa Passagem

Crie o protótipo analógico de Butterworth de ordem
n=3
para um filtro de resposta infinita ao impulso (IIR) com frequência de corte
ω
c
=π/6
, assumindo um período de amostragem
T=1
:
Executar
In[]:=
T=1;
ω
c
=
π
6
;n=3;​​
Ω
c
=
2.
T
Tan
ω
c
2
;​​tf=ButterworthFilterModel[{n,
Ω
c
},s]//TransferFunctionExpand//Chop
Crie o filtro digital correspondente usando transformação bilinear:
Executar
In[]:=
dtf=ToDiscreteTimeModel[tf,T,z]//Chop
Visualize o diagrama de Bode do filtro:
Executar
In[]:=
BodePlotdtf,{0,π},


Filtragem de Dados com um Filtro IIR

Crie um sinal senoidal com ruído:
Executar
In[]:=
sig=TableSin
3.π
128
n,{n,0,127}+RandomReal[{-0.25,0.25},128];
Defina um filtro Butterworth IIR:
Executar
In[]:=
dtf=
0.153903
3
(1.+z)
-4.70766+19.0258z-26.6767
2
z
+13.5898
3
z
1
;
Filtre o sinal ruidoso:
Executar
In[]:=
res=RecurrenceFilter[dtf,sig,Padding->None];​​ListPlot[{sig,res}]

Filtro FIR de Baixa Passagem Usando o Método da Janela

Crie um filtro de resposta finita ao impulso (FIR) de comprimento
L=17
com frequência de corte
ω
c
=π/6
:
Executar
In[]:=
ω
c
=
π
6
;L=17;​​h=LeastSquaresFilterKernel[{"Lowpass",
ω
c
},L]
Aplique uma janela de Hann à resposta ao impulso unitário:
Executar
In[]:=
w=Array[HannWindow,L,{-0.5,0.5}];​​fir=wh
Mostre a resposta em frequência do filtro resultante:
Executar
In[]:=
PlotEvaluate[20Log10[Abs[ListFourierSequenceTransform[fir,ω]]]],{ω,0,π},


Filtragem de Dados com um Filtro FIR

Crie um sinal ruidoso:
Executar
In[]:=
sig=Table[SquareWave[n/64],{n,0,127}]+RandomReal[{-0.25,0.25},128];
Crie um filtro FIR de baixa passagem:
Executar
In[]:=
fir=LeastSquaresFilterKernel[{"Lowpass",π/6},17]Array[HannWindow,17,{-0.5,0.5}];
Filtre o sinal usando
ListConvolve
:
Executar
In[]:=
res=ListConvolve[fir,sig,9];​​ListPlot[{sig,res}]
Alternativamente, filtre o sinal usando a função
LowpassFilter
:
Executar
In[]:=
ListPlot[{sig,LowpassFilter[sig,π/6,17,HannWindow,Padding->0]}]

Espectro de Potência de um Sinal DTMF

Defina um par de frequências normalizadas de múltiplos tons de duas frequências (DTMF) (em radianos/amostra) para o dígito de tom de discagem 2:
Executar
In[]:=
{fp,fs}={697,1336};​​{wp,ws}=
2π
8000.
fp,
2π
8000.
fs
Crie um sinal de tom duplo com duração de aproximadamente 200 ms:
Executar
In[]:=
dtmf=Table[Sin[wpn]+Sin[wsn],{n,0,1799}]+RandomReal[{-0.25,0.25},1800];​​audio=AudioPad[Audio[dtmf,SampleRate8000],{0.02,0.02}]
Exiba o espectro de potência:
Executar
In[]:=
Periodogramaudio,

O método de Welch calcula a média dos espectros de potência de partições suavizadas e sobrepostas:
Executar
In[]:=
Periodogramaudio,600,300,BlackmanWindow,


Análise de Sinal Usando um Espectrograma

Defina pares de frequências normalizadas DTMF (em radianos/amostra) para os dígitos de tom de discagem 9 e 1:
Executar
In[]:=
freqs=
2π
8000.
#[[1]],
2π
8000.
#[[2]]&/@{{852,1447},{697,1209}}
Crie um clipe de áudio com a sequência de tons duplos:
Executar
In[]:=
dtmf=(Table[Sin[#[[1]]n]+Sin[#[[2]]n],{n,0,1799}]+RandomReal[{-0.25,0.25},1800]&)/@freqs;​​audio=AudioJoin[AudioPad[Audio[#,SampleRate8000],{0.01,0.01}]&/@dtmf]
Visualize o espectrograma:
Executar
In[]:=
Spectrogramaudio,

Melhore a resolução em frequência aumentando o comprimento do segmento:
Executar
In[]:=
Spectrogramaudio,512,

Melhore a resolução no tempo aumentando a sobreposição entre segmentos:
Executar
In[]:=
Spectrogramaudio,512,64,


Processamento de Séries Temporais

Obtenha dados diários de temperatura. Os dados têm um período de amostragem de data
T=1
dia ou
T=86400
segundos, resultando em uma taxa de amostragem de
sr=
1
86400
amostras por segundo:
Executar
In[]:=
ts=TimeSeries
Time:
01 Jan 2024
to
06 Aug 2024
Data points: 219
;
Suavize os dados aplicando um filtro de baixa passagem com uma frequência de corte aproximando a média semanal:
Executar
In[]:=
sr=1/86400;​​DateListPlotts,LowpassFilterts,
π
6
sr,15,

Além disso, calcule e visualize a média mensal aproximada:
Executar
In[]:=
DateListPlotts,LowpassFilterts,
π
6
sr,15,LowpassFilterts,
π
186
sr,65,
