【问题标题】:Identify binary state of data set (frequency on/off)识别数据集的二进制状态(频率开/关)
【发布时间】:2016-12-22 16:45:27
【问题描述】:

我有一个大型数据集,其值范围为 [-3,3],我使用 0 作为边界的硬限制。

当数据以 56kHz 的频率从 -3,3 振荡时,数据的二进制值为 1。这意味着数据将从 -3 变为 3 并返回每 N 个数据值,其中 N 通常

当数据持续为 3 时,数据的二进制值为 0(这通常可以持续 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

逻辑高电平状态之间的周期通常很小(

我目前的代码:

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

从视觉上看,数据的边界在哪里非常清楚。


更新 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 组的持续时间超过了应有的时间:

[('HIGH', 600), ('LOW', 1176), ('HIGH', 1177), ('LOW', 1176), ('HIGH', 1176), ('LOW', 1177), ('HIGH', 1176), ('LOW', 1176)]
  • 只制作了 8 个组,但情节清楚地显示了更多。这些组的规模似乎是应有规模的两倍。

【问题讨论】:

  • 目前这个问题比较难回答。你能给我们一些样本数据吗?如果你能给出样本数据并标出你会考虑 1 和 0 的部分,那就更好了。这里的界限将非常困难。例如,如果数据以 1 MHz 进行采样,并且值 3 有 400 个样本,然后是 20 @ -3、20@+3、20@-3、400 @ +3,1 的值是否从样品 380 还是 400?它是否在样本 440 或 460 结束?还是没关系?另外 - 您是否有将样本数视为零的最小阈值?
  • @JRichardSnape 感谢您的评论。在 0 和 1 之间存在边界的确切点并不重要。只要 0 分组封装了样本数据中的所有完整循环 (-3->+3->-3),边界从 380 还是 400 开始都没有关系。我认为数据属于 0 组的最小阈值有些随意。我在 -3 处选择了 250 个样本就足够了。我附上了数据文件的链接和显示数据图的图像。视觉上,界限在哪里非常清楚。我希望这能回答你的问题。

标签: python frequency modulation


【解决方案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"

        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 是处于 HIGH 状态的最大周期数,250 是该组处于 LOW 状态的最大样本数。

[('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)]

当与图表和实际数据进行比较时,它似乎是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2015-04-16
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多