切比雪夫 LPF 引入噪声

Posted

技术标签:

【中文标题】切比雪夫 LPF 引入噪声【英文标题】:Chebyshev LPF introducing noise 【发布时间】:2011-05-05 10:46:22 【问题描述】:

我创建了一个基于此站点生成的系数的简单 Chebyshev 低通滤波器:http://www-users.cs.york.ac.uk/~fisher/mkfilter/,我用它来滤除 16kHz 采样率音频信号中高于 4kHz 的频率,然后再下采样到 8kHz。这是我的代码(它是 C#,但这个问题不是 C# 特定的,请随意使用不同语言的其他语言)。

/// <summary>
/// Chebyshev, lowpass, -0.5dB ripple, order 4, 16kHz sample rte, 4kHz cutoff
/// </summary>
class ChebyshevLpf4Pole

    const int NZEROS = 4;
    const int NPOLES = 4;
    const float GAIN = 1.403178626e+01f;

    private float[] xv = new float[NZEROS+1];
    private float[] yv = new float[NPOLES + 1];

    public float Filter(float inValue)
    
        xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = xv[3]; xv[3] = xv[4];
        xv[4] = inValue / GAIN;
        yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = yv[3]; yv[3] = yv[4];
        yv[4] = (xv[0] + xv[4]) + 4 * (xv[1] + xv[3]) + 6 * xv[2]
                     + (-0.1641503452f * yv[0]) + (0.4023376691f * yv[1])
                     + (-0.9100943707f * yv[2]) + (0.5316388226f * yv[3]);
        return yv[4];
    

为了测试它,我使用 Audacity 创建了一个从 20Hz 到 8kHz 的正弦波“啁啾”。测试信号如下所示:

过滤后我得到:

波形显示滤波器确实降低了 4kHz 以上频率的幅度,但我的信号中添加了大量噪声。无论我尝试实现哪种过滤器类型(例如 Butterworth、Raised Cosine 等),这似乎都是如此。

是我做错了什么,还是这些过滤器只是在其他频率引入了伪影?如果我使用平均每对样本的简单方法进行下采样,我根本不会得到这种噪音(但显然混叠更糟)。

【问题讨论】:

【参考方案1】:

好吧,是我太笨了。我的 LPF 的创建发生在处理循环内部而不是外部,这意味着每 512 个样本我都会创建一个新样本,这意味着我正在丢失保存的状态。在整个文件中运行我的滤波器的一个实例,噪音就消失了,正如预期的那样,我得到了混叠频率,因为滤波器无法完全去除截止频率以上的所有内容。

【讨论】:

【参考方案2】:

我在 Mathematica 中检查了你的过滤器代码,它在这里工作正常,没有引入噪音,所以噪音可能来自你代码的其他部分。

【讨论】:

出于兴趣,您是否将中间项的精度限制为 24 位(即单精度浮点数)? 不,Mathematica 默认使用双倍机器精度,所以我使用了它。我会尝试看看我是否可以以单精度重复过滤。 谢谢,你是对的,这是我的代码的另一部分(在这里查看我的答案)【参考方案3】:

您可能会遇到数值稳定性问题,尤其是当任何极点接近单位圆时。尝试将所有中间项设为双精度,然后在最后转换回单精度。我对 C# 不太熟悉,但在 C 中是这样的:

yv[4] = (float)(((double)xv[0] + (double)xv[4]) + 4.0 * ((double)xv[1] + (double)xv[3]) + 6.0 * xv[2]
             + (-0.1641503452 * (double)yv[0]) + (0.4023376691 * (double)yv[1])
             + (-0.9100943707 * (double)yv[2]) + (0.5316388226 * (double)yv[3]));

【讨论】:

谢谢,我在调查时确实尝试了双精度版本的过滤器,但最终结果却是一个更简单的问题(见我的回答)【参考方案4】:

在第一次使用 xvyv 数组之前,您没有正确初始化它们。在大多数语言中,这意味着它们的值是未定义的,这可能会导致像您这样的意外结果。将它们初始化为适当的值(如 0)可能会解决您的问题。

【讨论】:

它是 C#,所以它们将包含零。 将编辑问题。不想用 C# 标记它,因为我会用任何编程语言回答

以上是关于切比雪夫 LPF 引入噪声的主要内容,如果未能解决你的问题,请参考以下文章

切比雪夫多项式

什么是切比雪夫多项式?

经验法则和切比雪夫法则

什么是切比雪夫多项式?它有什么重要性质

2019.4.15切比雪夫定理和经验法则

切比雪夫最佳逼近直线