10.2 FIR有限冲击响应滤波器 二代示波器的FIR滤波控制界面如下:
做了一个80阶低通FIR滤波器,分别可以在2Msps采样率,200Ksps采样率和20Ksps采样率下工作。每个采样率下做了7种截止频率。 FIR滤波在信号处理任务里面被调用: - /*
- *********************************************************************************************************
- * 函 数 名: DSO1_WaveProcess
- * 功能说明: 波形通道1的FFT,FIR,最大值,最小值,平均值,峰峰值,频率和RMS的计算
- * 形 参: 无。
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void DSO1_WaveProcess(void)
- {
- uint16_t i;
- uint32_t uiCycle, uiCount = 0;
-
-
- /* 省略其它 */
-
- /* 自动触发模式才计算FFT */
- if(TriggerFlag == 0)
- {
- /* 省略其它 */
-
- /* 前10种采样率计算FFT */
- if(TimeBaseId < 10)
- {
- /* 执行650点,80阶Fir滤波器 */
- /* 单通道2Msps */
- if((TimeBaseId == 1)&&(g_DSO1->ucFirFlter_Step100KHz !=0 ))
- {
- DSO_FirFilter_Step100KHz();
- }
-
- /* 单通道200Ksps */
- if((TimeBaseId == 4)&&(g_DSO1->ucFirFlter_Step10KHz !=0 ))
- {
- DSO_FirFilter_Step10KHz();
- }
-
- /* 单通道20Ksps */
- if((TimeBaseId == 7)&&(g_DSO1->ucFirFlter_Step1KHz !=0 ))
- {
- DSO_FirFilter_Step1KHz();
- }
- }
- }
- /* 省略其它 */
- }
复制代码根据不同的采样率,分别做了个处理,我们这里以函数DSO_FirFilter_Step100KHz()为例进行说明。这个函数的实现如下: - #define FIR_LENGTH_SAMPLES 650 /* 采样点数 */
- #define BLOCK_SIZE 650 /* 调用一次arm_fir_f32处理的采样点个数 */
- #define NUM_TAPS 81 /* 滤波器系数个数 */
- #define FIR_StateBufSize BLOCK_SIZE + NUM_TAPS - 1
-
- /*
- *********************************************************************************************************
- * 滤波器系数
- *********************************************************************************************************
- */
- /* 80阶FIR低通滤波器系数 通过fadtool获取系数 Fs = 2Msps, Fc = 100KHz */
- const float32_t firCoeffs32LP_100KHz[NUM_TAPS] = {
- -3.126438727e-19f,-0.0002058673272f,-0.0004228431499f,-0.0006468905485f,-0.0008642434841f,
- -0.001048665727f,-0.001161655295f,-0.001156177954f,-0.0009838859551f,-0.0006050768425f,
- 8.391786605e-19f,0.0008203662583f, 0.00180617522f, 0.002865221584f, 0.003865677863f,
- 0.004645895679f, 0.005031134468f, 0.004856021609f, 0.00399050815f, 0.002366269007f,
- -2.110346192e-18f,-0.002989985514f,-0.006377025973f,-0.009831513278f, -0.01293939352f,
- -0.0152332196f, -0.01623356342f, -0.01549717132f, -0.01266706176f, -0.007519159f,
- 3.381513724e-18f, 0.009749332443f, 0.0213866625f, 0.03438147902f, 0.04804687202f,
- 0.06158847734f, 0.07416618615f, 0.08496309072f, 0.09325480461f, 0.09847255051f,
- 0.1002533659f, 0.09847255051f, 0.09325480461f, 0.08496309072f, 0.07416618615f,
- 0.06158847734f, 0.04804687202f, 0.03438147902f, 0.0213866625f, 0.009749332443f,
- 3.381513724e-18f, -0.007519159f, -0.01266706176f, -0.01549717132f, -0.01623356342f,
- -0.0152332196f, -0.01293939352f,-0.009831513278f,-0.006377025973f,-0.002989985514f,
- -2.110346192e-18f, 0.002366269007f, 0.00399050815f, 0.004856021609f, 0.005031134468f,
- 0.004645895679f, 0.003865677863f, 0.002865221584f, 0.00180617522f,0.0008203662583f,
- 8.391786605e-19f,-0.0006050768425f,-0.0009838859551f,-0.001156177954f,-0.001161655295f,
- -0.001048665727f,-0.0008642434841f,-0.0006468905485f,-0.0004228431499f,-0.0002058673272f,
- -3.126438727e-19f
- };
-
- /* 其它截止频率对应的系数未贴出 */
-
- /*
- *********************************************************************************************************
- * 函 数 名: DSO_FirFilter_Step100KHz
- * 功能说明: FIR滤波器。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void DSO_FirFilter_Step100KHz(void)
- {
- arm_fir_instance_f32 S;
- uint16_t i;
-
- /* 获取要滤波的数值 */
- for(i = 0; i < BLOCK_SIZE; i++)
- {
- FirDataInput[i] =g_DSO1->usWaveBufTemp[i+g_DSO1->sCurTriPos+g_DSO1->sCurTriStep];
- }
-
- /* FIR低通滤波器,截止频率100KHz */
- if(g_DSO1->ucFirFlter_Step100KHz == 1)
- {
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP_100KHz[0], &firStateF32[0], BLOCK_SIZE);
- }
- /* FIR低通滤波器,截止频率200KHz */
- else if(g_DSO1->ucFirFlter_Step100KHz == 2)
- {
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP_200KHz[0], &firStateF32[0], BLOCK_SIZE);
- }
- /* FIR低通滤波器,截止频率300KHz */
- else if(g_DSO1->ucFirFlter_Step100KHz == 3)
- {
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP_300KHz[0], &firStateF32[0], BLOCK_SIZE);
- }
- /* FIR低通滤波器,截止频率400KHz */
- else if(g_DSO1->ucFirFlter_Step100KHz == 4)
- {
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP_400KHz[0], &firStateF32[0], BLOCK_SIZE);
- }
- /* FIR低通滤波器,截止频率500KHz */
- else if(g_DSO1->ucFirFlter_Step100KHz == 5)
- {
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP_500KHz[0], &firStateF32[0], BLOCK_SIZE);
- }
- /* FIR低通滤波器,截止频率600KHz */
- else if(g_DSO1->ucFirFlter_Step100KHz == 6)
- {
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP_600KHz[0], &firStateF32[0], BLOCK_SIZE);
- }
- /* FIR低通滤波器,截止频率700KHz */
- else if(g_DSO1->ucFirFlter_Step100KHz == 7)
- {
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP_700KHz[0], &firStateF32[0], BLOCK_SIZE);
- }
-
- /* 80阶FIR滤波 */
- arm_fir_f32(&S, FirDataInput, FirDataOutput, BLOCK_SIZE);
-
- ·
- for(i = 0; i < DSOSCREEN_LENGTH; i++)
- {
- g_DSO1->usWaveBuf[i] =FirDataOutput[i+50];
- }
- }
复制代码上面的代码中有三个重要的地方: (2)FIR滤波器有一个重要的概念就是群延迟,当波形经过FIR滤波器后,输出的波形会有一定的延迟。对于线性相位的FIR,这个群延迟就是一个常数。但是实际应用中这个群延迟是多少呢,关于群延迟的数值,Matlab的fdatool 工具箱会根据用户的配置计算好。比如我们这里设计的80阶FIR低通滤波器的群延迟就是40,反应在实际的采样值上就是滤波后输出数据的第41个才是实际滤波后的波形数据起始点。 程序中为了方便起见,每次都是处理650个数据,直接使用滤波结果的后600个数据。更多关于延迟的知识,看我们DSP教程第37章的37.8小节即可。 (3)FIR滤波器涉及到的函数arm_fir_init_f32和arm_fir_f32也是在DSP教程第37章进行了讲解。
关于二代示波器的FIR滤波器设计就为大家说这么多,更多这方面的知识需要学习我们的DSP教程。
|