什么是平滑,我该怎么做?
我在Matlab中有一个数组,它是语音信号的幅度谱(FFT的128点的幅度)。如何使用移动平均线对此进行平滑?据我了解,我应该采用一定数量的元素的窗口大小,取平均值,这将成为新的第一个元素。然后将窗口向右移动一个元素,取平均值即成为第二个元素,依此类推。那真的是这样吗?我不确定自己,因为如果这样做,最终结果将少于128个元素。那么它是如何工作的以及如何帮助平滑数据点呢?还是有其他方法可以使数据平滑?
编辑:链接到后续问题
什么是平滑,我该怎么做?
我在Matlab中有一个数组,它是语音信号的幅度谱(FFT的128点的幅度)。如何使用移动平均线对此进行平滑?据我了解,我应该采用一定数量的元素的窗口大小,取平均值,这将成为新的第一个元素。然后将窗口向右移动一个元素,取平均值即成为第二个元素,依此类推。那真的是这样吗?我不确定自己,因为如果这样做,最终结果将少于128个元素。那么它是如何工作的以及如何帮助平滑数据点呢?还是有其他方法可以使数据平滑?
编辑:链接到后续问题
Answers:
可以用多种方法进行平滑处理,但是从非常基本和笼统的意义上讲,这意味着您可以通过将信号元素与其相邻元素进行混合来使信号均匀。您可以稍微涂抹/模糊信号以消除噪音。例如,一种非常简单的平滑技术是将每个信号元素重新计算f(t)
为原始值的0.8,再加上每个相邻元素的0.1:
f'(t) = 0.1*f(t-1) + 0.8*f(t) + 0.1*f(t+1)
注意乘法因子或权重是如何加起来的。因此,如果信号相当恒定,则平滑不会对其产生太大影响。但是,如果信号包含突然的抖动变化,则其邻居的贡献将有助于稍微消除该噪声。
在此重新计算功能中使用的权重可以称为内核。一维高斯函数或任何其他基本内核都应针对您的情况进行处理。
一种特定的平滑示例:
上图:信号不平滑下图
:信号平滑
其他人提到了如何进行平滑处理,我想提及为什么进行平滑处理。
如果您对信号进行了适当的过采样,则从一个采样到下一个采样(采样=时间点,像素等)的变化将相对较小,并且有望获得总体上平滑的外观。换句话说,您的信号包含很少的高频,即信号成分的变化速率与采样速率相似。
但是,测量结果经常会被噪声破坏。在第一个近似中,我们通常认为噪声遵循高斯分布,均值零且具有一定的标准偏差,只需将其添加到信号顶部即可。
为了减少信号中的噪声,我们通常做出以下四个假设:噪声是随机的,在样本之间不相关,平均值为零,并且对信号进行了充分的过采样。基于这些假设,我们可以使用滑动平均滤波器。
考虑例如三个连续的样本。由于信号是高度过采样的,因此可以认为基础信号是线性变化的,这意味着三个采样之间的信号平均值将等于中间采样处的真实信号。相反,噪声的平均值为零,并且不相关,这意味着其平均值应趋于零。因此,我们可以应用三样本滑动平均滤波器,在该滤波器中,我们将每个样本替换为其自身及其两个相邻邻居之间的平均值。
当然,窗口越大,噪声平均到零的可能性就越大,但是我们对真实信号线性度的假设就越少。因此,我们必须进行权衡。试图同时兼顾两者的一种方法是使用加权平均值,在此方法中,我们给较远的样本赋予较小的权重,以便我们对较大范围内的噪声影响进行平均,而在真实信号偏离线性范围时,不会对其加权太大假设。
如何设置权重取决于噪声,信号和计算效率,当然还取决于消除噪声和切入信号之间的权衡。
请注意,最近几年做了很多工作,使我们可以放宽这四个假设中的一些假设,例如,通过设计具有可变滤波器窗口(各向异性扩散)的平滑方案,或者不真正使用窗口的方案完全(非本地方式)。