2016-08-16 11 views
0

У меня есть большой набор данных, который имеет значения от [-3,3], и я использую жесткий предел на 0 в качестве границы.Идентифицировать двоичное состояние набора данных (частота включения/выключения)

Данные имеют двоичное значение 1 при его колебании от -3,3 при частоте 56 кГц. Это означает, что данные будут меняться от -3 до 3 и обратно каждые N значений данных, где N обычно < 20.

Данные имеют двоичное значение 0, когда данные 3 постоянно (обычно это может быть последние 400+ образцов)

Я не могу сгруппировать данные в свои двоичные категории, а также узнать, сколько образцов доступно широкой группе.

Пример данных:

1.84 | 
2.96 | 
2.8  | 
3.12 | 
.  | I want this to be grouped as a 0 
.  | 
3.11 |_____ 
-3.42 | 
-2.45 | 
-1.49 | 
3.12 | 
2.99 | I want this to be grouped as a 1 
1.97 | 
-1.11 | 
-2.33 | 
.  | 
.  | Keeps going until for N cycles 

Циклы в-между высоким логическим состоянием, как правило, небольшие (< 20 образцов).

код у меня до сих пор:

state = "X" 
for i in range(0, len(data['input'])):  
    currentBinaryState = inputBinaryState(data['input'][i]); # Returns -3 or +3 appropriately 

    if(currentBinaryState != previousBinaryState): 

     # A cycle is very unlikely to last more than 250 samples 
     if y > 250 and currentBinaryState == "LOW": # Been low for a long time 
      if state == "_high": 
       groupedData['input'].append(("HIGH", x)) 
       x = 0 

      state = "_low" 

     else: 
      # Is on carrier wave (logic 1) 
      if state == "_low": 
       # Just finished low 
       groupedData['input'].append(("LOW", x)) 
       x = 0 

      state = "_high" 


     y = 0 

Очевидно, что результат не является, как следует ожидать, как LOW группа очень мала.

[('HIGH', 600), ('LOW', 8), ('HIGH', 1168), ('LOW', 9), ('HIGH', 1168), ('LOW', 8), ('HIGH', 1168), ('LOW', 8), ('HIGH', 1168), ('LOW', 9), ('HIGH', 1168), ('LOW', 8), ('HIGH', 1168), ('LOW', 8), ('HIGH', 1168), ('LOW', 9)] 

Я понимаю, что мог бы спросить об этом в SA обработки сигналов, но я счел эту проблему более ориентированной на программирование. Надеюсь, я достаточно подробно объяснил проблему, если есть какие-то вопросы. Благодарю.


Вот ссылка на фактические данные выборки:

https://drive.google.com/folderview?id=0ByJDNIfaTeEfemVjSU9hNkNpQ3c&usp=sharing

Визуально очень понятно, где границы лежат данные. Plot of sample data


Update 1

Я обновил свой код, чтобы быть более разборчивыми в виде отдельных буквенных переменных не помогает с моей вменяемости.

previousBinaryState = "X" 
x = 0 
sinceLastChange = 0 
previousGroup = inputBinaryState(data['input'][0]) 
lengthAssert = 0 
for i in range(0, len(data['input'])):  
    currentBinaryState = inputBinaryState(data['input'][i]); 

    if(currentBinaryState != previousBinaryState): # Changed from -3 -> +3 or +3 -> -3 

     #print sinceLastChange 

     if sinceLastChange > 250 and previousGroup == "HIGH" and currentBinaryState == "LOW": # Finished LOW group 
      groupedData['input'].append(("LOW", x)) 
      lengthAssert += x 
      x = 0 
      previousGroup = "LOW" 

     elif sinceLastChange > 20 and previousGroup == "LOW": # Finished HIGH group 
      groupedData['input'].append(("HIGH", x)) 
      lengthAssert += x 
      x = 0 
      previousGroup = "HIGH" 

     sinceLastChange = 0 

    else: 
     sinceLastChange += 1 

    previousBinaryState = currentBinaryState 
    x += 1 

