我试图用 numpy 证明正弦波的量化噪声与 SNR = 1.761 + 6.02 * Q 的 SNR 公式相匹配。
numpy 代码很简单:
import numpy as np
import matplotlib
from matplotlib import pylab, mlab, pyplot
plt = pyplot
from pylab import *
from numpy import *
from scipy import signal
def quantization_noise(quant):
N=8192
freq = 128
x = np.linspace(0., 1., N)
y1 = 0.5 * np.sin(2 * np.pi * freq * x)
y2 = (np.floor(quant * (y1)) / quant)
diff = y2 - y1
freqs = fftfreq(N)
x_mask = freqs >= 0
Y1 = np.fft.fft(y1)
Y2 = np.fft.fft(y2)
Y1db = 20 * np.log10(np.abs(Y1) / N * 4)[x_mask]
Y2db = 20 * np.log10(np.abs(Y2) / N * 4)[x_mask]
plt.plot(freqs[x_mask], Y1db, 'bx', label = "input")
plt.plot(freqs[x_mask], Y2db, 'r-', label = "output")
#plt.plot(freqs[x_mask], Y1db, 'bx')
plt.ylim([-140, 5])
plt.xlim([0, 0.5])
snr = np.amax(Y2db[3*int(freq):])
print(snr)
plt.plot([0.0, 0.5], [snr, snr], 'm-.', linewidth=1.0)
plt.text(0.3, snr+4, "SNR=%4.1fdB" % snr)
plt.grid(True)
plt.legend(loc=1)
if True:
plt.figure(figsize=(10,6))
quantization_noise(8)
tight_layout()
plt.savefig("quantization_noise_8.png")
plt.figure(figsize=(10,6))
quantization_noise(16)
tight_layout()
plt.savefig("quantization_noise_16.png")
当我查看结果时,我得到 3 位量化的 SNR 为 27.4dB。理论预测为19.8db。
同样,对于 4 位量化,我得到 36.1dB 的 SNR:比 3 位高约 9dB,而 3 位的增量为 6dB。
最后,我想展示如何使用 16 位 A/D 转换,你最终会得到 98dB,但是随着量化级别的增加,输出频谱越来越接近输入频谱,这是一个连续的下降斜率,它提出了一个问题,什么时候某些东西被认为是噪声而不是信号的一部分。
我使用了一个汉宁窗来更好地隔离主信号的旁瓣,对于 3 位量化,这使得 SNR 从之前的 27.4dB 上升到 33.3dB:
我试图找出我的理解不足的地方。
我如何用数字证明 1.761 + 6.02Q 理论的有效性?
汤姆