在電力等行業(yè),分析電壓極值,是一項重要的參數(shù)分析,可以分析電壓的波動;示波器中也有自動測量極值的功能更。
基于本板設(shè)計了信號處理前端也實現(xiàn)了該功能。
算法來源于論文https://www.mdpi.com/1999-4893/5/4/588/htm
核心代碼如下
void ampd (int32_t* data, int32_t len)
{
int row_sum;
for (int k=1; k< len/2+1; k++)
{
row_sum = 0;
for (int i=k; i< len-k; i++)
{
if ((data[i] > data[i - k]) && (data[i] > data[i + k]))
{
row_sum -= 1;
}
}
arr_rowsum[k-1] = row_sum;
}
int min_index = argmin(arr_rowsum,len/2+1);
max_window_length = min_index;
for (int k=1; k< max_window_length + 1; k++)
{
for (int i=k; i< len - k; i++)
{
if ((data[i] > data[i - k]) && (data[i] > data[i + k]))
{
p_data[i] += 1;
}
}
}
for (int k=0; k< len; k++)
{
if (p_data[k] == max_window_length)
{
/* 極大值 */
}
}
}
測試
添加命令行
{ (const uint8_t*)"max", MaxFun, "max"}, /*打印幫助信息*/
void MaxFun ( void * param)
{
max_test();
}
void MaxFun ( void * param);
測試代碼如下,串口命令行輸入命令max,開始采集ADC值,并計算極值,打印到PC串口通過seraistudio可視化顯示
int max_test(void)
{
for(int i=0; i< 10; i++)
{
memset(p_data,0,sizeof(p_data));
//adc_samp(sim_data_buffer,1000);
sim_data();
ampd(sim_data_buffer, sizeof(sim_data_buffer)/sizeof(sim_data_buffer[0]));
for(int k=0; k< sizeof(sim_data_buffer)/sizeof(sim_data_buffer[0]); k++)
{
if(p_data[k] == max_window_length)
{
/* 極大值 */
printf("/*%ld,%ld*/\\r\\n",sim_data_buffer[k],sim_data_buffer[k]);
}
else
{
printf("/*%ld,%d*/\\r\\n",sim_data_buffer[k],0);
}
cyhal_system_delay_ms(10);
}
}
return 0;
}
效果如下,IN是原始數(shù)據(jù),MAX是檢測到的極大值,如果檢測極小值將原始數(shù)據(jù)取反即可。
檢測語音,效果如下
審核編輯:湯梓紅
-
英飛凌
+關(guān)注
關(guān)注
66文章
2134瀏覽量
138255 -
PSoC
+關(guān)注
關(guān)注
12文章
170瀏覽量
91759 -
信號處理
+關(guān)注
關(guān)注
48文章
992瀏覽量
103154 -
信號
+關(guān)注
關(guān)注
11文章
2773瀏覽量
76538 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4895瀏覽量
97055 -
RTT
+關(guān)注
關(guān)注
0文章
65瀏覽量
17057
發(fā)布評論請先 登錄
相關(guān)推薦
評論