求助,DSP库FIR函数数值异常
本帖最后由 黄毅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; /* 采样点 */
static float32_t testOutput; /* 滤波后的输出 */
static float32_t firStateF32; /* 状态缓存,大小numTaps + blockSize - 1*/
/* 带通滤波器系数 通过fadtool获取*/
const float32_t firCoeffs32BP = {
-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={0};
u16 i=0;
arm_fir_instance_f32 S;
float32_t *inputF32, *outputF32;
/* 初始化输入输出缓存指针 */
inputF32 = &aa;
outputF32 = &testOutput;
/* 初始化结构体S */
arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32BP, &firStateF32, 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);
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; /* 采样点 */
static q15_t testOutput; /* 滤波后的输出 */
static q15_t firStateF32; /* 状态缓存,大小numTaps + blockSize - 1*/
/* 带通滤波器系数 通过fadtool获取*/
const q15_t firCoeffs32BP =
{
-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={0};
u16 i=0;
arm_fir_instance_q15 S;
q15_t *inputq15, *outputq15;
/* 初始化输入输出缓存指针 */
inputq15 = &aa;
outputq15 = &testOutput;
/* 初始化结构体S */
arm_fir_init_q15(&S, NUM_TAPS, (q15_t *)&firCoeffs32BP, &firStateF32, 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);
USART1_TX_string(table);
}
程序进入arm_fir_q15()内运行这行之后跑飞
多试试。 eric2013 发表于 2018-4-2 00:30
多试试。
往哪个方向试,现在毫无头绪。 黄毅7789 发表于 2018-4-2 09:08
往哪个方向试,现在毫无头绪。
别别用定点Q15,定点API涉及到定标的问题,比较麻烦。你现在用的F3是带DSP单元的,就有浮点就好。 本帖最后由 黄毅7789 于 2018-4-3 23:16 编辑
eric2013 发表于 2018-4-3 01:26
别别用定点Q15,定点API涉及到定标的问题,比较麻烦。你现在用的F3是带DSP单元的,就有浮点就好。
ARM库的滤波结果后面的基本相同,但是前面为什么会有个尖峰?
经过测试,这和您的例程和参数得到相同的结果,基本上排除了,移植错误
黄毅7789 发表于 2018-4-3 22:50
ARM库的滤波结果后面的基本相同,但是前面为什么会有个尖峰?
经过测试,这和您的例程和参数得到相 ...
这个是群延迟,注意群延迟问题了没 eric2013 发表于 2018-4-4 01:24
这个是群延迟,注意群延迟问题了没
抱歉我没说清楚,是这里ARM库和MATLAB有明显差异
页:
[1]