如何用MATLAB去除局部场电位数据中的尖峰?

gkl3eglg  于 2023-03-19  发布在  Matlab
关注(0)|答案(1)|浏览(289)

试图工作的数据,这是记录和有一些可怕的尖锐尖峰目前的数据。不确定这是否是一个电线的问题。
我已经消除了直流偏移,带通滤波器0. 5 - 150赫兹和陷波滤波的电力线噪声。我尝试了几种滤波器类型,但我似乎找不到一个解决这个丑陋的LFP。
目前,我正在分割数据,并在去除噪声数据后连接LFP。
我附上的图像是从一个频道。同样的噪音发生在每个频道。
我试过中值滤波器,移动平均,谐波或陷波滤波器,小波分解,savitzky-golay滤波器。很多这些滤波器删除了大量的数据或丢失数据的波形。Example of channel with noisy data

dhxwm5r4

dhxwm5r41#

假设“干净数据”呈正态分布,并且尖峰偏离幅度显著,我们可以应用以下阶段:

  • 计算数据的中值滤波(假设中值滤波结果不包括尖峰)。
medA = medfilt1(A);
  • 计算数据与中值滤波数据之间的绝对差值。

与正常数据相比,absD中的尖峰将具有较大值。

absD = abs(A - medA);
  • 定义某个阈值,高于该阈值的absD中的值被视为尖峰。

我们可以将阈值定义为medA4*sigma(4*STD)。
注:阈值可能需要一些校准,以包括尖峰和排除数据。

sigma = std(medA);
 thresh = 4*sigma;
  • 将spikes标记为absD > thresh所在的元素,并将“spikes”替换为medA中的值:
spikesA = absD > thresh;
 cleanA = A;
 cleanA(spikesA) = medA(spikesA);

代码样本(随机数据):

% Create random input 
A = randn(1, 10000);

% Add some spikes.
A(100) = 5;
A(1000) = -7;
A(4000) = 6;
A(7000) = 15;

figure;plot(A);grid on;title('A');

medA = medfilt1(A);  % Apply median filter. In case there are few spikes next to each other, use medfilt1(A, 5) or medfilt1(A, 7)...
absD = abs(A - medA);  % Different of each element from it's median filtered value.

figure;plot(absD);grid on;title('absD');

sigma = std(medA);  % Compute standard deviation after median filtered (STD without the spikes)
thresh = 4*sigma;  % Define a threshold that above it data is considered a spikes - 4*sigma my need some calibration.

spikesA = absD > thresh;  % Logical array with true where difference from median is above thresh

cleanA = A;
cleanA(spikesA) = medA(spikesA);  % Replace the spikes with median filtered values.

figure;plot(cleanA);grid on;title('cleanA');

A(加标数据):

absD(与“正常数据”相比,尖峰值较大):

cleanA(用medA中的值替换尖峰):

相关问题