Который, для выборки данных, выходы:

8 
7 
8 
7 
7 
596 <- Clearly a LOW group 
7 
8 
7 
8 
7 
7 
8 
7 
8 
7 
7 
8 
7 
8 
7 
7 
8 
7 
8 
. 
. 
. 

Проблемы является высокой группой длящиеся дольше, чем это должно быть:

[('HIGH', 600), ('LOW', 1176), ('HIGH', 1177), ('LOW', 1176), ('HIGH', 1176), ('LOW', 1177), ('HIGH', 1176), ('LOW', 1176)] 
  • Есть только 8 групп но сюжет ясно показывает намного больше. Группы, по-видимому, вдвое больше того, чем они должны быть.
+0

В настоящее время на этот вопрос довольно сложно ответить. Не могли бы вы предоставить нам несколько данных? Еще лучше, если вы можете дать данные образца с ним, отметили, какую часть вы считаете 1 и 0. Границы здесь будут очень сложными. Например, если данные сэмплированы на 1 МГц, и у вас есть 400 выборок при значении 3, за которыми следуют 20 @ -3, 20 @ + 3, 20 @ -3, 400 @ +3, значение '1' начинается с образец 380 или 400? И заканчивается ли она на образце 440 или 460? Или это не имеет значения? Также - у вас есть минимальный порог для того, чтобы количество образцов считалось нулем? –

+0

@JRichardSnape Спасибо за комментарий. Точная точка, в которой есть граница между 0 и 1, не имеет значения. Не имеет значения, начиналась ли граница с 380 или 400 до тех пор, пока группа 0 инкапсулирует все полные циклы (-3 -> + 3 -> - 3) в данные выборки. Минимальный порог, для которого я считаю данные в группе 0, является несколько произвольным. Я выбрал 250 образцов в -3, чтобы быть достаточным. Я установил ссылку на файл данных и изображение, которое показывает график данных. Визуально, очень ясно, где границы лежат. Надеюсь, что ответы на ваши вопросы. – iyop45

ответ

0

Я наконец нашел решение. Я слишком долго опускал голову, что, кажется, довольно простая проблема, но теперь она работает.

Он не будет отображать последнюю группу в наборе данных, но это нормально.

previousBinaryState = "X" 
x = 0 
sinceLastChange = 0 
previousGroup = inputBinaryState(data['input'][0]) 
lengthAssert = 0 
for i in range(0, len(data['input'])):  
    currentBinaryState = inputBinaryState(data['input'][i]); 

    if(currentBinaryState != previousBinaryState): # Changed from -3 -> +3 or +3 -> -3 

     #print sinceLastChange 

     if sinceLastChange > 250 and previousGroup == "HIGH" and currentBinaryState == "LOW": # Finished LOW group 
      groupedData['input'].append(("LOW", x)) 
      lengthAssert += x 
      x = 0 
      previousGroup = "LOW" 

     sinceLastChange = 0 

    else: 
     if sinceLastChange > 20 and previousGroup == "LOW": 
      groupedData['input'].append(("HIGH", x)) 
      lengthAssert += x 
      x = 0 
      previousGroup = "HIGH" 
      sinceLastChange = 0 

     sinceLastChange += 1 

    previousBinaryState = currentBinaryState 
    x += 1   

20 представляет собой максимальное количество циклов в высоком состоянии и 250 представляет собой максимальное число выборок, для которых группа находится в низком состоянии.

[('HIGH', 25), ('LOW', 575), ('HIGH', 602), ('LOW', 574), ('HIGH', 602), ('LOW', 575), ('HIGH', 601), ('LOW', 575), ('HIGH', 602), ('LOW', 574), ('HIGH', 602), ('LOW', 575), ('HIGH', 601), ('LOW', 575), ('HIGH', 602), ('LOW', 574)] 

При сравнении этого с графом и фактическими данными оно представляется правильным.