量化噪声详解

量化噪声详解

目录

  1. 前言
  2. 量化与量化噪声的基本概念
  3. 均匀量化模型
    1. 量化步长 (Quantization Step) 与电平
    2. 量化误差的数学表示
    3. 量化误差的统计分布与方差
  4. 量化信噪比 (SNR) 的详细推导
    1. 正弦波输入时的SNR推导
    2. 常用近似公式
    3. ENOB (有效位数)
  5. 非理想因素与进阶讨论
    1. 失配、偏置与增益误差
    2. 动态范围与截幅 (Clipping)
    3. 抖动 (Dithering)
    4. 过采样 (Oversampling)
    5. 量化方式:Mid-Riser 与 Mid-Tread
  6. 量化噪声的示例仿真
  7. 总结
  8. 代码
    1. 简要说明

前言

在现代的数字信号处理中,我们需要将模拟信号(如电压、电流等)转换为数字信号(一系列离散取值)。这个从连续到离散的转换由模数转换器 (ADC) 完成,量化 (Quantization) 便是ADC里不可或缺的步骤。量化会不可避免地产生“量化噪声”,它本质上是信号在离散表示时和“真实”幅度之间的误差。尽管量化噪声有时很小,但对于高精度应用、雷达、医疗成像、通信系统等场景,了解并合理控制量化噪声是至关重要的。


量化与量化噪声的基本概念

  • 量化 (Quantization)
    将输入的模拟幅度(连续值)映射为有限个离散幅度值的过程。通常由“量化步长”或“量化电平数”来描述离散化的精度。

  • 量化噪声 (Quantization Noise)
    由于舍入或截断导致的误差,可视作信号中额外添加的随机噪声;它会降低信号质量,减少系统的有效分辨率。


均匀量化模型

量化步长 (Quantization Step) 与电平

在最常见的均匀量化 (Uniform Quantization) 中,我们将满量程范围 [ − V ref , + V ref ] [-V_{\text{ref}}, +V_{\text{ref}}] [Vref,+Vref] 划分成 2 B 2^B 2B 个相等区间,其中 B B B 为量化位数 (bits)。则每个区间的宽度(量化步长)为:
Δ = 2 V ref 2 B = V ref 2 B − 1 . \Delta = \frac{2V_{\text{ref}}}{2^B} = \frac{V_{\text{ref}}}{2^{B-1}}. Δ=2B2Vref=2B1Vref.
每个区间都会对应一个离散电平值(例如区间中点),使得输入信号被映射到最邻近的离散值。

量化误差的数学表示

记输入信号为 x ( n ) x(n) x(n),量化输出(对应离散电平)为 x ^ ( n ) \hat{x}(n) x^(n)。则量化误差 ε ( n ) \varepsilon(n) ε(n) 为:
ε ( n ) = x ( n ) − x ^ ( n ) . \varepsilon(n) = x(n) - \hat{x}(n). ε(n)=x(n)x^(n).
在均匀量化且不发生截幅 (Clipping) 的理想情况下,
ε ( n ) ∈ [ − Δ 2 , + Δ 2 ) . \varepsilon(n) \in \left[-\frac{\Delta}{2}, +\frac{\Delta}{2}\right). ε(n)[2Δ,+2Δ).
这意味着量化误差的绝对值不超过半个量化步长。

量化误差的统计分布与方差

在理论分析中,如果输入信号幅值变化较快、分布较宽,那么量化误差通常可近似视为均匀分布 [ − Δ 2 , + Δ 2 ] \left[-\tfrac{\Delta}{2}, +\tfrac{\Delta}{2}\right] [2Δ,+2Δ]
ε ∼ U ( − Δ 2 , Δ 2 ) . \varepsilon \sim U\left(-\frac{\Delta}{2}, \frac{\Delta}{2}\right). εU(2Δ,2Δ).
其均值约为0(假设输入信号无偏置),方差为:
σ ε 2 = Δ 2 12 . \sigma_{\varepsilon}^2 = \frac{\Delta^2}{12}. σε2=12Δ2.
这是后续推导SNR的重要基础。


量化信噪比 (SNR) 的详细推导

正弦波输入时的SNR推导

