3.3數(shù)字濾波信號(hào)前端
原理
CMSIS-DSP提供直接I型IIR庫支持Q7,Q15,Q31和浮點(diǎn)四種數(shù)據(jù)類型。其中Q15和Q31提供了快速版本。
直接I型IIR濾波器是基于二階Biquad級(jí)聯(lián)的方式來實(shí)現(xiàn)的。每個(gè)Biquad由一個(gè)二階的濾波器組成:
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]
直接I型算法每個(gè)階段需要5個(gè)系數(shù)和4個(gè)狀態(tài)變量。
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
matlab使用上面的公式實(shí)現(xiàn),在使用fdatool工具箱生成的a系數(shù)需要取反才能用于直接I型IIR濾波器的函數(shù)中。
高階IIR濾波器的實(shí)現(xiàn)是采用二階Biquad級(jí)聯(lián)的方式來實(shí)現(xiàn)的。其中參數(shù)numStages就是用來做指定二階Biquad的個(gè)數(shù)。比如8階IIR濾波器就可以采用numStages=4個(gè)二階Biquad來實(shí)現(xiàn)。
如果要實(shí)現(xiàn)9階IIR濾波器就需要將numStages=5,這時(shí)就需要其中一個(gè)Biquad配置成一階濾波器(也就是b2=0,a2=0)。
添加命令行
shell_fun.h中
void IirFun(void* param);
shell_fun.c中
#include "iir.h"
shell_cmd_list中添加一行
{ (const uint8_t*)"iir", IirFun, “iir"},
添加命令執(zhí)行函數(shù)
void IirFun(void* param)
{
Iir_main();
}
實(shí)現(xiàn)代碼
Iir.c
#include "arm_math.h"
#include "arm_const_structs.h"
#include < stdio.h >
#define TEST_LENGTH_SAMPLES 2048
#define FS 10000
extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];
static float32_t testOutput[TEST_LENGTH_SAMPLES];
static uint32_t fftSize = 1024;
static uint32_t ifftFlag = 0;
static uint32_t doBitReverse = 1;
static arm_cfft_instance_f32 varInstCfftF32;
static int testIndex = 0;
static float testtmp_f32_10khz[2048];
static int32_t adcbuffer[2048];
#define numStages 2 /* 2階IIR濾波的個(gè)數(shù) */
#define BLOCK_SIZE 128 /* 調(diào)用一次arm_biquad_cascade_df1_f32處理的采樣點(diǎn)個(gè)數(shù) */
uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要調(diào)用arm_biquad_cascade_df1_f32的次數(shù) */
static float32_t IIRStateF32[4*numStages]; /* 狀態(tài)緩存 */
/* 巴特沃斯低通濾波器系數(shù) 80Hz*/
const float32_t IIRCoeffs32LP[5*numStages] = {
1.0f, 2.0f, 1.0f, 1.479798894397216679763573665695730596781f,
-0.688676953053861784503908438637154176831f,
1.0f, 2.0f, 1.0f, 1.212812092620218384908525877108331769705f,
-0.384004162286553540894828984164632856846f
};
int32_t iir_main(void)
{
uint32_t i;
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleValue;
float32_t *inputF32, *outputF32;
/* 初始化輸入輸出緩存指針 */
//memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz));
#if 1
adc_samp(adcbuffer,2048);
for(int i=0; i< 2048;i ++)
{
testtmp_f32_10khz[i] = (float)adcbuffer[i];
}
#endif
inputF32 = testtmp_f32_10khz;
outputF32 = testOutput;
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32LP[0],
(float32_t *)&IIRStateF32[0]);
/* 實(shí)現(xiàn)IIR濾波,這里每次處理1個(gè)點(diǎn) */
for(i=0; i < numBlocks; i++)
{
arm_biquad_cascade_df1_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize),
blockSize);
}
/*放縮系數(shù) */
ScaleValue = 0.012f* 0.42f;
/* 打印濾波后結(jié)果 */
for(i=0; i< TEST_LENGTH_SAMPLES; i++)
{
printf("/*%f, %f*/rn", testtmp_f32_10khz[i], testOutput[i]*ScaleValue);
}
}
/** endlink */
Iir.h
#ifndef IIR_H
#define IIR_H
int iir_main(void);
#endif
測(cè)試
輸入iir回車,查看波形
見視頻
以下可以看到濾波導(dǎo)致了滯后,黃色線有滯后
以下是實(shí)時(shí)采集濾波
審核編輯:湯梓紅
-
英飛凌
+關(guān)注
關(guān)注
67文章
2213瀏覽量
139065 -
濾波器
+關(guān)注
關(guān)注
161文章
7859瀏覽量
178917 -
PSoC
+關(guān)注
關(guān)注
12文章
172瀏覽量
92114 -
濾波
+關(guān)注
關(guān)注
10文章
669瀏覽量
56773 -
信號(hào)處理
+關(guān)注
關(guān)注
48文章
1042瀏覽量
103400 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5121瀏覽量
98183 -
RTT
+關(guān)注
關(guān)注
0文章
65瀏覽量
17217
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于PSOC6的智能環(huán)境監(jiān)控系統(tǒng)
![基于<b class='flag-5'>PSOC6</b>的智能環(huán)境監(jiān)控系統(tǒng)](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
有獎(jiǎng)丨米爾 全志T536開發(fā)板免費(fèi)試用
![有獎(jiǎng)丨米爾 全志T536<b class='flag-5'>開發(fā)板</b>免費(fèi)<b class='flag-5'>試用</b>](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
追加名額丨米爾瑞芯微RK3576開發(fā)板有獎(jiǎng)試用
![追加名額丨米爾瑞芯微RK3576<b class='flag-5'>開發(fā)板</b>有獎(jiǎng)<b class='flag-5'>試用</b>](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
有獎(jiǎng)丨米爾 瑞芯微RK3576開發(fā)板免費(fèi)試用
![有獎(jiǎng)丨米爾 瑞芯微RK3576<b class='flag-5'>開發(fā)板</b>免費(fèi)<b class='flag-5'>試用</b>](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
有獎(jiǎng)試用!!RA-Eco-RA4E2-64PIN-V1.0開發(fā)板試用活動(dòng)開始報(bào)名
![有獎(jiǎng)<b class='flag-5'>試用</b>!!RA-Eco-RA4E2-64PIN-V1.0<b class='flag-5'>開發(fā)板</b><b class='flag-5'>試用</b>活動(dòng)開始報(bào)名](https://file1.elecfans.com/web2/M00/BB/1B/wKgZomWXtb6ACk_NAAARMuEl9ZA261.png)
點(diǎn)擊參與米爾NXP i.MX 93開發(fā)板有獎(jiǎng)試用
![點(diǎn)擊參與米爾NXP i.MX 93<b class='flag-5'>開發(fā)板</b>有獎(jiǎng)<b class='flag-5'>試用</b>](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
Psoc6 ble開發(fā)板,flash擦寫報(bào)IPC驅(qū)動(dòng)程序繁忙是受什么的影響?
免費(fèi)!NXP i.MX 93開發(fā)板有獎(jiǎng)試用
![免費(fèi)!NXP i.MX 93<b class='flag-5'>開發(fā)板</b>有獎(jiǎng)<b class='flag-5'>試用</b>](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
玩轉(zhuǎn)PSoC 6 RTT積木式開發(fā)套件,實(shí)現(xiàn)毫米波雷達(dá)等實(shí)用功能
![玩轉(zhuǎn)<b class='flag-5'>PSoC</b> <b class='flag-5'>6</b> <b class='flag-5'>RTT</b>積木式<b class='flag-5'>開發(fā)</b>套件,實(shí)現(xiàn)毫米波雷達(dá)等實(shí)用功能](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
![](https://file1.elecfans.com/web2/M00/C3/27/wKgZomXpvCqAIS55AAP_IGR8Jw4421.png)
【英飛凌測(cè)評(píng)】英飛凌PSoC? 62開發(fā)板試用報(bào)告-LCD ILI9341 8080 DEMO
![【<b class='flag-5'>英飛凌</b>測(cè)評(píng)】<b class='flag-5'>英飛凌</b><b class='flag-5'>PSoC</b>? 62<b class='flag-5'>開發(fā)板</b><b class='flag-5'>試用</b>報(bào)告-LCD ILI9341 8080 DEMO](https://file1.elecfans.com/web2/M00/C4/14/wKgaomXpu9qAR3zKAAD9PJqmAjk362.png)
如何在PSoC62 Evaluation kit開發(fā)板上運(yùn)行RT-Thread呢?
![如何在<b class='flag-5'>PSoC</b>62 Evaluation kit<b class='flag-5'>開發(fā)板</b>上運(yùn)行RT-Thread呢?](https://file1.elecfans.com/web2/M00/C1/40/wKgZomXdTiCALqQxAABSO4fFgn4963.jpg)
評(píng)論