Anhang 1 zur Originalantwort: Matlab
und R
Übersetzungen
Matlab-Code
function [signale,avgFilter,stdFilter] = ThresholdingAlgo(y,verzögerung,schwelle,einfluss)
% Initialisiere Signale
signale = zeros(length(y),1);
% Initialisiere gefilterte Serie
gefiltertY = y(1:verzögerung+1);
% Initialisiere Filter
avgFilter(verzögerung+1,1) = mean(y(1:verzögerung+1));
stdFilter(verzögerung+1,1) = std(y(1:verzögerung+1));
% Schleife über alle Datenpunkte y(verzögerung+2),...,y(t)
for i=verzögerung+2:length(y)
% Wenn neuer Wert eine bestimmte Anzahl von Abweichungen entfernt ist
if abs(y(i)-avgFilter(i-1)) > schwelle*stdFilter(i-1)
if y(i) > avgFilter(i-1)
% Positives Signal
signale(i) = 1;
else
% Negatives Signal
signale(i) = -1;
end
% Mache Einfluss geringer
gefiltertY(i) = einfluss*y(i)+(1-einfluss)*gefiltertY(i-1);
else
% Kein Signal
signale(i) = 0;
gefiltertY(i) = y(i);
end
% Passe die Filter an
avgFilter(i) = mean(gefiltertY(i-verzögerung:i));
stdFilter(i) = std(gefiltertY(i-verzögerung:i));
end
% Fertig, nun Ergebnisse zurückgeben
end
Beispiel:
% Daten
y = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1,...,
1 1 1.1 0.9 1 1.1 1 1 0.9 1 1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1,...,
1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1,...
1 3 2.6 4 3 3.2 2 1 1 0.8 4 4 2 2.5 1 1 1];
% Einstellungen
verzögerung = 30;
schwelle = 5;
einfluss = 0;
% Ergebnisse erhalten
[signale,avg,dev] = ThresholdingAlgo(y,verzögerung,schwelle,einfluss);
figure; subplot(2,1,1); hold on;
x = 1:length(y); ix = verzögerung+1:length(y);
area(x(ix),avg(ix)+schwelle*dev(ix),'FaceColor',[0.9 0.9 0.9],'EdgeColor','none');
area(x(ix),avg(ix)-schwelle*dev(ix),'FaceColor',[1 1 1],'EdgeColor','none');
plot(x(ix),avg(ix),'LineWidth',1,'Color','cyan','LineWidth',1.5);
plot(x(ix),avg(ix)+schwelle*dev(ix),'LineWidth',1,'Color','green','LineWidth',1.5);
plot(x(ix),avg(ix)-schwelle*dev(ix),'LineWidth',1,'Color','green','LineWidth',1.5);
plot(1:length(y),y,'b');
subplot(2,1,2);
stairs(signale,'r','LineWidth',1.5); ylim([-1.5 1.5);
R-Code
ThresholdingAlgo <- function(y,verzögerung,schwelle,einfluss) {
signale <- rep(0,length(y))
gefiltertY <- y[1:verzögerung]
avgFilter <- NULL
stdFilter <- NULL
avgFilter[verzögerung] <- mean(y[1:verzögerung], na.rm=TRUE)
stdFilter[verzögerung] <- sd(y[1:verzögerung], na.rm=TRUE)
for (i in (verzögerung+1):length(y)){
if (abs(y[i]-avgFilter[i-1]) > schwelle*stdFilter[i-1]) {
if (y[i] > avgFilter[i-1]) {
signale[i] <- 1;
} else {
signale[i] <- -1;
}
gefiltertY[i] <- einfluss*y[i]+(1-einfluss)*gefiltertY[i-1]
} else {
signale[i] <- 0
gefiltertY[i] <- y[i]
}
avgFilter[i] <- mean(gefiltertY[(i-verzögerung):i], na.rm=TRUE)
stdFilter[i] <- sd(gefiltertY[(i-verzögerung):i], na.rm=TRUE)
}
return(list("signale"=signale,"avgFilter"=avgFilter,"stdFilter"=stdFilter))
}
Beispiel:
# Daten
y <- c(1,1,1.1,1,0.9,1,1,1.1,1,0.9,1,1.1,1,1,0.9,1,1,1.1,1,1,1,1,1.1,0.9,1,1.1,1,1,0.9,
1,1.1,1,1,1.1,1,0.8,0.9,1,1.2,0.9,1,1,1.1,1.2,1,1.5,1,3,2,5,3,2,1,1,1,0.9,1,1,3,
2.6,4,3,3.2,2,1,1,0.8,4,4,2,2.5,1,1,1)
verzögerung <- 30
schwelle <- 5
einfluss <- 0
# Algorithmus mit verzögerung = 30, schwelle = 5, einfluss = 0 ausführen
ergebnis <- ThresholdingAlgo(y,verzögerung,schwelle,einfluss)
# Ergebnis plotten
par(mfrow = c(2,1),oma = c(2,2,0,0) + 0.1,mar = c(0,0,2,1) + 0.2)
plot(1:length(y),y,type="l",ylab="",xlab="")
lines(1:length(y),ergebnis$avgFilter,type="l",col="cyan",lwd=2)
lines(1:length(y),ergebnis$avgFilter+schwelle*ergebnis$stdFilter,type="l",col="green",lwd=2)
lines(1:length(y),ergebnis$avgFilter-schwelle*ergebnis$stdFilter,type="l",col="green",lwd=2)
plot(ergebnis$signale,type="S",col="red",ylab="",xlab="",ylim=c(-1.5,1.5),lwd=2)
Dieser Code (beide Sprachen) liefert für die Daten der Originalfrage das folgende Ergebnis:
Anhang 2 zur Originalantwort: Matlab
Demo-Code
(Klicken Sie, um Daten zu erstellen)
function [] = RobustThresholdingDemo()
%% SPEZIFIKATIONEN
verzögerung = 5; % Verzögerung für die Glättung
schwelle = 3.5; % Anzahl der Standardabweichungen vom Mittelwert, um ein Signal zu erkennen
einfluss = 0.3; % Bei Signal: Wie viel Einfluss für neue Daten? (zwischen 0 und 1)
% 1 ist normaler Einfluss, 0,5 ist halb
%% STARTEN SIE DAS DEMO
DemoScreen(30,verzögerung,schwelle,einfluss);
end
function [signale,avgFilter,stdFilter] = ThresholdingAlgo(y,verzögerung,schwelle,einfluss)
signale = zeros(length(y),1);
gefiltertY = y(1:verzögerung+1);
avgFilter(verzögerung+1,1) = mean(y(1:verzögerung+1));
stdFilter(verzögerung+1,1) = std(y(1:verzögerung+1));
for i=verzögerung+2:length(y)
if abs(y(i)-avgFilter(i-1)) > schwelle*stdFilter(i-1)
if y(i) > avgFilter(i-1)
signale(i) = 1;
else
signale(i) = -1;
end
gefiltertY(i) = einfluss*y(i)+(1-einfluss)*gefiltertY(i-1);
else
signale(i) = 0;
gefiltertY(i) = y(i);
end
avgFilter(i) = mean(gefiltertY(i-verzögerung:i));
stdFilter(i) = std(gefiltertY(i-verzögerung:i));
end
end
% Demo-Bildschirmfunktion
function [] = DemoScreen(n,verzögerung,schwelle,einfluss)
figure('Position',[200 100,1000,500]);
subplot(2,1,1);
title(sprintf(['Zeichnen von Datenpunkten (%.0f max) [Einstellungen: Verzögerung = %.0f, '...
'Schwelle = %.2f, Einfluss = %.2f]'],n,verzögerung,schwelle,einfluss));
ylim([0 5]); xlim([0 50]);
H = gca; subplot(2,1,1);
set(H, 'YLimMode', 'manual'); set(H, 'XLimMode', 'manual');
set(H, 'YLim', get(H,'YLim')); set(H, 'XLim', get(H,'XLim'));
xg = []; yg = [];
for i=1:n
try
[xi,yi] = ginput(1);
catch
return;
end
xg = [xg xi]; yg = [yg yi];
if i == 1
subplot(2,1,1); hold on;
plot(H, xg(i),yg(i),'r.');
text(xg(i),yg(i),num2str(i),'FontSize',7);
end
if length(xg) > verzögerung
[signale,avg,dev] = ...
ThresholdingAlgo(yg,verzögerung,schwelle,einfluss);
area(xg(verzögerung+1:end),avg(verzögerung+1:end)+schwelle*dev(verzögerung+1:end),...
'FaceColor',[0.9 0.9 0.9],'EdgeColor','none');
area(xg(verzögerung+1:end),avg(verzögerung+1:end)-schwelle*dev(verzögerung+1:end),...
'FaceColor',[1 1 1],'EdgeColor','none');
plot(xg(verzögerung+1:end),avg(verzögerung+1:end),'LineWidth',1,'Color','cyan');
plot(xg(verzögerung+1:end),avg(verzögerung+1:end)+schwelle*dev(verzögerung+1:end),...
'LineWidth',1,'Color','green');
plot(xg(verzögerung+1:end),avg(verzögerung+1:end)-schwelle*dev(verzögerung+1:end),...
'LineWidth',1,'Color','green');
subplot(2,1,2); hold on; title('Signal-Ausgabe');
stairs(xg(verzögerung+1:end),signale(verzögerung+1:end),'LineWidth',2,'Color','blue');
ylim([-2 2]); xlim([0 50]); hold off;
end
subplot(2,1,1); hold on;
for j=2:i
plot(xg([j-1:j]),yg([j-1:j]),'r'); plot(H,xg(j),yg(j),'r.');
text(xg(j),yg(j),num2str(j),'FontSize',7);
end
end
end