设输入信号为满量程的正弦波(幅度接近 V ref V_{\text{ref}} Vref),用该正弦波来衡量量化器的效果是常见的分析方法。

  1. 信号功率
    若输入为
    x ( t ) = A sin ⁡ ( ω t ) , x(t) = A \sin(\omega t), x(t)=Asin(ωt),
    其均方值(RMS)约为 A 2 \tfrac{A}{\sqrt{2}} 2 A,故功率为
    P signal = A 2 2 . P_{\text{signal}} = \frac{A^2}{2}. Psignal=2A2.
    如果最大幅度 A ≈ V ref A \approx V_{\text{ref}} AVref,则
    P signal ≈ V ref 2 2 . P_{\text{signal}} \approx \frac{V_{\text{ref}}^2}{2}. Psignal2Vref2.

  2. 噪声功率
    理想均匀量化下,量化噪声可视为均匀分布区间宽度为 Δ \Delta Δ。其方差即噪声功率:
    P noise = σ ε 2 = Δ 2 12 . P_{\text{noise}} = \sigma_{\varepsilon}^2 = \frac{\Delta^2}{12}. Pnoise=σε2=12Δ2.
    Δ = 2 V ref 2 B \Delta = \frac{2V_{\text{ref}}}{2^B} Δ=2B2Vref,故
    P noise = 1 12 ( 2 V ref 2 B ) 2 = V ref 2 3 ⋅ 2 2 B . P_{\text{noise}} = \frac{1}{12} \left(\frac{2V_{\text{ref}}}{2^B}\right)^2 = \frac{V_{\text{ref}}^2}{3 \cdot 2^{2B}}. Pnoise=121(2B2Vref)2=322BVref2.

  3. 量化SNR (线性比)
    SNR quant = P signal P noise = V ref 2 2 V ref 2 3 ⋅ 2 2 B = 3 2 ⋅ 2 2 B − 1 = 3 2 ⋅ 2 2 B − 1 . \text{SNR}_{\text{quant}} = \frac{P_{\text{signal}}}{P_{\text{noise}}} = \frac{\tfrac{V_{\text{ref}}^2}{2}}{\tfrac{V_{\text{ref}}^2}{3 \cdot 2^{2B}}} = \frac{3}{2} \cdot 2^{2B-1} = \frac{3}{2} \cdot 2^{2B-1}. SNRquant=PnoisePsignal=322BVref22Vref2=2322B1=2322B1.

  4. SNR (分贝dB)
    取对数(10倍数):
    SNR quant ( dB ) = 10 log ⁡ 10  ⁣ ( SNR quant ) = 10 log ⁡ 10 ( 3 2 ) + 10 log ⁡ 10 ( 2 2 B − 1 ) . \text{SNR}_{\text{quant}}(\text{dB}) = 10 \log_{10}\!\Bigl(\text{SNR}_{\text{quant}}\Bigr) = 10 \log_{10}\bigl(\tfrac{3}{2}\bigr) + 10 \log_{10}\bigl(2^{2B-1}\bigr). SNRquant(dB)=10log10(SNRquant)=10log10(23)+10log10(22B1).
    经简化与常数近似,通常得
    SNR quant ( dB ) ≈ 6.02 B + 1.76  dB . \text{SNR}_{\text{quant}}(\text{dB}) \approx 6.02B + 1.76 \text{ dB}. SNRquant(dB)6.02B+1.76 dB.

常用近似公式

上式 (6.02B + 1.76 dB) 是一个非常著名的经验近似式,用于快速估算理想均匀量化情况下的SNR上限。

ENOB (有效位数)

若实际测得的SNR(或SINAD)为 SNR dB \text{SNR}_{\text{dB}} SNRdB,则可通过有效位数 (ENOB) 概念来表征ADC的真实分辨性能:
ENOB = SNR dB − 1.76 6.02 . \text{ENOB} = \frac{\text{SNR}_{\text{dB}} - 1.76}{6.02}. ENOB=6.02SNRdB1.76.
ENOB比理想位数B通常要低,反映了噪声、失配、失真等非理想因素的影响。


非理想因素与进阶讨论

失配、偏置与增益误差

  • 失配 (Mismatch):ADC内部各比较器或电容阵列等存在工艺不一致,造成量化台阶宽度并非严格均匀。
  • 偏置 (Offset):系统性的零点漂移,使输出数值整体偏大或偏小。
  • 增益误差 (Gain Error):量程不准确,导致标度比例有误差。

这些都会使真实系统的量化噪声与理想模型偏离。

动态范围与截幅 (Clipping)

