У меня есть большой набор данных, который имеет значения от [-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
Визуально очень понятно, где границы лежат данные.
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 групп но сюжет ясно показывает намного больше. Группы, по-видимому, вдвое больше того, чем они должны быть.
В настоящее время на этот вопрос довольно сложно ответить. Не могли бы вы предоставить нам несколько данных? Еще лучше, если вы можете дать данные образца с ним, отметили, какую часть вы считаете 1 и 0. Границы здесь будут очень сложными. Например, если данные сэмплированы на 1 МГц, и у вас есть 400 выборок при значении 3, за которыми следуют 20 @ -3, 20 @ + 3, 20 @ -3, 400 @ +3, значение '1' начинается с образец 380 или 400? И заканчивается ли она на образце 440 или 460? Или это не имеет значения? Также - у вас есть минимальный порог для того, чтобы количество образцов считалось нулем? –
@JRichardSnape Спасибо за комментарий. Точная точка, в которой есть граница между 0 и 1, не имеет значения. Не имеет значения, начиналась ли граница с 380 или 400 до тех пор, пока группа 0 инкапсулирует все полные циклы (-3 -> + 3 -> - 3) в данные выборки. Минимальный порог, для которого я считаю данные в группе 0, является несколько произвольным. Я выбрал 250 образцов в -3, чтобы быть достаточным. Я установил ссылку на файл данных и изображение, которое показывает график данных. Визуально, очень ясно, где границы лежат. Надеюсь, что ответы на ваши вопросы. – iyop45