数字信号处理

本用户指南部分探讨了数字信号处理 (DSP) 领域中常用的函数。

卷积

conv 函数计算两个向量的卷积。卷积的计算方法是反转第二个向量,然后将其滑过第一个向量。当第二个向量滑过第一个向量时,计算两个向量的点积。这些点积被收集到第三个向量中,该向量是两个向量的卷积。

移动平均函数

在查看卷积示例之前,回顾一下 movingAvg 函数很有用。移动平均函数通过在向量上滑动窗口并在每个偏移量处计算窗口的平均值来计算移动平均值。如果这听起来类似于卷积,那是因为 movingAvg 函数涉及类似于卷积的滑动窗口方法。

下面是一个窗口大小为 5 的移动平均示例。请注意,原始向量有 13 个元素,但移动平均的结果只有 9 个元素。这是因为 movingAvg 函数只有在有完整窗口时才开始生成结果。ltrim 函数用于从原始 y 数组中修剪前四个元素,以与移动平均值对齐。

conv1

卷积平滑

也可以使用卷积计算移动平均值。在下面的示例中,conv 函数用于通过将第二个数组应用为滤波器来计算第一个数组的移动平均值。

观察结果,我们看到卷积生成了一个包含 17 个值而不是移动平均创建的 9 个值的数组。这是因为 conv 函数在第一个向量的前面和后面填充零,以便窗口大小始终为满。

conv2

我们通过使用 ltrimrtrim 函数修剪卷积结果的第一个和最后一个 4 个值来实现与 movingAvg 函数相同的结果。

下面的示例在同一张图上绘制了修剪后的卷积和移动平均值。请注意,它们完全重叠。

conv3

这演示了如何使用卷积通过在信号上滑动滤波器并在每个点计算点积来平滑信号。平滑效果是由滤波器的设计引起的。在该示例中,滤波器长度为 5,滤波器中的每个值均为 .2。此滤波器使用窗口大小为 5 计算简单的移动平均值。

使用卷积计算简单移动平均数的公式是将滤波器长度设为窗口大小,并将滤波器中的所有值设为相同,并且总和为 1。可以通过将滤波器更改为长度为 4,每个值为 .25 来计算窗口大小为 4 的移动平均数。

更改权重

有时称为内核的滤波器可以视为权重向量。在初始示例中,滤波器中的所有值具有相同的权重 (.2)。可以更改滤波器中的权重以产生不同的平滑效果。这在下面的示例中进行了演示。

在此示例中,滤波器的权重从 .1 增加到 .3。这将更多的权重放在滤波器的前面。请注意,在应用 conv 函数之前,滤波器使用 rev 函数反转。这样做是因为卷积会反转滤波器。在这种情况下,我们提前反转它,当卷积将其反转回来时,它与原始滤波器相同。

该图显示了滤波器中不同权重的效果。深蓝色线是初始数组。浅蓝色线是卷积,橙色线是移动平均数。请注意,卷积对基础数组中的移动响应更快。这是因为更多的权重被放置在滤波器的前面。

conv4

互相关

互相关用于确定两个信号之间的延迟。这是通过将一个信号滑过另一个信号并在每次偏移时计算点积来实现的。点积被收集到一个向量中,该向量表示每次偏移时的相关性。互相关向量中最高的点积是两个信号最密切相关的位置。

卷积中使用的滑动点积也可用于表示两个向量之间的互相关。表示相关性时公式中的唯一区别是第二个向量未反转

请注意,在下面的示例中,第二个向量在由 conv 函数操作之前由 rev 函数反转。conv 函数反转第二个向量,因此它将被翻转回其原始顺序以执行相关性计算,而不是卷积计算。

请注意,结果中的最高值为 217。这是两个向量具有最高相关性的点。

crosscorr

查找延迟

从互相关结果计算延迟非常简单,但可以使用名为 finddelay 的便捷函数直接查找延迟。在底层,finddelay 使用卷积数学计算互相关向量,然后计算两个信号之间的延迟。

以下是 finddelay 函数的一个示例。请注意,finddelay 函数报告了第一个和第二个信号之间的 3 个周期延迟。

delay

振荡(正弦波)

oscillate 函数生成一个周期性振荡信号,该信号可用于对正弦波进行建模和研究。

oscillate 函数采用三个参数:amplitudeangular frequencyphase,并返回一个包含正弦波 y 轴点的向量。

y 轴点从 0-127 的 x 轴序列生成。

以下是 oscillate 函数的一个示例,其中幅度为 1,角频率为 .28,相位为 1.57。

sinewave

正弦波插值和外推

oscillate 函数返回一个函数,该函数可由 predict 函数用于插值或外推正弦波。

