【问题标题】:Quantizing a complex signal with uniform quantizer in matlab在matlab中使用统一量化器量化复杂信号
【发布时间】:2015-09-25 08:32:12
【问题描述】:

我有一个信号具有复杂的正态分布,均值为 0,方差为 1。我想用统一的量化器将其量化为 512 级。我通过以下方式在 MATLAB 中生成信号-

s = sqrt(0.5).*(randn(1,numBits) + 1i*randn(1,numBits));

我正在通过以下方式将范围 (-1,1) 中的信号量化为 512 个级别:

min = -1;

max = 1;

q = (max-min)/2^9;

quantSignal = round(s/q)*q;

这是量化这种信号的正确方法吗?对此我将不胜感激。

【问题讨论】:

  • 量化是一个定义明确的东西吗?如果你知道你想要达到什么,你应该能够确定你的解决方案是否正确。从语法上讲,您写的内容是合理的。也许您可以详细说明为什么它不是是“量化此类信号的正确方法”。
  • 好吧,我认为量化间隔 (-1,1) 可能不足以正确量化信号 s。由于我是信号处理领域的新手,因此我想获得对此的反馈!因此我发布了这个问题!
  • 好的,在这种情况下,我会让信号处理人员解决这个问题:P 如果它与信号处理密切相关,请考虑添加相应的标签(量化是一个小而模糊的标签)。作为外行,我认为正常数据强烈聚集在 0 附近,距离很远。那么:对数量化是一回事吗?
  • 好的,我会添加标签:)

标签: matlab signal-processing quantization


【解决方案1】:

您使用的量化公式会将输入值映射到量化版本。但是,它不会将结果限制为仅 512 个级别,因为您的输入信号可能会超出 [-1,+1] 范围,并且您没有做任何事情来限制量化器输出(或就此而言的输入)。

要限制值,您可以使用 minmax 内置函数。但是,由于它们使用复数的模数,因此您必须首先将数字拆分为实部和虚部。因此,量化复数的实部和虚部,每个都限制在[minValue,maxValue] 范围内:

q = (maxValue-minValue)/(2^9-1);
realPart = min(max(real(s),minValue),maxValue);
realPart = minValue + round((realPart-minValue)/q)*q;
imagPart = min(max(imag(s),minValue),maxValue);
imagPart = minValue + round((imagPart-minValue)/q)*q;
quantSignal = realPart + j*imagPart;

我之前提到过,具有单位方差的正常信号通常不会限制在 [-1,1] 范围内(或任何范围内)。因此,通常尝试最小化量化误差的度量,例如均方误差(未量化输入和相应量化输出之间的平方差的期望值)。

对于统一量化器和给定的特定信号特征(在本例中为复高斯信号),该均方误差是量化级别数和量化器输入范围的函数。对于 512 级,理想情况下,实部和虚部应在大约 +/- 4.2 标准偏差内。由于实部和虚部的标准偏差为sqrt(0.5),因此可以使用

maxValue = 4.2*sqrt(0.5);
minValue = -maxValue;

如果您需要将量化输出的实部和虚部限制在特定范围内,那么您可以在量化器的输出处应用缩放因子(例如,除以 4.2*sqrt(0.5) 以获得实部和虚部限制为[-1,+1])。

【讨论】:

  • 感谢您的有用意见。不过我想知道您是如何在 512 个关卡中获得 +/- 4.2 的。
  • 基本上通过 sum(integral((x-level(i))^2 pdf(x))) 计算maxValue 的不同值的均方误差,绘制并找到最小值。
  • 我观察到,在从 [-4.2*sqrt(0.5),4.2*sqrt(0.5)] 定义量化器范围后,原始信号被削波。如果我增加量化器的范围,削波的问题就消失了。有没有办法计算量化范围以避免原始信号的削波?
  • 高斯信号的范围是无限的,这意味着你总会得到一点削波。范围越大,削波的可能性就越小(但它永远不会完全消失)。然而,由于级别数量有限,更大的范围也意味着更大的量化步长,这会导致更多的量化误差。 +/- 4.2*sqrt(0.5) 对于 512 级,在削波引入的误差和量化器输出范围内的量化误差之间取得平衡(在均方误差意义上)。
  • 几乎。 q 是您的步长,而您应该从中心检测到超过总范围一半的任何东西。此外,剪裁符号通常是实部或虚部被剪裁的符号(但如果实部和虚部被剪裁,则不应计算两次)。所以:mu=0.5*(minValue+maxValue); halfrng=0.5*(maxValue-minValue); numClipped=length(union(find(abs(real(s)-mu)>halfrng), find(abs(imag(s)-mu)>halfrng));`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多