限制可能的噪声整形?


9

我想在100kHz,16位应用中进行噪声整形,以便将所有量化噪声转移到25khz-50kHz频带,而在DC-25kHz频带中噪声最小。

我通过增强学习来设置mathematica来创建一个31样本的误差滤波器内核,该内核工作得很好:经过一点学习,我可以在大约相同的低频频带减少量下获得大约16dB的高频噪声增强。中心线是未成形的抖动噪声水平)。这符合“ Gerzon-Craven”噪声整形定理。

学习后产生的噪声谱

现在我的问题:

尽管经过Gerzon-Craven定理并没有禁止它,但即使经过广泛学习,我也无法设法进一步消除噪声。例如,应该有可能在低频段实现40 dB的降低,在高频段实现40 dB的提高。

那么,我遇到了另一个基本限制吗?

我尝试研究香农噪声/采样/信息定理,但经过一段时间的摸索,我只能从中得出一个极限:格宗-克雷文定理,这似乎是香农定理的直接结果。

任何帮助表示赞赏。

编辑:更多信息

首先,产生上述噪声整形的滤波器内核,请注意,最新的示例在右侧。BarChart的数值四舍五入为0.01:{-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}(不完全是条形炭,但会产生相似的曲线)

过滤内核,最新示例在RIGHT上。

关于错误反馈实现的另一条注释:

我尝试了错误反馈的两种不同实现。首先,我将四舍五入的输出样本与所需值进行比较,并将此偏差用作误差。其次,我将舍入后的输出样本与(输入+错误反馈)进行了比较。尽管这两种方法产生的内核都完全不同,但两者似乎都在相同的噪声整形强度下趋于平稳。此处发布的数据使用第二种实现。

这是用于计算数字化波样本的代码。步骤是四舍五入的步骤大小。波形是未数字化的波形(通常在未施加信号时仅为零)。

TestWave[kernel_?VectorQ] := 
 Module[{k = kernel, nf, dith, signals, twave, deltas},
  nf = Length@k;
  dith = RandomVariate[TriangularDistribution[{-1, 1}*step], l];
  signals = deltas = Table[0, {l}];
  twave = wave;
  Do[
   twave[[i]] -= k.PadLeft[deltas[[;; i - 1]], nf];
   signals[[i]] = Round[twave[[i]] + dith[[i]], step];
   deltas[[i]] = signals[[i]] - twave[[i]];
   , {i, l}];
  signals
  ]

加固方法:

通过查看噪声功率谱来计算“分数”。目的是使DC-25kHz频带内的噪声功率最小。我不会惩罚高频带中的噪声,因此任意高噪声不会降低得分。我将噪声引入内核权重以进行学习。因此,也许我处于(非常广泛和深入的)本地最低要求,但是我认为这极不可能。

与标准过滤器设计的比较:

Mathematica允许迭代生成过滤器。当绘制频率响应时,它们的对比度比36 dB好得多。高达80-100 dB。数值:{0.024,-0.061,-0.048、0.38,-0.36,-0.808、2.09,-0.331,-4.796、6.142、3.918,-17.773、11.245、30.613,-87.072、113.676,-87.072、30.613、11.245 ,-17.773,3.918,6.142,-4.796,-0.331,2.09,-0.808,-0.36,0.38,-0.048,-0.061,0.024}

在此处输入图片说明

但是,当将它们应用于实际噪声整形时,它们(a)被钳制到相同的〜40dB对比度,(b)表现得比学习的滤波器差,实际上没有噪声衰减。

蓝色:学习过的滤镜,黄色:开箱即用的等波纹滤镜,不移位...确实更糟


2
+1,非常有趣的问题。您是否尝试过将过滤器的顺序增加到31个以上?对于31抽头FIR,40dB抑制听起来有点高。
A_A

1
@奥利,我不相信我完全理解。如果您对此感兴趣,我可以发布过滤器内核。用直率的话来说,振荡的权重会迫使错误变为替代->将其移至高频。
tobalt

2
来自“经典”滤波器设计的tobalt,可以预期的结果是,更长的滤波器更陡峭和/或在阻带中具有更大的衰减,和/或在通带中具有较小的波纹。现在,我的猜测是,在某个点之后,您的加固方法对陡度的奖励远胜于衰减。您用来加固的方法是什么?
MarcusMüller18年

1
您可能想看看Mathematica 的“ 滤波器设计”部分。也许您可以简单地定义过滤器的规格并使用现有技术之一返回满足要求的过滤器。
A_A