以下示例将正弦波外推到 0-256 的 x 轴序列。

sinewave256

自相关

自相关测量信号与其自身相关程度。自相关用于确定向量是否包含信号或纯粹是随机的。

一些带有绘图的示例将有助于理解这些概念。

第一个示例只是重新审视上面外推正弦波的示例。其结果绘制在下图中。请注意,绘图中有一个结构,显然不是随机的。

sinewave256

在下一个示例中,sample 函数用于从 uniformDistribution 中绘制 256 个样本,以创建随机数据向量。其结果绘制在下图中。请注意,数据没有明确的结构,并且数据似乎是随机的。

noise

在下一个示例中,使用 ebeAdd 函数将随机噪声添加到正弦波中。其结果绘制在下图中。请注意,正弦波在噪声中被隐藏了一些。很难确定是否有结构。随着绘图变得更加密集,可能更难看到隐藏在噪声中的模式。

hidden signal

在下一个示例中,对上面显示的每个向量执行自相关,以查看自相关绘图是什么样的。

在下面的示例中,conv 函数用于对第一个向量(即正弦波)进行自相关。请注意,conv 函数只是将正弦波与其自身相关联。

该图具有非常明显的结构。当正弦波在其自身的副本上滑动时,相关性会随着强度的增加而上下移动,直到达到峰值。此峰值位于正中心,是正弦波直接对齐的点。在峰值之后,随着正弦波远离直接对齐,相关性会随着强度的降低而上下移动。

这是纯信号的自相关图。

signal autocorrelation

在下面的示例中,自相关是使用纯噪声向量执行的。请注意,自相关图与正弦波有非常不同的图。在此图中,存在一段长时间的低强度相关性,似乎是随机的。然后在中心有一个高强度相关性的峰值,其中向量直接对齐。随后是另一段长时间的低强度相关性。

这是纯噪声的自相关图。

noise autocorrelation

在下面的示例中,自相关在包含在噪声中的正弦波向量上执行。请注意,此图显示了非常明显的结构迹象,类似于纯信号的自相关图。由于噪声,相关性较弱,但相关图的形状强烈表明噪声中隐藏着潜在信号。

hidden signal autocorrelation

离散傅里叶变换

上面描述的基于卷积的函数在时域中对信号进行操作。在时域中,x 轴是时间,y 轴是在特定时间点的某个值的数量。

离散傅里叶变换将时域信号转换为频域。在频域中,x 轴是频率,y 轴是在特定频率下的累积功率。

基本原理是每个时域信号都由不同频率的一个或多个信号(正弦波)组成。离散傅里叶变换将时域信号分解为其分量频率,并测量每个频率的功率。

离散傅里叶变换有许多重要的用途。在下面的示例中,离散傅里叶变换用于确定信号是否有结构或纯随机。

复数结果

fft 函数对实数数据向量执行离散傅里叶变换。fft 函数的结果以复数形式返回。复数有两个部分,实数虚数。结果的实数部分描述了不同频率下信号的幅度。结果的虚数部分描述了相位。以下示例仅处理结果的实数部分。

fft 函数返回一个包含两行的matrix。矩阵中的第一行是复数结果的实部。矩阵中的第二行是复数结果的虚部rowAt 函数可用于访问行,以便将它们作为向量进行处理。

快速傅里叶变换示例

在第一个示例中,fft 函数在自相关示例中使用的正弦波上调用。

fft 函数的结果是一个矩阵。rowAt 函数用于返回矩阵的第一行,该行是一个包含fft 响应的实值的向量。

fft 响应的实值绘图如下所示。请注意,绘图的两侧有两个峰值。该绘图实际上显示了一个镜像响应。绘图的右侧是左侧的精确镜像。当对实数而不是复数数据运行fft 时,这是预期的。

还要注意,fft 已在一个峰值中积累了显着的能量。这是与正弦波的特定频率相关的能量。绘图中绝大多数频率几乎没有与之相关的能量。此fft 显示了一个具有非常低噪声水平的清晰信号。

signal fft

在第二个示例中,fft 函数在与自相关示例中使用的类似的随机数据向量上调用。fft 响应的实值绘图如下所示。

请注意,在此响应中没有明显的峰值。相反,所有频率都积累了随机的能量级。此fft 没有显示信号的明显迹象,似乎是噪声。

noise fft

在第三个示例中,fft 函数在自相关示例中用于隐藏在噪声中的同一信号上调用。fft 响应的实值绘图如下所示。

请注意,有两个清晰的镜像峰,位置与纯信号的fft相同。但现在频率上也有相当多的噪声。fft已找到信号,并且还显示信号中存在相当多的噪声。

hidden signal fft