我在Matlab中有一个数组,它是语音信号的幅度谱(FFT的128点的幅度)。如何使用移动平均线对此进行平滑?据我了解,我应该采用一定数量的元素的窗口大小,取平均值,这将成为新的第一个元素。然后将窗口向右移动一个元素,取平均值即成为第二个元素,依此类推。真的是这样吗?我不确定自己,因为如果这样做,最终结果将少于128个元素。那么,它是如何工作的以及如何帮助平滑数据点呢?还是有其他方法可以使数据平滑?
编辑:链接至后续问题
#1 楼
可以用多种方法进行平滑处理,但是用非常基本和笼统的术语来说,这意味着您可以通过将信号的各个元素与其相邻元素进行混合来使信号均匀。您可以稍微涂抹/模糊信号以消除噪音。例如,一种非常简单的平滑技术是,将每个信号元素f(t)
重新计算为原始值的0.8,再加上每个相邻元素的0.1:f'(t) = 0.1*f(t-1) + 0.8*f(t) + 0.1*f(t+1)
注意乘法因子或权重是如何加起来的。因此,如果信号相当恒定,则平滑不会对其进行太大改变。但是,如果信号包含突然的抖动变化,则其邻居的贡献将有助于稍微消除该噪声。
在此重新计算功能中使用的权重可以称为内核。一维高斯函数或任何其他基本内核都适合您的情况。
一种特殊类型的平滑处理的好例子:
上面:信号不平滑下面:信号平滑
一些内核的示例:
评论
$ \ begingroup $
这是加权移动平均线吗?称为窗口大小为3的窗口吗?那么第一个和最后一个元素呢?如果我有一个由128个元素组成的数组,而我想使用一个由16个或32个元素组成的窗口,该如何修改呢?
$ \ endgroup $
–user13267
2012年10月15日下午6:54
$ \ begingroup $
@ user13267:是的,您可以说平滑内核是加权移动平均值。如果您使用统一内核(请参见第二张图片),那只是一个简单的移动平均值。您对窗口的大小是正确的。为了处理边缘,有三种基本方法:1)对数据进行零填充,2)重复最后一个值,3)镜像信号。在所有情况下,您都需要伪装一些数据,以使内核不会陷入虚无。
$ \ endgroup $
– Junuxx
2012年10月15日7:00
$ \ begingroup $
填充零不会算作虚无吗?在移动平均过程结束时,我的新“平均”数据集应与原始数据集具有相同数量的数据,不是吗?那么,如果我在开始或结尾处将其零填充,或者重复最后一个数据,它是否会在数组边缘偏移平均值?镜像信号对数据数量有何帮助?是否有任何简单的教程可以显示32个数据点和4或5的窗口大小如何进行处理?
$ \ endgroup $
–user13267
2012年10月15日在8:21
$ \ begingroup $
如果希望平滑后的数据集具有与原始数据集相同的长度,则必须在端点处“组成”数据。您为如何创建数据所做的任何选择都会以某种方式使平均值产生偏差。将越界数据视为真实数据集的镜像(即,假设样本N + 1与N-1相同,N + 2 = N-2等)将保留该数据的频谱特征。信号零端部分,而假设零或非零重复将使所有频率似乎都在端部滚降。
$ \ endgroup $
–拉塞尔·博罗戈夫(Russell Borogove)
2012年10月15日18:17
#2 楼
除了Junuxx的好答案之外,我还想说几点注意事项。属性。我的最爱之一是中值过滤器。这是非线性滤波器的示例。它具有一些有趣的特性,它可以保留“边缘”,并且在大噪声下也非常健壮。
如果您有一个模型,您的信号如何表现出卡尔曼滤波器,就值得一看。它的平滑实际上是基于观察的信号贝叶斯最大似然估计。
#3 楼
平滑意味着使用来自相邻样本的信息以改变相邻样本之间的关系。对于有限向量,在末端,一侧没有相邻信息。您的选择是:不对端点进行平滑/过滤,接受较短的结果平滑向量,对数据进行补偿和平滑(取决于两端预测的准确性/有用性),或者在以下位置使用不同的非对称平滑内核两端(最终会缩短信号中的信息内容)。#4 楼
您可以找到完整的matlab代码,以平滑各种长度的抽头的移动平均滤波器。www.gaussianwaves.com/2010/11/moving-average-filter-ma-filter-2/
#5 楼
其他人已经提到了如何进行平滑处理,我想提到为什么进行平滑处理。如果您对信号进行适当的过采样,则从一个采样到下一个采样的信号变化相对较小(采样=时间点,像素,等等),并且期望其具有整体光滑的外观。换句话说,您的信号包含的高频很少,即信号分量的变化速率与采样速率相似。在第一个近似值中,我们通常认为噪声遵循高斯分布,均值为零,并且具有一定的标准偏差,只需将其添加到信号顶部即可。
为了减少信号中的噪声,我们通常做出以下四个假设:噪声是随机的,在样本之间不相关,平均值为零,并且对信号进行了充分的过采样。基于这些假设,我们可以使用滑动平均滤波器。例如,请考虑三个连续的样本。由于信号是高度过采样的,因此可以认为基础信号是线性变化的,这意味着三个采样之间的信号平均值将等于中间采样处的真实信号。相反,噪声的平均值为零,并且不相关,这意味着其平均值应趋于零。因此,我们可以应用一个三样本滑动平均滤波器,在该滤波器中,我们将每个样本替换为其自身及其两个相邻邻居之间的平均值。
当然,我们制作的窗口越大,越多噪声将平均为零,但是我们对真实信号线性度的假设较少。因此,我们必须进行权衡。试图同时兼顾两者的一种方法是使用加权平均值,在此方法中,我们给较远的样本赋予较小的权重,以便对较大范围内的噪声影响进行平均,而在真实信号与线性度偏离较大的位置时,不要对其加权太大假设。
如何设置权重取决于噪声,信号和计算效率,当然还取决于消除噪声和切入信号之间的权衡。
请注意,在过去的几年中,已经做了很多工作来使我们放宽这四个假设中的一些假设,例如,通过设计具有可变滤波器窗口(各向异性扩散)的平滑方案,或者根本不使用窗口的方案(非本地方式)。
评论
对于一个频谱,您可能希望对多个频谱(在时间维度上)进行平均,而不是沿单个频谱的频率轴进行移动平均值@endolith都是有效的技术。频域中的平均时间(有时称为丹妮尔周期图)与时域中的窗口化相同。对多个周期图(“光谱”)求平均是为了模仿真实周期图(称为韦尔奇周期图)所需的总体平均。同样,就语义而言,我认为“平滑”是非因果的低通滤波。请参阅Kalman滤波与Kalman平滑,Wiener滤波与Wiener平滑等。这里有一个很重要的区别,它与实现有关。