我有多个数据段,看起来与图中的数据段相似:
信号有一定的稳定性,然后在一段时间内信号下降,然后信号再次稳定。我正在尝试找到一种方法来识别数据普遍减少的间隔(图像中红线之间的区域),但数据中的噪声使这对我来说很困难。
我尝试使用方差以及简单移动平均线和指数加权移动平均线的比较来找到下降开始和结束的点,但噪音把事情搞乱了,所以我的主要问题是对一个好的建议有什么建议平滑噪音的方法,或者如果有关于如何识别这些递减间隔的任何建议,那就更好了。
总的来说,你有三个阶段
我们需要用数学方法来表征这些特征,我们可以通过多种方式来实现,但比较直观的一种是使用滚动标准差
n
样本相比标准偏差小n
的标准偏差较大n
样本相比标准偏差小我们可以使用循环轻松计算滚动标准差。
首先,一些虚拟数据:
rng(0); % fix random seed for repeatable example
N = 1e3; % number of samples
x = linspace(0,1,N); % fixed rate x axis data
y = rand(1,N)*0.4 + (x>0.5)*0.5; % noisy data with a step change in middle
y = movmean( y, N*0.08 ); % smooth out the data a bit
现在计算标准差。开发人员。在某个窗户上方。 此窗口的长度需要根据您的数据进行调整,具体取决于您的步长变化相对于采样率的突然程度。
n = 50; % window size
sd = zeros(size(y));
for ii = (n/2):(N-n/2)
% std dev over 'n' samples, centred around the iith point
sd(ii) = std(y(ii-(n/2)+1:ii+(n/2)));
end
使用简单的阈值还需要调整您的数据,我们可以识别高变化的区域:
thrDetect = 0.05; % threshold to detect change from std. dev.
bDetect = sd > thrDetect; % Boolean detection array
绘图,我们可以检查这个作品:
figure(1); clf; subplot( 2, 1, 1 ); hold on;
plot( x, y, '.', 'displayname', 'data' );
plot( x, bDetect, 'k', 'displayname', 'std. dev. over threshold' );
legend('show', 'location', 'best'); grid on;
subplot( 2, 1, 2 ); hold on;
plot( x, sd, 'displayname', 'Rolling std. dev' );
yline( thrDetect, 'displayname', 'threshold' );
legend('show', 'location', 'best'); grid on;