8

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

波纹管是一个带有值的图:

在此处输入图像描述

这是来自矢量数据的 96 个元素的样本。从上图中可以看出,大部分元素位于区间 -2、2 中。

我想消除数据中的噪音。我想消除低幅度峰值,并保持高幅度峰值,即像索引 74 处的峰值。

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

你能建议我这样做吗?

我已经尝试过mapstd函数,但问题是它也会使高振幅峰值正常化。

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

你能推荐我这样做的方法吗?

4

5 回答 5

9

检测异常值的一种方法是使用三标准偏差规则。一个例子:

%# 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)

在此处输入图像描述


编辑:

看来我误解了这里的目标。如果你想做相反的事情,也许是这样的:

%# 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)

在此处输入图像描述

于 2011-07-29T13:58:00.703 回答
7

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

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

编辑:因为我们发布图片,这是我的(之前/之后): 在此处输入图像描述

于 2011-07-29T13:27:25.023 回答
6

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

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

对于每个样本 x,您平均左侧 (L) 的一组周围样本和右侧的一组周围样本。如果你的样本是阳性和阴性的(就像你的那样),你应该做 abs。价值第一。然后将样本 x 除以这些周围样本的平均值。

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

每次执行此操作时,峰值都会加重,噪音会变平。你可以做多遍来增加效果。它对这些波段宽度的选择有些敏感,但可以工作。例如:

前

两次通行证:

后

于 2011-07-29T14:46:49.603 回答
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 时,它们会产生非常不同的行为:一个将被删除,另一个将被保留)。因此,对于显示,这可能就是您所需要的,对于进一步处理,它可能取决于您要执行的操作。

在此处输入图像描述

于 2011-07-29T14:05:37.130 回答
2

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

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

如果你的信号是a,那么

a(abs(a)<X) = 0

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

如果您想花哨,然后“即时”找到它,请使用 3 的 kmeans。它在统计工具箱中,在这里:

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

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

请注意,我在此线程上看到的这些以及所有其他技术都是假设您正在进行后期处理。如果您正在实时进行此处理,那么事情将不得不改变。

于 2011-07-29T15:33:39.713 回答