如果输入幅度超过 ± V ref \pm V_{\text{ref}} ±Vref,便会发生截幅。截幅会带来明显的失真,远大于均匀量化时的随机噪声。因此在设计系统时,需要控制输入信号动态范围,以防止过载。

抖动 (Dithering)

抖动是向信号中添加一小部分随机噪声,使量化误差分布更加平滑、减少伪信号(谐波失真)的技术。

  • 对于高分辨率但低幅度的信号,抖动可提高测量线性度;
  • 对于某些音频ADC中,抖动是一种常用技巧。

过采样 (Oversampling)

通过提高采样率,并在数字域对信号做滤波+抽 decimation,可以平均化量化噪声并提升有效分辨率。

  • 例如在过采样因子 M M M倍时,量化噪声功率可近似减少 M M M倍;
  • 这是许多高端音频ADC (如Δ-Σ架构)所采用的关键手段。

量化方式:Mid-Riser 与 Mid-Tread

  1. Mid-Riser:区间边缘在0附近;若量化级为偶数,则0值恰在两个量化等级交界处;
  2. Mid-Tread:中点(一个量化级)在0附近,通常便于表示零电平。
    以上两种对量化误差的具体分布略有区别,但总体分析与均匀量化模型一致。

量化噪声的示例仿真

实验思路:

  1. 生成一个模拟信号(如正弦波);
  2. 将其量化到指定位数;
  3. 计算量化前后信号之差(量化噪声);
  4. 观察实际量化噪声的分布和功率,对比理论值。

总结

  • 量化噪声是将连续幅度映射为离散幅度引起的舍入/截断误差;
  • 在理想模型中,可视为服从均匀分布的随机变量,方差约为 Δ 2 12 \tfrac{\Delta^2}{12} 12Δ2
  • SNR ≈ 6.02B + 1.76 dB 是经典结论,表征了理想均匀量化的上限性能;
  • 实际系统里,偏置、非线性、热噪声等会拉低系统SNR,ENOB往往小于理论位数;
  • 通过抖动、过采样等手段可以在一定程度上改善量化噪声特性。

代码

import numpy as np
import matplotlib.pyplot as plt

def uniform_quantize(signal, bits, v_ref):
    """
    对输入信号进行均匀量化,返回量化后的波形和量化级索引。
    
    signal : 1D numpy array, 输入模拟信号
    bits   : int, 量化位数
    v_ref  : float, 满量程的一半(即量程为 [-v_ref, +v_ref])
    """
    levels = 2 ** bits  # 量化电平数
    delta = 2 * v_ref / levels  # 量化步长

    # 将信号裁剪在 [-v_ref, +v_ref] 范围
    clipped_signal = np.clip(signal, -v_ref, v_ref)

    # 平移到 [0, 2*v_ref], 再除以步长
    q_index = np.floor((clipped_signal + v_ref) / delta)

    # 防止越界
    q_index = np.clip(q_index, 0, levels - 1)

    # 将量化索引映射回电压值(这里采取中点映射: + delta/2)
    quantized_signal = q_index * delta - v_ref + delta/2.0
    
    return quantized_signal, q_index

# ======= 示例:量化噪声仿真 =======
fs = 1000     # 采样率
f_sin = 50    # 正弦频率
t = np.arange(0, 0.02, 1/fs)  # 只取 0.02 s 进行演示

# 生成模拟正弦波, 幅度接近满量程
bits = 8      # 量化位数
v_ref = 1.0   # 满量程半幅
amp = 0.95 * v_ref  # 避免达到极限
analog_signal = amp * np.sin(2 * np.pi * f_sin * t)

# 进行量化
quant_signal, q_idx = uniform_quantize(analog_signal, bits, v_ref)

# 计算量化噪声
quant_noise = quant_signal - analog_signal

# 绘图
plt.figure(figsize=(12,6))

plt.subplot(2,1,1)
plt.title(f"Analog vs. {bits}-bit Quantized Signal")
plt.plot(t, analog_signal, label="Analog Signal")
plt.plot(t, quant_signal, label="Quantized Signal", linestyle='--')
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.legend()

plt.subplot(2,1,2)
plt.title("Quantization Noise")
plt.plot(t, quant_noise, color='r')
plt.xlabel("Time (s)")
plt.ylabel("Error")
plt.tight_layout()
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DuHz

喜欢就支持一下 ~ 谢谢啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值