網上看了一些資料,有點亂和雜,這里記錄一下程序,
-
首先勾選DSP,選擇Library或者Source都可以,

-
增加預定義
ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING

3. 增加包含頭檔案目錄

4. 打開Matlab,輸入fdatool命令,進行FIR濾波器設計
具體設計選哪種濾波器,多少階,采樣率,截止頻率完全根據自己的要求設計,完成后點Generate C header 來輸出濾波器引數,

5. STM32 代碼
(這些只是大概的結構,具體的FIR濾波器源頭資料testInput的得來當然要自己按照自己的應用來寫,其中用到的33個引數就來自于上面生成的頭檔案中)
#include "arm_math.h"
#define TEST_LENGTH_SAMPLES 1000
#define BLOCK_SIZE 100
#define NUM_TAPS 33
uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;
float32_t testOutput[TEST_LENGTH_SAMPLES];
float32_t testInput[TEST_LENGTH_SAMPLES];
float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];
const float32_t firCoeffs32[NUM_TAPS] = {
0.004545294214, 0.005060049705, 0.006566246971, 0.009012510069, 0.0123100793,
0.01633617282, 0.02093872614, 0.02594230697, 0.03115498833, 0.03637590259,
0.04140317068, 0.04604187235, 0.05011179298, 0.05345456675, 0.05593996495,
0.05747107789, 0.05798817798, 0.05747107789, 0.05593996495, 0.05345456675,
0.05011179298, 0.04604187235, 0.04140317068, 0.03637590259, 0.03115498833,
0.02594230697, 0.02093872614, 0.01633617282, 0.0123100793, 0.009012510069,
0.006566246971, 0.005060049705, 0.004545294214
};
arm_fir_instance_f32 S;
float32_t *inputF32, *outputF32;
main()
{
inputF32 = &testInput[0];
outputF32 = &testOutput[0];
arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize);
while(1)
{
for(int i=0; i < numBlocks; i++)
{
arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
}
}
}
- 濾波效果示例(FIR,32階,1khz, 低通)
橙色線FIR濾波器的輸入,灰色是FIR濾波器輸出,都是真實的DAC->ADC輸入(橙色),FIR輸出(灰色),不是模擬測驗,可以看出效果十分明顯,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278963.html
標籤:其他
