Wolfram 信号处理 | 应用示例

在代码中点击并按下
+
,即可编辑并运行任何代码。
信号处理与分析。全面的信号处理功能,与强大的微积分、统计学和机器学习紧密集成,适用于工程、金融、医学等领域的学生和专业人士。

低通 IIR 巴特沃斯滤波器

创建阶数
n=3
的模拟巴特沃斯原型,用于截止频率
ω
c
=π/6
、采样周期
T=1
的无限脉冲响应(IIR)滤波器:
Run
In[]:=
T=1;
ω
c
=
π
6
;n=3;​​
Ω
c
=
2.
T
Tan
ω
c
2
;​​tf=ButterworthFilterModel[{n,
Ω
c
},s]//TransferFunctionExpand//Chop
使用双线性变换创建相应的数字滤波器:
Run
In[]:=
dtf=ToDiscreteTimeModel[tf,T,z]//Chop
可视化滤波器的波特图:
Run
In[]:=
BodePlotdtf,{0,π},


使用 IIR 滤波器进行数据滤波

创建含噪声的正弦信号:
Run
In[]:=
sig=TableSin
3.π
128
n,{n,0,127}+RandomReal[{-0.25,0.25},128];
定义 IIR 巴特沃斯滤波器:
Run
In[]:=
dtf=
0.153903
3
(1.+z)
-4.70766+19.0258z-26.6767
2
z
+13.5898
3
z
1
;
对含噪信号进行滤波:
Run
In[]:=
res=RecurrenceFilter[dtf,sig,Padding->None];​​ListPlot[{sig,res}]

使用窗函数方法的低通 FIR 滤波器

创建长度
L=17
、截止频率
ω
c
=π/6
的有限脉冲响应(FIR)滤波器:
Run
In[]:=
ω
c
=
π
6
;L=17;​​h=LeastSquaresFilterKernel[{"Lowpass",
ω
c
},L]
对单位采样响应应用汉恩窗:
Run
In[]:=
w=Array[HannWindow,L,{-0.5,0.5}];​​fir=wh
显示所得滤波器的频率响应:
Run
In[]:=
PlotEvaluate[20Log10[Abs[ListFourierSequenceTransform[fir,ω]]]],{ω,0,π},


使用 FIR 滤波器进行数据滤波

创建含噪信号:
Run
In[]:=
sig=Table[SquareWave[n/64],{n,0,127}]+RandomReal[{-0.25,0.25},128];
创建低通 FIR 滤波器:
Run
In[]:=
fir=LeastSquaresFilterKernel[{"Lowpass",π/6},17]Array[HannWindow,17,{-0.5,0.5}];
使用
ListConvolve
滤波信号:
Run
In[]:=
res=ListConvolve[fir,sig,9];​​ListPlot[{sig,res}]
等效地,使用
LowpassFilter
函数滤波信号:
Run
In[]:=
ListPlot[{sig,LowpassFilter[sig,π/6,17,HannWindow,Padding->0]}]

DTMF 信号的功率谱

定义拨号音数字 2 的一对双音多频(DTMF)归一化频率(以弧度/采样为单位):
Run
In[]:=
{fp,fs}={697,1336};​​{wp,ws}=
2π
8000.
fp,
2π
8000.
fs
创建持续时间约 200 毫秒的双音信号:
Run
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}]
显示功率谱:
Run
In[]:=
Periodogramaudio,

韦尔奇方法对平滑和重叠分区的功率谱进行平均:
Run
In[]:=
Periodogramaudio,600,300,BlackmanWindow,


使用频谱图进行信号分析

定义拨号音数字 9 和 1 的 DTMF 归一化频率对(以弧度/采样为单位):
Run
In[]:=
freqs=
2π
8000.
#[[1]],
2π
8000.
#[[2]]&/@{{852,1447},{697,1209}}
为双音序列创建音频片段:
Run
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]
查看频谱图:
Run
In[]:=
Spectrogramaudio,

通过增加片段长度来提高频率分辨率:
Run
In[]:=
Spectrogramaudio,512,

此外,通过增加片段之间的重叠度来提高时间分辨率:
Run
In[]:=
Spectrogramaudio,512,64,


时间序列处理

获取每日温度数据。数据的采样周期为
T=1
天或
T=86400
秒,采样率为
sr=
1
86400
采样/秒:
Run
In[]:=
ts=TimeSeries
Time:
01 Jan 2024
to
06 Aug 2024
Data points: 219
;
通过应用截止频率近似于周平均值的低通滤波器来平滑数据:
Run
In[]:=
sr=1/86400;​​DateListPlotts,LowpassFilterts,
π
6
sr,15,

此外,计算并可视化近似月平均值:
Run
In[]:=
DateListPlotts,LowpassFilterts,
π
6
sr,15,LowpassFilterts,
π
186
sr,65,
