Nie wiem czy napisałem w dobrym dziale...
Chciałem użyć transformaty hilberta-huanga na sygnale który jest mocno zaszumiony. Aby móc użyć tej transformaty
muszę zastosować rozkład na mody empiryczne (EMD) . Rozkład ten mówi że dzielimy sygnał na mody empiryczne (tzw. IMF-y).
Imf musi spełniać dwa warunki :
(1) dla całego zbioru danych, ilość ekstremów i ilość miejsc zerowych muszą się sobie
równać (lub różnić o nie więcej niż 1).
(2) dla każdego punktu, wartość średnia z obwiedni zdefiniowanej przez lokalne maksima i
obwiedni zdefiniowanej przez lokalne minima jest równa zero.
m(t) = [u(t) + v(t)]/2
m - wartosć średnia
u(t) górna obwiednia
v(t) dolna obwiednia
I tutaj zaczynają się schody :/
Dzielę sygnał na kawałki - wyznaczam obwiednie dla max i min i wyliczam liczbę extremów(dla poszczególnego kawałka). Niestety rzadko się zdarza aby liczba ekstremów była równa liczbie przejść przez zero :/
poza tym nie rozumiem co oznacza drugi warunek...Ja to rozumiem tak że jak sprawdzimy każdy punkt na osi x to ich suma ma się równać zero. Czy dobrze rozumuje?
Może ktoś bawił się tym rozkładem albo wie co źle robię...byłbym wdzięczny : )
Może biorę za dużo próbek (jako imf przyjmuje 200 próbek)
pozdr...
ps. może wrzucę jak znajduję te maxima , minima i zera lokalne :)
void maximumExtrema() {
for (int i = 1; i < testTable.length-1; i++) {
if ( testTable[i + 1] < testTable[i]&& testTable[i-1] < testTable[i]) {
list.add(testTable[i]);
list9.add((short) i);
}
}
}
void minimumExtrema() {
for (int i = 1; i < testTable.length-1; i++) {
if ( testTable[i + 1] > testTable[i]&&testTable[i-1] > testTable[i]) {
sec.add(testTable[i]);
sec9.add((short) i);
}
}
}
void zeroCrossing(){
for (int i = 0; i < testTable.length-1; i++) {
if (testTable[i]>0 && testTable[i+1]<0 || testTable[i]<0 && testTable[i+1]>0) {
zero.add(testTable[i]);
}
}
}
gdzie:
testTable - tablica w której znajdują się próbki sygnału
list , sec , zero kontener do którego wrzucam wyniki