【问题标题】:Calculate Quantization error in MATLAB在 MATLAB 中计算量化误差
【发布时间】:2023-03-18 23:48:01
【问题描述】:

我在我的课程材料中得到了这个问题的解决方案。

问题:

10 sample/sec 采样的信号x(t)。考虑x(t)中的第一个10 samples

x(t) = 0.3 cos(2*pi*t);

使用 8 位量化器找出量化误差。

解决方案:

(256 quantisation levels)
t=1:10;
x=(0.3)*cos(2*pi*(t-1)/10);
mx=max(abs(x));
q256=mx*(1/128)*floor(128*(x/mx));
stem(q256)
e256=(1/10)*sum(abs(x-q256))
Error: e256 = 9.3750e-04

对此没有解释,能否详细解释一下这是如何计算的?

【问题讨论】:

    标签: matlab signal-processing pcm quantization


    【解决方案1】:

    对于我更喜欢​​的前两行代码,

    Fs = 10;
    L = 10;
    t = (0 : L - 1) / Fs;
    x = 0.3 * cos(2 * pi * t);
    

    Fs 是采样频率,L 是采样数,t 是时间。

    注意x 是频率为Fx = 1 Hz 的正弦曲线,或者我们可以说它是周期性的Tx = 1 sec

    对于8-bit 量化,我们有256 级别。由于L / Fs = [10 sample] / [10 sample/sec] = 1 sec 等于Txx 的整个周期),我们可以使用正样本。

    mx = max(abs(x));
    

    mx 被定义是因为为了使用floor,我们需要缩放x

    q256 = mx*(1/128)*floor(128*(x/mx));
    

    mx 显示x 的最大值,因此x / mx 将采用[-1 1]128*x/mx 以上的值[-128 128] 将覆盖所有256 级别。

    所以我们将使用floor 对其进行量化,然后将其缩小(mx*1/128)。

    e256 = (1/L)*sum(abs(x-q256))
    

    e256 仅显示 10 个样本的平均误差。

    请注意,如果 L / Fs < Tx 则此量化将不是最佳量化。

    记住

    给你的答案有些问题!

    假设x = [-1 -.2 0 .7 1];,我们想用2位量化它。

    mx = max(abs(x));
    q4 = mx * (1/2) * floor(2*(x/mx));
    

    将提供具有5 级别的q4 = [-1 -0.5 0 0.5 1](而不是2^2 = 4)。

    这可能不是什么大问题,你可以删除关卡x=1并拥有q4 = [-1 -0.5 0 0.5 0.5],但代码仍然需要一些改进,当然错误会增加。

    一个简单的解决方案是添加

    [~,ind] = max(x);
    x(ind) = x(ind) - 1e-10;
    

    在定义mx 之后,x 的最大值将被量化到低一级。

    错误将增加到0.0012

    【讨论】:

    • 确实如此。如果我被要求使用 2 位量化器找到误差,我可以简单地从量化信号中减去原始信号并绘制误差(在 matlab 上)。
    • @connor991,我用给定的代码提供了一个简单的解决方案。看看有没有帮助。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多