更快地找到样本量化级别的方法

信息处理 声音 模数
2022-02-10 14:38:25

给定表示声音信号的实数序列,即 [1.8, 2.2, 2.2, 1.9, -1.5, -0.7],我们必须通过将范围 [-4, 4] 划分为 32 个相等的部分来量化该序列。

如果我们必须用传统方式来做这件事,我们需要编写 32 个不同的范围

[-4 , -3.75]

[-3.75, 3.5]

. . .

并检查真正的价值在哪一个。

还有另一种方法可以实现这一目标吗?也许带有标准化功能或什么?

2个回答

正如 Florian 所暗示的,要将任何量化为具有 ,您可以应用以下函数:x[n]Ry[n]ZK

y[n]=round(x[n]min(x)range(x)(K1))

其中表示序列的长度。n[0,1,2..|x|]|.|

这会将您的从其范围映射到长范围。xmin(x)..max(x)[0..K)

例如(在Octave中):

Fs = 100; #Sampling frequency (in Hz)
f = 4; # Frequency of a simple sinusoidal signal (in Hz)
T = 1; # Timeframe length (in seconds)
K = 5; # Number of levels to quantise to
t = 0:(1./Fs):(T-(1./Fs));
p = 2.0 * pi * t;
x = sin(f*p);
y = round(((x-min(x))/2.0) * (K-1));
plot(y);
xlabel("Discrete time (sample)");
ylabel("Amplitude");
grid on;

产生:

在此处输入图像描述

你可能还想看uencode

希望这可以帮助。

量化的输入是浮点数向量,输出是整数,因此需要一个类型转换步骤。

一种有效的量化算法如下

  1. 计算量化级别(在您的情况下为 32)与值范围(-4 到 4,因此在您的情况下为 8。结果将是32/8=4
  2. 将序列乘以该比率
  3. 添加 0.5
  4. 使用“截断”转换为整数(这是大多数语言的默认行为)

所以基本上你将浮点向量缩放到与量化级别相同的范围(从-16 .. 15),然后使用适当的舍入方法简单地转换为整数。这是通过添加 0.5 然后截断或“向 -infinity 舍入”来完成的。这通常比使用内置舍入函数便宜得多。

这里剩下的一个问题是量化网格是不对称的,即它从-16 到+15。给定上面的量化方法,你偶尔也会得到+16,所以你要么需要剪掉这些值,要么增加值范围以适应过冲。这只是非常低位量化的问题(就像你在这里的 5 位一样)