量化噪声详解
目录
前言
在现代的数字信号处理中,我们需要将模拟信号(如电压、电流等)转换为数字信号(一系列离散取值)。这个从连续到离散的转换由模数转换器 (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=2B−1Vref.
每个区间都会对应一个离散电平值(例如区间中点),使得输入信号被映射到最邻近的离散值。
量化误差的数学表示
记输入信号为
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),用该正弦波来衡量量化器的效果是常见的分析方法。
-
信号功率
若输入为
x ( t ) = A sin ( ω t ) , x(t) = A \sin(\omega t), x(t)=Asin(ωt),
其均方值(RMS)约为 A 2 \tfrac{A}{\sqrt{2}} 2A,故功率为
P signal = A 2 2 . P_{\text{signal}} = \frac{A^2}{2}. Psignal=2A2.
如果最大幅度 A ≈ V ref A \approx V_{\text{ref}} A≈Vref,则
P signal ≈ V ref 2 2 . P_{\text{signal}} \approx \frac{V_{\text{ref}}^2}{2}. Psignal≈2Vref2. -
噪声功率
理想均匀量化下,量化噪声可视为均匀分布区间宽度为 Δ \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=3⋅22BVref2. -
量化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=3⋅22BVref22Vref2=23⋅22B−1=23⋅22B−1. -
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(22B−1).
经简化与常数近似,通常得
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.02SNRdB−1.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
- Mid-Riser:区间边缘在0附近;若量化级为偶数,则0值恰在两个量化等级交界处;
- Mid-Tread:中点(一个量化级)在0附近,通常便于表示零电平。
以上两种对量化误差的具体分布略有区别,但总体分析与均匀量化模型一致。
量化噪声的示例仿真
实验思路:
- 生成一个模拟信号(如正弦波);
- 将其量化到指定位数;
- 计算量化前后信号之差(量化噪声);
- 观察实际量化噪声的分布和功率,对比理论值。
总结
- 量化噪声是将连续幅度映射为离散幅度引起的舍入/截断误差;
- 在理想模型中,可视为服从均匀分布的随机变量,方差约为 Δ 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()