AnyMath中的信号卷积
导言
卷积是数字信号处理的基本操作之一。 它描述了线性静止系统对任意输入影响的响应,广泛用于滤波器分析、通信信道建模、图像处理和自动控制任务。
在数学上,连续信号的卷积运算写成积分:
而对于离散序列作为总和:
运算的含义如下:对其中一个序列进行镜像,相对于另一个进行移位,与之逐元素相乘,并将乘法的结果求和。 在每个步骤重复移位,直到序列不再重叠。
在这个例子中,考虑了Julia环境中两个信号的卷积的数值实现。:
*脉冲响应 是区间上的线性递减函数 与;
*输入信号 -间隔中单个幅度的矩形脉冲 和。
工作的目的是演示离散卷积的逐步实现,正确考虑采样步骤并将原始信号与结果一起可视化。
初始数据
初始化时域、脉冲响应和输入信号函数:
In [ ]:
dt = 0.01 # 时间步长
t1 = 0:dt:2
ft = 2 .- t1 # 脉冲响应
t2 = -2:dt:2
gt = 3 .* ones(length(t2)) # 的输入信号
卷积运算
让我们将AnyMathDSP库中的卷积运算应用于脉冲响应和输入信号:
In [ ]:
yt = dt .* EngeeDSP.Functions.conv(ft, gt) # 应用卷积运算
ytx = dt .* (1:length(yt)) .+ first(t2)
Out[0]:
预期的结果是梯形输出信号:序列重叠区域的上升,平顶和对称下降。 这种形式是自然的:具有线性递减函数的矩形脉冲的卷积给出分段线性响应。
可视化
让我们绘制脉冲响应,输入和输出信号。:
In [ ]:
# 脉冲响应、输入和输出信号图
p1 = plot(t1, ft, color=:red, linewidth=3, title="脉冲响应", xlabel="", ylabel="的振幅", grid=true, xlim=(-2, 2), legend=false)
p2 = plot(t2, gt, color=:green, linewidth=3, title="的输入信号", xlabel="时间,从", ylabel="的振幅", grid=true, ylim=(0, 3.5), legend=false)
p3 = plot(ytx, yt, color=:blue, linewidth=3, title="的输出信号", xlabel="时间,从", ylabel="的振幅", grid=true, legend=false)
plot(p1, p2, p3)
Out[0]:
已经执行了离散卷积操作。
结论
在这个例子中,实现了两个序列的离散卷积。 输出信号具有梯形形状,这证实了算法的正确性并考虑了采样步骤。 该示例显示了如何从简单信号中形成更复杂的系统响应。 卷积在实践中得到了广泛的应用:在数字滤波器、通信信道上的信号传输、雷达、图像和声音处理、医疗诊断、控制系统和卷积神经网络中。
AnyMath拥有用于此类任务的AnyMathDSP库,具有卷积,滤波和光谱分析的现成功能。 这使您可以专注于算法的逻辑,而无需手动执行计算。 使用 EngeeDSP.Functions.conv 脚本证实了这一点。 这个例子可以作为卷积的一般说明,也可以作为AnyMath中更复杂信号处理任务的起点。