這次平台選用的是stm32f407,因為畢竟要進行濾波運算,用有fpu的f4系列會比f1舒服很多。當然,在現場也看到許多用f1做的,效果也非常好。
由於我們對濾波的實時性要求比較高,所以這裡選中fir濾波器進行設計,fir濾波器的群延遲是固定的,在處理資料上會更加舒服一些。但是fir濾波的計算量會比較大,後文中如何減少fir的計算量是一大重點。
網上能找到的常見的濾波器教程用的都是以下形式:
一、濾波器的延遲取決於n的數量,n越大延遲越高。二、和其他濾波器配合的時候不是特別靈活。
於是,在上面濾波器結構的基礎上進行改進:
一、能減少單次計算的計算量,相當於每次只用計算群延時+1的資料。二、減少單次計算的n值,最大程度減少由於資料採集帶來的延遲,保持好的效果的同時保持較高的實時性。
這裡的低通濾波器主要採用以下這兩個函式
void arm_fir_init_f32(arm_fir_instance_f32 s, uint16_t numtaps,const float32_t pcoeffs,float32_t* pstate,uint32_t blocksize)**這個函式主要是對濾波器進行初始化
**void arm_fir_f32(const arm_fir_instance * s,const float32_t psrc,float32_t * pdst,uint32_t blocksize)**這個函式是最終進行濾波器的函式。
具體這兩個函式的用法和引數在這個**有非常詳細的解釋了,這裡就不過多贅述了。
下面是包裝了以下的濾波器函式
#include
"fir_48.h"
#include
"sys.h"
static float32_t firstatef32_48[block_size+num_taps-1]
;arm_fir_instance_f32 s;
uint32_t block_size = block_size;
const
int bl =49;
const float32_t b[49]
=;void
arm_fir_f32_lp_48
(float32_t *input_buffer,float32_t *output_buffer)
void
arm_fir48_init
(void
)
其中b[49]這個濾波器引數的生成使用matlab來做的,具體操作可以參考這篇文章
後續要使用濾波器的話只要使用這兩個函式就可以了
下面是實現上述濾波器結構的具體**
arm_fir48_init()
;if(ads1292_recive_flag)
}else
if(mid_filt_start_flag ==1)
else
}else
half_send_flag =0;
//printf("n0.val=%d",(int)bpm);
//輸出心率資料
//send_ending_flag();
}//printf("add 2,0,%0.f",fir_put[0]-mid_val+100);
bpm_val = fir_put[0]
-mid_val+
100;
if(debug_flag ==1)
else
//send_ending_flag();
arm_copy_f32
(mid_filt_cache1,mid_filt_cache,midfilt_num);}
arm_copy_f32
(calculate_cache+
1,calculate_cache1,18)
;//將前一陣列的後18位拷貝到快取陣列中,作為fir濾波器的群延時
arm_copy_f32
(calculate_cache1,calculate_cache,18)
;//將快取陣列的18位拷貝到後一陣列中
}
ads1292_recive_flag=0;
}
整個工程檔案我放在github倉庫裡面了,裡面有整個a題的**
謝謝**
濾波器實現
基於matlab內建函式的fir設計。功能 設計標準頻率響應的基於窗函式的fir濾波器。語法 說明 fir1函式可以實現加窗線形相位fir數字濾波器設計,它可以設計出標準的低通 高通 帶通和帶阻濾波器.當wn w1 w2 時,fir1函式可得到帶通濾波器,其通帶為w1 w w2.在設計高通和帶阻濾波...
python實現濾波器
在使用python進行訊號處理過程中,利用 scipy.signal.filtfilt 可以快速幫助實現訊號的濾波。1.函式的介紹 1 濾波函式 scipy.signal.filtfilt b,a,x,axis 1,padtype odd padlen none,method pad irlen n...
stm32晶元休眠模式 stm32實現待機喚醒
stm32的低功耗模式有3種 1 睡眠模式 cm3核心停止,外設仍然執行 2 停機模式 所有時鐘都停止 3 待機模式 1.8v核心電源關閉 進入待機模式的方法,以及設定wk up引腳用於把stm32從待機模式喚醒的方法 一般步驟如下 1 設定sleepdeep位 scb scr的第二位 2 使能電源...