2016-07-27 30 views
0

Ich habe ein Signal, das wie folgt aussieht: enter image description hereMatlab - finden starten und ein interessanten Signal stoppen

würde Ich mag einen Weg finden, den Anfang und das Ende des Abschnitts von der Mitte zu finden.

Was ich getan habe, ist für die Werte über und unter 0,5 eine Konstante ==> 1, und wenn ich oft 1 in der Reihe finde, bedeutet das, dass es mein Signal ist ... aber es ist kein guter Weg Ich vermute! Erstens wäre meine "Schwelle" nicht jedes Mal 0,5, und ich bin mir sicher, dass es einen besseren Weg dafür gibt.

Wenn ihr, dass einige Dokumentationen oder Ideen haben, ..

Thank you very much.

+0

könnten Sie eine Beispiel-Signaldatei bereitstellen? und welche Eigenschaften haben alle deine Signale gemeinsam? – Finn

+0

https://www.dropbox.com/s/lm5pm9232yphwwb/acceleration.txt?dl=0 hier ist eine TXT-Datei mit dem Signal (Fe = 101Hz). Das Signal ist die Beschleunigung von jemandem, der rennt. Die gemeinsame Eigenschaft ist, dass es eine Wiederholung von Sinuskurven gibt, wenn Sie das Signal mit einem Tiefpassfilter bei 5 Hz filtern. @Finn Vielen Dank – YLM

+0

Sie werden wahrscheinlich eine bessere Antwort auf http://dsp.stackexchange.com/ erhalten, da diese Frage eher mit DSP als mit der eigentlichen Programmierung zu tun hat. Es sollte auch Personen mit Matlab-Kenntnissen geben und dass der Post Code verwendet, der in Matlab geschrieben wurde (und anscheinend einen Beispielcode in der Antwort verlangt), bedeutet nicht, dass es keine DSP-Frage sein kann. – patrik

Antwort

1

Wie die anderen erwähnt es eher eine DSP Frage ist und dsp.stackexchange.com werden Sie propably eine bessere Antwort geben, aber bis dahin könnte dies helfen:

data=csvread('acceleration.txt',1) 

threshold_y=max(data)*0.5; %Thanks to GameOfThrows 
thershold_x=101; %how many zeros can be between to ones to still count as continuous 
addframe=50; %if you want a little bit of data before and after the active area 
logic_index=data>threshold_y; 
num_index=find(logic_index); 
distance=diff(num_index); 

gaps=[1 ; find(distance>thershold_x)]; %find the gaps bigger than your threshold 
final_index=false(length(data),1); 

for i=1:length(gaps)-1 %add ones between 
    final_index(num_index(gaps(i)+1)-addframe:num_index(gaps(i+1))+addframe)=true; 
end 
plot(x,data,x,final_index); 

es im Grunde, was Sie beschrieben, wird in in Ihrer Frage, aber mit dem zusätzlichen Umgang mit den Nullen zwischen einem Bereich. Danke an @GameofThrows für die Schwellenidee.

+0

Großartig! Danke, es funktioniert perfekt :) Es ist ein wirklich guter Weg! @Finn – YLM