Matlab - 信号噪声消除

时间:2011-07-29 13:14:17

标签: matlab signal-processing wavelet

我有一个数据向量,其中包含-20 20范围内的整数。

Bellow是一个带有值的图:

enter image description here

这是来自矢量数据的96个元素的样本。大多数元素位于区间-2,2,如上图所示。

我想消除数据中的噪音。我想消除低振幅峰值,并保持高振幅峰值,即峰值像指数74那样。

基本上,我只想增加高振幅峰值和低振幅峰值之间的对比度,以及是否可以消除低振幅峰值。

你可以建议我这样做吗?

我尝试了mapstd功能,但问题在于它还会使高振幅峰值正常化。

我在考虑使用小波变换工具箱,但我不知道如何从小波分解系数中重建数据。

你能建议我这样做吗?

5 个答案:

答案 0 :(得分:9)

检测异常值的一种方法是使用three standard deviation rule。一个例子:

%# some random data resembling yours
x = randn(100,1);
x(75) = -14;
subplot(211), plot(x)

%# tone down the noisy points
mu = mean(x); sd = std(x); Z = 3;
idx = ( abs(x-mu) > Z*sd );         %# outliers
x(idx) = Z*sd .* sign(x(idx));      %# cap values at 3*STD(X)
subplot(212), plot(x)

enter image description here


编辑:

我似乎误解了这里的目标。如果你想做相反的事情,可能会这样:

%# some random data resembling yours
x = randn(100,1);
x(75) = -14; x(25) = 20;
subplot(211), plot(x)

%# zero out everything but the high peaks
mu = mean(x); sd = std(x); Z = 3;
x( abs(x-mu) < Z*sd ) = 0;
subplot(212), plot(x)

enter image description here

答案 1 :(得分:7)

如果仅用于演示目的,并且您实际上不会将这些缩放值用于任何事情,我有时希望通过以下方式增加对比度:

% your data is in variable 'a'
plot(a.*abs(a)/max(abs(a)))

编辑:因为我们发布图片,所以这是我的(之前/之后): enter image description here

答案 2 :(得分:6)

您可以尝试拆分窗口过滤器。如果x是您当前的样本,则过滤器将类似于:

k = [L L L L L L 0 0 0 x 0 0 0 R R R R R R]

对于每个样本x,您在左侧(L)平均一段周围样本,在右侧平均一段周围样本。如果你的样本是正面的和负面的(你的样本),你应该采取腹肌。价值第一。然后,将样本x除以这些周围样本的平均值。

y[n] = x[n] / mean(abs(x([L R])))

每次执行此操作时,峰值都会突出显示,噪音也会变平。您可以执行多次传递以增加效果。它对这些波段的宽度选择有些敏感,但可以工作。例如:

before

两遍:

after

答案 3 :(得分:3)

实际需要的是某种压缩来扩展数据,即:-2到2之间的值按某个因子缩放,其他所有因素都按另一个因子缩放。实现这一目标的一种粗略方法是将所有小值都归零,即

x = randn(1,100)/2; x(50) = 20; x(25) = -15; % just generating some data
threshold = 2;
smallValues = (abs(x) <= threshold);
y = x;
y(smallValues) = 0;
figure; 
plot(x,'DisplayName','x'); hold on; 
plot(y,'r','DisplayName','y'); 
legend show;

请注意,这不是一个非常非线性的操作(例如,当您希望峰值为2.1和1.9时,它们会产生非常不同的行为:一个将被移除,另一个将被保留)。因此,对于显示,这可能就是您所需要的,进一步处理可能取决于您要执行的操作。

enter image description here

答案 4 :(得分:2)

为了消除低振幅峰值,您将把所有低振幅信号等同于噪声并忽略。

如果您有任何先验知识,请使用它。

如果你的信号是a,那么

a(abs(a)<X) = 0

其中X是噪音的最大预期大小。

如果你想获得幻想,然后“动态”找到它,那么使用3的kmeans。它在统计工具箱中,在这里:

http://www.mathworks.com/help/toolbox/stats/kmeans.html

或者,您可以对数据的绝对值使用Otsu的方法,并使用回溯。

注意,我在这个帖子上看到的这些和其他所有技术都假设您正在进行后期处理。如果您正在实时进行此处理,则必须进行更改。