1
绝对是(可选地,迭代的)滤波器设计。获取您的过滤器规格(恰如您在此处发布的一样),然后尝试通过此函数(其类型中最简单的)创建过滤器,并查看其功能。很高兴看到函数带来的系数与强化学习带来的系数相提并论。另外,请注意它所带来的滤波顺序,我想它会高于31。顺便说一句,它是否必须“适应”信号?
A_A

Answers:


12

基本抖动而无噪声整形

没有噪声整形的基本抖动量化工作如下:


图1.基本的抖动量化系统图。噪声是零均值三角抖动,最大绝对值为1。四舍五入到最接近的整数。残留误差是输出和输入之间的差,仅计算用于分析。

1个121个4

有了独立的附加残差,我们将拥有一个更简单的系统模型:


图2.基本抖动量化的近似值。残留误差是白噪声。

在近似模型中,输出只是输入加上独立的白噪声残留误差。

抖动与噪声整形

我不能很好地阅读Mathematica,所以我将分析Lipshitz 等人的系统,而不是您的系统微创可听噪声整形 ” J.音频主机。,1991年11月,第39卷,第11号,第:

Lipshitz等1991系统
图3. Lipshitz等。1991系统图(改编自他们的图1)。滤波器(在文本中以斜体显示)在其中包含一个采样延迟,因此可以将其用作错误反馈滤波器。噪声是三角抖动。

如果残留误差与信号A的当前值和过去值无关,那么我们有一个更简单的系统:


图4. Lipshitz等人的近似模型。1991年制。滤波器与图3相同,并且其中包括一个采样延迟。它不再用作反馈过滤器。残留误差是白噪声。

在这个答案中,我将使用更容易分析的近似模型(图4)。在原始的Lipshitz 等。在1991年的系统中,滤波器具有通用的无限冲激响应(IIR)滤波器形式,涵盖了IIR和有限冲激响应(FIR)滤波器。在下文中,我们将假定Filter是FIR滤波器,因为根据我对系数的实验,我相信这就是系统中的值。过滤器的传递函数为:

HF一世ŤË[Rž=-b1个ž-1个-b2ž-2-b3ž-3-

ž-1个

Hž=1个-HF一世ŤË[Rž=1个+b1个ž-1个+b2ž-2+b3ž-3+

-b3-b2-b1个1个b1个b2b3b0=1个horzcat(在下面的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.完整噪声整形滤波器的幅频响应。

Zplane图
×

我认为寻找滤波器系数的问题可以重新设计为设计超前相位系数为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ž=1个1个+一个1个ž-1个+一个2ž-2+一个3ž-3+

一个b

要设计全极点滤波器并将其转换为最小相位FIR滤波器,您将无法使用IIR滤波器设计方法,该方法从模拟原型滤波器开始,并使用双线性变换将极点和零点映射到数字域中。这包括cheby1cheby2ellip在倍频和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.以上八度实施噪声整形的时域输出,用于恒定零输入信号。横轴:样品编号,纵轴:样品值。红色:原始过滤器,蓝色:“用于过滤器设计的八度脚本”部分中的过滤器。

更加极端的噪声整形滤波器(蓝色)即使对于零输入也导致非常大的量化输出采样值。


1
@MattL。起初我错误地认为Tobalt具有全极点滤波器。当我意识到它是一个具有第一个系数1的FIR滤波器时,我重新编写了答案。据报道,Gerzon-Craven还说该滤波器需要最小相位才能达到最佳,而Tobalt的优化系数也可以给出一个最小相位滤波器。这些要求等同于IIR全极点滤波器的系数,因此我建议从那里借鉴设计方法。标准IIR也将是一种选择。
Olli Niemitalo

1
我已经隔离了错误:我的实现在时间上产生与您相同的波形。但是,Abs [Fourier [wave]]函数似乎遇到了一些内部上溢/下溢,因为返回的频谱看起来有所不同(较高的楼层)
tobalt

1
@Olli Niemitalo好吧,似乎八度的FFT使用了自动加窗?将Hann窗口应用于波形后,我可以获得“正确的” FFT。我将简要测试此方法的完整性,并最终继续学习并发布结果。感谢您的所有努力。我已将您的帖子标记为答案。
tobalt

1
@ robertbristow-johnson我认为这一切都是一致的。我删除了一个方程,其中H(z)用于分子为1的递归滤波器。但这是Tobalt的情况下的FIR滤波器。我怀疑您可能认为它会成为递归过滤器,因为存在反馈循环。但是抖动量化是在循环中完成的事情,它切断了从滤波器输出到残差的路径。
Olli Niemitalo

1
一个b
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.