Traitement du signal avec Wolfram | Choses à essayer

Effectuez des modifications et exécutez n’importe quel morceau de code en cliquant à l’intérieur du code et en appuyant sur
+
.
Traitement et analyse des signaux. Des fonctionnalités complètes de traitement des signaux, étroitement associées à de puissants outils de calcul, de statistiques et d’apprentissage automatique, pour les étudiants et les professionnels de l’ingénierie, de la finance, de la médecine et bien plus encore.

Filtre passe-bas IIR Butterworth

Créez le prototype analogique de Butterworth d’ordre
n=3
pour un filtre à réponse impulsionnelle infinie (IIR) avec une fréquence de coupure
ω
c
=π/6
en supposant une période d’échantillonnage
T=1 
:
Exécuter
In[]:=
T=1;
ω
c
=
π
6
;n=3;​​
Ω
c
=
2.
T
Tan
ω
c
2
;​​tf=ButterworthFilterModel[{n,
Ω
c
},s]//TransferFunctionExpand//Chop
Créez le filtre numérique correspondant à l’aide d’une transformation bilinéaire :
Exécuter
In[]:=
dtf=ToDiscreteTimeModel[tf,T,z]//Chop
Visualisez le tracé de Bode du filtre :
Exécuter
In[]:=
BodePlotdtf,{0,π},


Filtrage des données avec un filtre IIR

Créez un signal sinusoïdal bruité :
Exécuter
In[]:=
sig=TableSin
3.π
128
n,{n,0,127}+RandomReal[{-0.25,0.25},128];
Définissez un filtre IIR de Butterworth :
Exécuter
In[]:=
dtf=
0.153903
3
(1.+z)
-4.70766+19.0258z-26.6767
2
z
+13.5898
3
z
1
;
Filtrez le signal bruyant :
Exécuter
In[]:=
res=RecurrenceFilter[dtf,sig,Padding->None];​​ListPlot[{sig,res}]

Filtre FIR passe-bas utilisant la méthode des fenêtres

Créez un filtre à réponse impulsionnelle finie (FIR) de longueur
L=17
avec une fréquence de coupure
ω
c
=π/6
 :
Exécuter
In[]:=
ω
c
=
π
6
;L=17;​​h=LeastSquaresFilterKernel[{"Lowpass",
ω
c
},L]
Appliquez une fenêtre de Hann à la réponse de l’échantillon unitaire :
Exécuter
In[]:=
w=Array[HannWindow,L,{-0.5,0.5}];​​fir=wh
Affichez la réponse en fréquence du filtre obtenu  :
Exécuter
In[]:=
PlotEvaluate[20Log10[Abs[ListFourierSequenceTransform[fir,ω]]]],{ω,0,π},


Filtrage des données avec un filtre FIR

Créez un signal bruyant :
Exécuter
In[]:=
sig=Table[SquareWave[n/64],{n,0,127}]+RandomReal[{-0.25,0.25},128];
Créez un filtre FIR passe-bas :
Exécuter
In[]:=
fir=LeastSquaresFilterKernel[{"Lowpass",π/6},17]Array[HannWindow,17,{-0.5,0.5}];
Filtrez le signal en utilisant
ListConvolve
 :
Exécuter
In[]:=
res=ListConvolve[fir,sig,9];​​ListPlot[{sig,res}]
De manière équivalente, filtrez le signal à l’aide de la fonction
LowpassFilter
 :
Exécuter
In[]:=
ListPlot[{sig,LowpassFilter[sig,π/6,17,HannWindow,Padding->0]}]

Spectre de puissance d’un signal DTMF

Définissez une paire de fréquences normalisées DTMF (en radians/échantillon) pour le chiffre 2 de la tonalité de numérotation :
Exécuter
In[]:=
{fp,fs}={697,1336};​​{wp,ws}=
2π
8000.
fp,
2π
8000.
fs
Créez un signal à deux tons d’une durée d’environ 200 ms :
Exécuter
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}]
Affichez le spectre de puissance :
Exécuter
In[]:=
Periodogramaudio,

La méthode de Welch calcule la moyenne des spectres de puissance des partitions lissées et superposées :
Exécuter
In[]:=
Periodogramaudio,600,300,BlackmanWindow,


Analyse du signal à l’aide d’un spectrogramme

Définissez des paires de fréquences normalisées DTMF (en radians/échantillon) pour les chiffres 9 et 1 de la tonalité de numérotation :
Exécuter
In[]:=
freqs=
2π
8000.
#[[1]],
2π
8000.
#[[2]]&/@{{852,1447},{697,1209}}
Créez un clip audio pour la séquence à deux tonalités :
Exécuter
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]
Visualisez le spectrogramme :
Exécuter
In[]:=
Spectrogramaudio,

Améliorez la résolution de la fréquence en augmentant la longueur du segment :
Exécuter
In[]:=
Spectrogramaudio,512,

Améliorez également la résolution temporelle en augmentant le chevauchement entre les segments :
Exécuter
In[]:=
Spectrogramaudio,512,64,


Traitement des séries temporelles

Obtenez des données quotidiennes sur la température. Les données ont une période d’échantillonnage de
T=1
jour ou
T=86400
secondes, ce qui donne un taux d’échantillonnage de
sr=
1
86400
échantillons par seconde :
Exécuter
In[]:=
ts=TimeSeries
Time:
01 Jan 2024
to
06 Aug 2024
Data points: 219
;
Lissez les données en appliquant un filtre passe-bas dont la fréquence de coupure est proche de la moyenne hebdomadaire :
Exécuter
In[]:=
sr=1/86400;​​DateListPlotts,LowpassFilterts,
π
6
sr,15,

Calculez et visualisez également la moyenne mensuelle approximative des émissions de gaz à effet de serre :
Exécuter
In[]:=
DateListPlotts,LowpassFilterts,
π
6
sr,15,LowpassFilterts,
π
186
sr,65,
