我正在编写用于处理以16位PCM样本形式给出的音频的软件。处理的第一阶段涉及计算在特定频率范围(在特定截止频率以上)的能量(或总变化)。

我当前正在做的是从原始信号的能量中减去低通滤波后的信号的能量。我发现很多处理都专用于将整数样本转换为浮点表示。

所以我的问题是,是否有一种过滤整数样本而不将其转换为浮点的技术?

#1 楼

是的,当然可以,您可以使用定点算法将滤波器直接应用于整数样本。

例如,如果您使用系数为[1 / 3、1、1 / 2]的FIR滤波器,以及系数的8位分辨率,您的输出将是:

out[n] = (85 * sample[n] + 256 * sample[n - 1] + 128 * sample[n - 2]) >> 8


要注意两件事:


系数量化最多可能导致滤波器响应发生轻微变化,最坏情况可能导致滤波器不稳定。您的过滤器类型是什么,其系数值是什么?
溢出/数据类型/截断问题。在上面的示例中,out可以超出16位整数的范围,因此您必须进行一些裁剪。


评论


$ \ begingroup $
我认为sample [n-1]应该乘以256;否则,实际上是由$ \ frac {1} {256} $而不是$ 1 $加权。
$ \ endgroup $
–Jason R
2012年4月3日12:47



$ \ begingroup $
你说得对,已编辑!
$ \ endgroup $
–小食
2012年4月3日在14:31

$ \ begingroup $
@pichenettes可以很好地解释您如何得出量化值,有符号与无符号等。由您决定。
$ \ endgroup $
– Jim Clay
2012年4月3日15:07

#2 楼

一些处理器由于消除了流水线的危害,因此在处理整数之前将较大的(但在高速缓存中)整数块转换为浮点数可能会更快。您可能要对此进行基准测试。

如果使用比例整数或定点算法,则系数和中间值所需的增加的整数精度的数量大致与采样率之间的比率成比例和您想要的截止频率。您可能需要在16位样本上使用24、32、48位或更多精度的整数算术,才能降至所需的数字本底噪声水平。为此,某些处理器指令集(ARM,MIPS等)可能包括64位累加算法。