|
本帖最后由 黄毅7789 于 2018-4-1 22:36 编辑
单片机:STM32F303RE(M4内核,带FPU)
使用arm_fir_f32函数数值异常:
程序:
- #define TEST_LENGTH_SAMPLES 1000 /* 采样点数 */
- #define BLOCK_SIZE 100 /* 调用一次arm_fir_f32处理的采样点个数 */
- #define NUM_TAPS 29 /* 滤波器系数个数 */
- uint32_t blockSize = BLOCK_SIZE;
- uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_fir_f32的次数 */
- //static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
- static float32_t testOutput[TEST_LENGTH_SAMPLES]; /* 滤波后的输出 */
- static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; /* 状态缓存,大小numTaps + blockSize - 1*/
- /* 带通滤波器系数 通过fadtool获取*/
- const float32_t firCoeffs32BP[NUM_TAPS] = {
- -0.00831860397,-0.003651876235, 0.005030068569, 0.01898931712, 0.03306612372,
- 0.03607933968, 0.01776700467, -0.02197688632, -0.06858944148, -0.09779074788,
- -0.08857547492, -0.03685576096, 0.03913307562, 0.1061559916, 0.1327688545,
- 0.1061559916, 0.03913307562, -0.03685576096, -0.08857547492, -0.09779074788,
- -0.06858944148, -0.02197688632, 0.01776700467, 0.03607933968, 0.03306612372,
- 0.01898931712, 0.005030068569,-0.003651876235, -0.00831860397
- };
复制代码- char table[20]={0};
- u16 i=0;
- arm_fir_instance_f32 S;
- float32_t *inputF32, *outputF32;
- /* 初始化输入输出缓存指针 */
- inputF32 = &aa[0];
- outputF32 = &testOutput[0];
- /* 初始化结构体S */
- arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32BP[0], &firStateF32[0], blockSize);
- /* 实现FIR滤波 */
- for(i=0; i < numBlocks; i++)
- {
- arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
- }
- for(i=0; i<TEST_LENGTH_SAMPLES; i++)
- {
- sprintf(table,"%f\n",testOutput[i]);
- USART1_TX_string(table);
- }
复制代码
以上大部分程序来自“安富莱_STM32-V5开发板_数字信号处理教程(V1.0)”
仅修改
1、采样点数
2、每次处理的点数
3、输入ADC数组的名称
使用arm_fir_q15函数程序跑飞:
程序
- #define TEST_LENGTH_SAMPLES 1000 /* 采样点数 */
- #define BLOCK_SIZE 100 /* 调用一次arm_fir_f32处理的采样点个数 */
- #define NUM_TAPS 29 /* 滤波器系数个数 */
- uint32_t blockSize = BLOCK_SIZE;
- uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_fir_f32的次数 */
- //static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
- static q15_t testOutput[TEST_LENGTH_SAMPLES]; /* 滤波后的输出 */
- static q15_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; /* 状态缓存,大小numTaps + blockSize - 1*/
- /* 带通滤波器系数 通过fadtool获取*/
- const q15_t firCoeffs32BP[NUM_TAPS] =
- {
- -273, -120, 165, 622, 1084, 1182, 582, -720, -2248,
- -3204, -2902, -1208, 1282, 3479, 4351, 3479, 1282, -1208,
- -2902, -3204, -2248, -720, 582, 1182, 1084, 622, 165,
- -120, -273
- };
复制代码- char table[20]={0};
- u16 i=0;
- arm_fir_instance_q15 S;
- q15_t *inputq15, *outputq15;
- /* 初始化输入输出缓存指针 */
- inputq15 = &aa[0];
- outputq15 = &testOutput[0];
- /* 初始化结构体S */
- arm_fir_init_q15(&S, NUM_TAPS, (q15_t *)&firCoeffs32BP[0], &firStateF32[0], blockSize);
- /* 实现FIR滤波 */
- for(i=0; i < numBlocks; i++)
- {
- arm_fir_q15(&S, inputq15 + (i * blockSize), outputq15 + (i * blockSize), blockSize);
- }
- for(i=0; i<TEST_LENGTH_SAMPLES; i++)
- {
- sprintf(table,"%d\n",testOutput[i]);
- USART1_TX_string(table);
- }
复制代码
程序进入arm_fir_q15()内运行这行之后跑飞
|
|