MATLAB 中的滤波器系数始终为浮点数据类型

信息处理 过滤器 matlab
2022-02-02 10:51:32

我将在我的代码中使用 MATLAB 生成的滤波器系数,该代码将在微控制器上运行。可怜的微控制器在浮点运算方面非常糟糕。那我该怎么办?我应该直接将所有浮点值截断到最接近的 int 吗?我应该做 ceil 吗?还是地板?是否有任何功能可以自动为我进行这种转换?

更新 我所有的过滤器系数都像:0.465、0.76、0.23 等,所以如果我使用 ciel,那么所有的都将变为零。我现在该怎么办?

实际滤波器系数为:

> -0.00385638
>  0.004944457
>  0.01505063
>  0.018768283
>  0.009635631
> -0.01192891
> -0.035809426
> -0.045043857
> -0.023993426
>  0.032106934
>  0.111777547
>  0.18997355
>  0.238374966
>  0.238374966
>  0.18997355
>  0.111777547
>  0.032106934
> -0.023993426
> -0.045043857
> -0.035809426
> -0.01192891
> 0.009635631
> 0.018768283
> 0.01505063
> 0.004944457
> -0.00385638
4个回答

通常,您会使用定点算法在浮点挑战 CPU 上执行 DSP。

因此,对于范围为 -1.0 到 +1.0 的 16 位定点系数,您的系数将转换为例如:

0.465    =>    0.465 * 0x7fff = 0x3b5

如果您的微控制器不直接支持定点算术(大多数 DSP 支持,通用微控制器通常不支持),那么您在乘法或除法时需要注意缩放。(当然,加法和减法正常工作,前提是您没有混合不同的定点类型。)

如果您的系数包含在向量“h”中,请将它们乘以 2^15,然后使用 int16() 函数。

例如:

coeffs = int16(h*2^15);

这将使它们以整数格式填充 16 位有符号整数的跨度,然后您可以从那里将系数导出到标题或分隔数据文件。处理器不关心它们是整数还是小数。就它而言,它只是一个二进制模式。由程序员决定这些模式的含义。

定点信号处理比浮点复杂得多。定点相关问题包括:量化噪声、系数量化、上溢、下溢、饱和、极限环等。

例如,编写一个定点 IIR 滤波器,需要对滤波器拓扑、输入和输出信号统计、状态变量行为和滤波器传递函数进行相当彻底的分析。

除非您有一个非常简单的任务,例如具有众所周知的系数的低阶 FIR 滤波器,否则我建议您进行一些教科书学习。

您应该使用 2^^(小数位数)对于带有 15 个小数位的有符号 16 位 - 您将乘以 32768。范围是 +32767 到 -32768。1/32768 是您的 lsb 值。要将浮点数转换为固定点 - 如上所示相乘,然后舍入。注意 +1,因为它实际上高于 15 小数并且需要一个整数位。在您的情况下,您会将正数饱和到不大于 32767。