Wolfram Procesamiento de señales | Ejemplos a probar

Edite y ejecute cualquier pieza de código haciendo clic dentro del código y presionando
+
.
Procesamiento y análisis de señales. Capacidades completas de procesamiento de señales, estrechamente integradas con cálculo, estadísticas y aprendizaje automático, para estudiantes y profesionales en ingeniería, finanzas, medicina y más.

Filtro IIR Butterworth de paso bajo

Cree el prototipo analógico de Butterworth de orden
n=3
para un filtro de respuesta infinita al impulso (IIR) con frecuencia de corte
ω
c
=π/6
asumiendo un período de muestreo
T=1
:
Ejecutar
In[]:=
T=1;
ω
c
=
π
6
;n=3;​​
Ω
c
=
2.
T
Tan
ω
c
2
;​​tf=ButterworthFilterModel[{n,
Ω
c
},s]//TransferFunctionExpand//Chop
Cree el filtro digital correspondiente mediante transformación bilineal:
Ejecutar
In[]:=
dtf=ToDiscreteTimeModel[tf,T,z]//Chop
Visualice la representación de Bode del filtro:
Ejecutar
In[]:=
BodePlotdtf,{0,π},


Filtrado de datos mediante un filtro IIR

Cree una señal sinusoidal con ruido:
Ejecutar
In[]:=
sig=TableSin
3.π
128
n,{n,0,127}+RandomReal[{-0.25,0.25},128];
Defina un filtro IIR Butterworth:
Ejecutar
In[]:=
dtf=
0.153903
3
(1.+z)
-4.70766+19.0258z-26.6767
2
z
+13.5898
3
z
1
;
Filtre la señal ruidosa:
Ejecutar
In[]:=
res=RecurrenceFilter[dtf,sig,Padding->None];​​ListPlot[{sig,res}]

Filtro FIR de paso bajo usando el método de las ventanas

Cree filtro de respuesta finita al impulso (FIR) de longitud
L=17
con frecuencia de corte
ω
c
=π/6
:
Ejecutar
In[]:=
ω
c
=
π
6
;L=17;​​h=LeastSquaresFilterKernel[{"Lowpass",
ω
c
},L]
Aplique una ventana de Hann a la respuesta al impulso unitario:
Ejecutar
In[]:=
w=Array[HannWindow,L,{-0.5,0.5}];​​fir=wh
Muestre la respuesta de frecuencia del filtro resultante:
Ejecutar
In[]:=
PlotEvaluate[20Log10[Abs[ListFourierSequenceTransform[fir,ω]]]],{ω,0,π},


Filtrado de datos mediante un filtro FIR

Cree una señal ruidosa:
Ejecutar
In[]:=
sig=Table[SquareWave[n/64],{n,0,127}]+RandomReal[{-0.25,0.25},128];
Cree un filtro FIR de paso bajo:
Ejecutar
In[]:=
fir=LeastSquaresFilterKernel[{"Lowpass",π/6},17]Array[HannWindow,17,{-0.5,0.5}];
Filtre la señal usando
ListConvolve
:
Ejecutar
In[]:=
res=ListConvolve[fir,sig,9];​​ListPlot[{sig,res}]
Equivalentemente, filtre la señal usando la función
LowpassFilter
:
Ejecutar
In[]:=
ListPlot[{sig,LowpassFilter[sig,π/6,17,HannWindow,Padding->0]}]

Espectro de potencia de una señal DTMF

Defina un par de frecuencias de marcación por tonos (DTMF) normalizadas (en radianes/muestra) para el dígito de tono de marcación 2:
Ejecutar
In[]:=
{fp,fs}={697,1336};​​{wp,ws}=
2π
8000.
fp,
2π
8000.
fs
Cree una señal de doble tono de aproximadamente 200 ms de duración:
Ejecutar
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}]
Muestre el espectro de potencia:
Ejecutar
In[]:=
Periodogramaudio,

El método de Welch promedia espectros de potencia de particiones suavizadas y superpuestas:
Ejecutar
In[]:=
Periodogramaudio,600,300,BlackmanWindow,


Análisis de señales usando un espectrograma

Defina pares de frecuencias DTMF normalizadas (en radianes/muestra) para los dígitos de tono de marcación 9 a 1:
Ejecutar
In[]:=
freqs=
2π
8000.
#[[1]],
2π
8000.
#[[2]]&/@{{852,1447},{697,1209}}
Cree un clip de audio para la secuencia de doble tono:
Ejecutar
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]
Revise el espectrograma:
Ejecutar
In[]:=
Spectrogramaudio,

Mejore la resolución de frecuencia aumentando la longitud del segmento:
Ejecutar
In[]:=
Spectrogramaudio,512,

Adicionalmente, mejore la resolución de tiempo aumentando la 0superposición entre segmentos:
Ejecutar
In[]:=
Spectrogramaudio,512,64,


Procesamiento de series temporales

Obtenga datos de temperatura diaria. Los datos tienen un período de muestreo de
T=1
día o
T=86400
segundos, proporcionando una tasa de muestreo de
sr=
1
86400
muestras por segundo:
Ejecutar
In[]:=
ts=TimeSeries
Time:
01 Jan 2024
to
06 Aug 2024
Data points: 219
;
Suavice los datos aplicando un filtro de paso bajo con una frecuencia de corte que aproxime un promedio semanal:
Ejecutar
In[]:=
sr=1/86400;​​DateListPlotts,LowpassFilterts,
π
6
sr,15,

Adicionalmente, calcule y visualice al promedio mensual aproximado:
Ejecutar
In[]:=
DateListPlotts,LowpassFilterts,
π
6
sr,15,LowpassFilterts,
π
186
sr,65,
