中间:开关量滤波:滑动窗口法

滑动窗口法

bit位


// 滑动窗口函数
unsigned char slidingFilter(char inputValue, SlidingWindow *window)
{
    // 清除当前索引的比特位
    window->values &= ~(1 << window->index);

    // 如果 inputValue 为 true,则设置当前索引的比特位为 1
    if (inputValue)
    {
        window->values |= 1 << window->index;
    }

    // 更新索引
    window->index = (window->index + 1) % WINDOW_SIZE;

    // 判断窗口内的比特位是否全部为1
    unsigned char allOnes = (1 << WINDOW_SIZE) - 1; //用宏可以省计算量
    if (window->values == allOnes)
    {
        return 1;
    }
    else if (window->values == 0)
    {
        return 0;
    }
    else
    {
        return 2; // 其他正在运行
    }
}

#include 
#define WINDOW_SIZE 8

// 假设要存储的比特值只能是 true (1) 或 false (0)
typedef struct
{
    unsigned char values; // 8位比特值
    int index;      // 当前插入索引
} SlidingWindow;

SlidingWindow pot_window;

// 初始化滑动窗口
void initSlidingWindow(SlidingWindow *window);
// 滑动窗口函数
unsigned char slidingFilter(char inputValue, SlidingWindow *window);

// 初始化滑动窗口
void initSlidingWindow(SlidingWindow *window)
{
    window->values = 0; // 将所有比特位都设置为0
    window->index = 0;
}

// 滑动窗口函数
unsigned char slidingFilter(char inputValue, SlidingWindow *window)
{
    // 清除当前索引的比特位
    window->values &= ~(1 << window->index);

    // 如果 inputValue 为 true,则设置当前索引的比特位为 1
    if (inputValue)
    {
        window->values |= 1 << window->index;
    }

    // 更新索引
    window->index = (window->index + 1) % WINDOW_SIZE;

    // 返回当前比特位状态
    if (0xff == window->values)
    {
        return 0xff;
    }
    return 0;
}

注意,在这段代码中,初始的窗口数组被初始化为全-2。确保这个初始化值不会与你期望的输入值混淆。此外,根据你的实际应用,可能需要考虑如何处理数组未满时的情况。


#include 

#define WINDOW_SIZE 30
#define INIT_VALUE -2

// 定义一个结构体来保存滑动窗口的状态
typedef struct
{
    int values[WINDOW_SIZE]; // 存储窗口中的值
    int index;               // 当前值的索引
} SlidingWindow;

// 初始化滑动窗口
void initSlidingWindow(SlidingWindow *window)
{
    for (int i = 0; i < WINDOW_SIZE; i++)
    {
        window->values[i] = INIT_VALUE; // 初始化所有值为INIT_VALUE
    }
    window->index = 0;
}

// 检查窗口内的值是否全部相同
int areAllValuesSame(const int *values, int size)
{
    for (int i = 1; i < size; i++)
    {
        if (values[i] != values[0])
        {
            return 0;
        }
    }
    return 1;
}

// 滑动窗口函数
int slidingFilter(int inputValue, SlidingWindow *window)
{
    // 更新滑动窗口的值
    window->values[window->index] = inputValue;

    // 更新索引
    window->index = (window->index + 1) % WINDOW_SIZE;

    // 检查窗口内所有值是否一致
    if (areAllValuesSame(window->values, WINDOW_SIZE))
    {
        return window->values[(window->index + WINDOW_SIZE - 1) % WINDOW_SIZE];
    }
    else
    {
        return INIT_VALUE;
    }
}

int main(void)
{
    SlidingWindow window; // 创建一个SlidingWindow结构体实例
    initSlidingWindow(&window); // 初始化窗口
    int result;

    // 示范如何使用滑动窗口
    for (int i = 0; i < 35; i++)
    {
        result = slidingFilter(100, &window);
        if (result != INIT_VALUE)
        {
            printf("Filter Output: %d\n", result);
        }
    }

    // 模拟非连续的输入
    for (int i = 0; i < 30; i++)
    {
        result = slidingFilter(i, &window);
        if (result != INIT_VALUE)
        {
            printf("Unfiltered Output: %d\n", result);
        }
    }

    return 0;
}

你可能感兴趣的:(算法,数据结构)