使用滤波器 每当有一个frame的采样需要滤波时, 软件触发滤波器. 新的采样存在系统内存中, 使用双缓冲方式.
static int16_t aInputValues[2][2048];
int CurrentInputArraySize = 2048;
双缓冲方式下, 一个frame的采样值正在被处理的同时, 另外一个frame可以接收新的采样输入. 这里使用一个变量表示正在被使用的frame: 以下数组用来存储输出数据:
static int16_t aCalculatedFilteredData[2048];
int ExpectedCalculatedFilteredDataSize = 2048;
软件触发上一个frame的最后的51个采样的预加载. 这是为了将滤波器恢复到FMAC被停止时的状态.
if (HAL_FMAC_FilterPreload_DMA(&hfmac,
&aInputValues[CurrentInputArray][1997], 51, NULL, 0) != HAL_OK)
Error_Handler();
/* Switch frames */
Frame ? Frame=0 : Frame=1;
当预加载结束(通过相应的DMA通道的中断来获知),软件触发DMA的写通道将当前frame的数据写到FMAC : if (HAL_FMAC_AppendFilterData(&hfmac, &aInputValues[CurrentInputArray][0],
&CurrentInputArraySize) != HAL_OK)
Error_Handler();
之后软件启动FMAC:
if (HAL_FMAC_FilterStart(&hfmac, aCalculatedFilteredData,
&ExpectedCalculatedFilteredDataSize) != HAL_OK)
Error_Handler();
此时FMAC开始计算输出采样,并将其写入输出buffer. 对于每个采样值, FMAC在DMA的读通道产生一个请求, DMA会将新的采样值搬运到内存中. 这个过程不需要软件干预一值持续进行, 直到整个frame的数据处理完毕. 此时DMA的读通道产生一个中断, CPU收到这个中断信号后关闭FMAC:
if (HAL_FMAC_FilterStop(&hfmac) != HAL_OK)
Error_Handler();
如果滤波器的系数需要更新, 此时可以再次调用HAL_FMAC_FilterConfig()函数. 新的系数应该在更新之前存入aFilterCoeffB[]; 要处理下一个frame, 重复上述过程即可, 从预加载开始:
(HAL_FMAC_FilterPreload_DMA()).
|