一種簡單查詢峰值的函式實現

2021-10-11 07:54:54 字數 2497 閱讀 9967

最近經常用到查詢峰值的函式

已有的函式要不**量比較大,要不就是邏輯比較複雜、設定的條件比較多,當然對於需要篩選出很合適的峰值來說,這些條件是必須的,對於紛繁複雜的波形中查詢到你想要的那個波峰,需要慧眼; 

但是對於波形很多的資料,不需要那麼繁瑣的邏輯判斷,根據自己的經驗,寫了乙個**雛形,用來查詢峰值,當然後續還需要簡單的加一些其他的判斷,但對於我的功能已經完成,簡單記錄一下;主要思想是在前後一定範圍內查詢合適的波峰或波谷。 下面**無法直接執行,只是程式中的乙個函式。

**如下:

uint8_t k = 8;

static uint8_t left_k_max = 0, right_k_max = 0, left_k_min = 0, right_k_min = 0;

static uint32_t max_data_pos = -100, min_data_pos = 100;

static float max_data = 0, min_data = 0;

sen_data_swim = data; // 向外傳原始raw data

peak_index_swim = 0; // 向外傳峰值位置

valley_index_swim = 0; // 向外傳波谷值位置

//mexprintf("%d - max_data:%f, max:%d left_k_max:%d \n", g_index, max_data, max_data_pos, left_k_max);

if (max_data < data)

else

if (min_data > data)

else

if (left_k_max == 10)

if (right_k_min == 10)

簡單示意圖

優化了一些條件,將無用的波峰過濾掉

uint8_t k = 10;

static uint8_t right_k_max_ = 0, left_k_max_ = 0, left_k_min = 0, right_k_min = 0;

static uint32_t max_data_pos = -100, min_data_pos = 100;

static uint32_t pre_max_data_pos = 0;

static float max_data = 0, min_data = 0;

static float pre_max_data = 0, pre_min_data = 0;

static bool need_to_find_peak = false;

sen_data_swim = data;

peak_index_swim = 0;

valley_index_swim = 0;

//mexprintf("%d - max_data:%f, max:%d right_k_max_:%d \n", g_index, max_data, max_data_pos, right_k_max_);

if (max_data < data)

else

if (min_data > data)

else

if (right_k_max_ == k)

//max_data = data;

//right_k_max_ = 0;

}max_data = data;

right_k_max_ = 0;

}if (right_k_min == k)

mexprintf("send min pos:%d, mini:%f, pre-min:%f \n", min_data_pos, min_data, pre_min_data);

//pre_min_data = min(min_data, data);

}if (right_k_min == 20) /* can find valley*/

if (right_k_max_ == 20)

版本3,發現上面的版本還是針對某些情況不能包含,又重新寫了一版

void findpeak(float data)

if (right_k_max >= k)

else}}

if (data < pre_data) /* down */

if (left_k_max >= k)

else}}

pre_data = data;

}

效果

體積霧的一種簡單實現

場景裡面一開始加的是預設的opengl霧效,效果不太好,看起來立體感不強,然後打算加個體積霧效果,搜了一些體積霧的實現方式,發現略複雜,就想了種比較簡單的實現方式 1 在場景的垂直高度上,一般是z軸,建立若干個水平的平面,大小要比場景大,疊在一起之後看起來效果類似乙個立方體 我是從z的 5到20,建...

python呼叫c語言函式的一種簡單實現方法

這個方法是利用了python的乙個模組ctypes實現的。首先是c語言的test.c原始碼函式 include int test char a 100 然後,使用gcc命令將其打包成乙個共享庫,就可以提供給python直接使用了,命令如下 gcc test.c fpic shared o libte...

一種基於密度峰值的聚類演算法

2014年science刊發了一篇標題為clustering by fast search and find of density peaks的文章,文章中介紹了一種基於密度峰值的聚類演算法。傳統的聚類演算法k means,通常不適用於非球形的簇。這裡所謂的球形簇是根據k means演算法基本原理得...