切比雪夫LPF引入噪音

我创建了一个简单的切比雪夫低通滤波器,该滤波器基于本网站生成的系数:http://www-users.cs.york.ac.uk/~fisher/mkfilter/,我正在使用它来滤除4kHz以上的频率在下采样到8kHz之前采样率为16kHz的音频信号。 这里是我的代码(这是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以上频率的幅度,但是我的信号中加入了噪声。 这似乎是我尝试实施的过滤器类型(例如巴特沃斯,凸起的余弦等)。

我做错了什么,或者做这些过滤器简单地介绍其他频率的人工制品? 如果我使用平均每对样本的朴素方法进行下采样,我根本不会得到这种噪声(但显然混叠更糟糕)。


好吧,这是我真的很愚蠢。 我的LPF的创建发生在处理循环内部而不是外部,这意味着每创建一个新样本512个样本,这意味着我正在失去保存的状态。 只有一个过滤器运行在整个文件中,噪声消失,并且正如我们所期望的那样,由于过滤器无法完全移除截止点以上的所有内容,因此会出现混叠频率。

正确使用过滤器


我在Mathematica中检查了你的过滤代码,在没有引入噪声的情况下它工作的很好,所以可能噪声来自你的代码的其他部分。

过滤后啁啾


可能存在数值稳定性问题,特别是如果任何极点接近单位圆。 尝试使所有中间术语都具有双精度,然后最终返回单精度。 我对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]));
链接地址: http://www.djcxy.com/p/62139.html

上一篇: Chebyshev LPF introducing noise

下一篇: Strong with low pass filter