基本抖动而无噪声整形
没有噪声整形的基本抖动量化工作如下:
图1.基本的抖动量化系统图。噪声是零均值三角抖动,最大绝对值为1。四舍五入到最接近的整数。残留误差是输出和输入之间的差,仅计算用于分析。
1个121个4
有了独立的附加残差,我们将拥有一个更简单的系统模型:
图2.基本抖动量化的近似值。残留误差是白噪声。
在近似模型中,输出只是输入加上独立的白噪声残留误差。
抖动与噪声整形
我不能很好地阅读Mathematica,所以我将分析Lipshitz 等人的系统,而不是您的系统。“ 微创可听噪声整形 ” J.音频主机。,1991年11月,第39卷,第11号,第:
图3. Lipshitz等。1991系统图(改编自他们的图1)。滤波器(在文本中以斜体显示)在其中包含一个采样延迟,因此可以将其用作错误反馈滤波器。噪声是三角抖动。
如果残留误差与信号A的当前值和过去值无关,那么我们有一个更简单的系统:
图4. Lipshitz等人的近似模型。1991年制。滤波器与图3相同,并且其中包括一个采样延迟。它不再用作反馈过滤器。残留误差是白噪声。
在这个答案中,我将使用更容易分析的近似模型(图4)。在原始的Lipshitz 等。在1991年的系统中,滤波器具有通用的无限冲激响应(IIR)滤波器形式,涵盖了IIR和有限冲激响应(FIR)滤波器。在下文中,我们将假定Filter是FIR滤波器,因为根据我对系数的实验,我相信这就是系统中的值。过滤器的传递函数为:
H˚F 我升吨Ë ř(z)= − b1个ž− 1− b2ž− 2− b3ž− 3- …
ž− 1
H(z)= 1 - H ^˚F 我升吨Ë ř(z)= 1 + b1个ž− 1+ b2ž− 2+ b3ž− 3+ … 。
… ,− b3,− b2,− b1个1 ,b1个,b2,b3, …b0= 1horzcat
(在下面的Octave脚本中),最后列表被颠倒了(由flip
):
pkg load signal
b = [-0.16, 0.51, -0.74, 0.52, -0.04, -0.25, 0.22, -0.11, -0.02, 0.31, -0.56, 0.45, -0.13, 0.04, -0.14, 0.12, -0.06, 0.19, -0.22, -0.15, 0.4, 0.01, -0.41, -0.1, 0.84, -0.42, -0.81, 0.91, 0.75, -2.37, 2.29];
c = flip(horzcat(-b, 1));
freqz(c)
zplane(c)
该脚本绘制了幅度频率响应和完整噪声整形滤波器的零位置:
图5.完整噪声整形滤波器的幅频响应。
×∘
我认为寻找滤波器系数的问题可以重新设计为设计超前相位系数为1的最小相位滤波器的问题。如果此类滤波器的频率响应存在固有限制,则这些限制将转换为等效限制。使用此类滤波器的噪声整形。
从全极设计转换为最小相位FIR
Stojanović 等人(2002年)描述了设计不同但在许多方面等效的滤波器的过程。,“基于超球面多项式的全极递归数字滤波器设计”,无线电工程,第23卷,第3期,2014年9月。他们计算了IIR全极点低通滤波器的传递函数的分母系数。那些总的前导分母系数始终为1,并且所有极点都在单位圆内,这是稳定IIR滤波器的要求。如果将这些系数用作最小相位FIR噪声整形滤波器的系数,则与低通IIR滤波器相比,它们将给出反向的高通频率响应(传递函数的分母系数变成分子系数)。用您的记号表示,该文章中的一组系数为{-0.0076120, 0.0960380, -0.5454670, 1.8298040, -3.9884220, 5.8308660, -5.6495140, 3.3816780}
,尽管它不完全符合规范,但可以针对噪声整形应用进行测试:
图7.使用Stojanović等人的系数得出的FIR滤波器的幅频响应。2014。
图8.使用Stojanović等人的系数的FIR滤波器的零极点图。2014。
全极点传递函数为:
H(z)= 11 + 一个1个ž− 1+ 一个2ž− 2+ 一个3ž− 3+ …
一个b
要设计全极点滤波器并将其转换为最小相位FIR滤波器,您将无法使用IIR滤波器设计方法,该方法从模拟原型滤波器开始,并使用双线性变换将极点和零点映射到数字域中。这包括cheby1
,cheby2
和ellip
在倍频和Python的SciPy的。这些方法将使z平面原点远离零,因此滤波器将不是必需的全极点类型。
回答理论问题
如果您不在乎在高于采样频率四分之一的频率处会产生多少噪声,则Lipshitz 等人。1991直接解决您的问题:
对于在整个频带的一部分变为零的这种加权函数,从图1的电路可获得的加权噪声功率降低没有理论上的限制。例如,如果假设耳朵在20 kHz和奈奎斯特频率之间的灵敏度为零,并选择加权函数来反映这一事实。
他们的图1显示了一个噪声整形器,该噪声整形器具有带有零极点和零点的通用IIR滤波器结构,与您当前具有的FIR结构不同,但是他们所说的内容也适用于此,因为FIR滤波器的脉冲响应可能是任意接近任何给定的稳定IIR滤波器的脉冲响应。
滤波器设计的八度脚本
ν= 0dip
pkg load signal
N = 14; #number of taps including leading tap with coefficient 1
att = 97.5; #dB attenuation of Dolph-Chebyshev window, must be positive
dip = 2; #spectrum lift-up multiplier, must be above 1
c = chebwin(N, att);
c = conv(c, c);
c /= sum(c);
c(N) += dip*10^(-att/10);
r = roots(c);
j = (abs(r(:)) <= 1);
r = r(j);
c = real(poly(r));
c .*= (-1).^(0:(N-1)); #if this complains, then root finding has probably failed
freqz(c)
zplane(c)
printf('%f, ', flip(-c(2:end))), printf('\n'); #tobalt's format
它以系数的Dolph-Chebyshev窗口开始,将其自身卷积以使传递函数零加倍,并向中间抽头添加一个“提升”频率响应的数字(考虑中间抽头为零时间),因此到处都是正数,找到零,删除单位圆之外的零,将零转换回系数(poly
从来的领先系数始终为1),并翻转第二个系数的符号使滤波器高通。该脚本(较旧但几乎等效的版本)的结果看起来很有希望:
图9.以上脚本(较旧但几乎等效的版本)的滤波器的幅频响应。
图10.来自上述脚本(较旧但几乎等效的版本)的过滤器的零极点图。
表示法中来自上述脚本的系数(较旧,但几乎等效){0.357662, -2.588396, 9.931419, -26.205448, 52.450624, -83.531276, 108.508775, -116.272581, 102.875781, -74.473956, 43.140431, -19.131434, 5.923468}
。数字很大,可能导致数字问题。
八度实施噪声整形
最后,我在Octave中完成了噪声整形的实现,没有遇到像您一样遇到的问题。根据我们在评论中的讨论,我认为您的实现方式的局限性在于使用矩形窗口(也称为“无窗口” )评估了噪声频谱,从而将高频频谱扩散到了低频。
pkg load signal
N = length(c);
M = 16384; #signal length
input = zeros(M, 1);#sin(0.01*(1:M))*127;
er = zeros(M, 1);
output = zeros(M, 1);
for i = 1:M
A = input(i) + er(i);
output(i) = round(A + rand() - rand());
for j = 2:N
if (i + j - 1 <= M)
er(i + j - 1) += (output(i) - A)*c(j);
endif
endfor
endfor
pwelch(output, max(nuttallwin(1024), 0), 'semilogy');
图11.恒定零输入信号的噪声整形的上述八度实施中的量化噪声频谱分析。横轴:归一化频率。黑色:无噪声整形(c = [1];
),红色:您的原始过滤器,蓝色:“滤波器设计的八度脚本”部分中的过滤器。
图12.以上八度实施噪声整形的时域输出,用于恒定零输入信号。横轴:样品编号,纵轴:样品值。红色:原始过滤器,蓝色:“用于过滤器设计的八度脚本”部分中的过滤器。
更加极端的噪声整形滤波器(蓝色)即使对于零输入也导致非常大的量化输出采样值。