我基于此站点生成的系数创建了一个简单的切比雪夫低通滤波器:http://www-users.cs.york.ac.uk/~fisher/mkfilter/,用于在下采样到8kHz之前滤除16kHz采样率音频信号中4kHz以上的频率。这是我的代码(这是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等)。
我做错了什么,或者这些过滤器只是在其他频率上引入人工制品?如果我使用平均每对样本的简单方法进行下采样,我根本不会得到这种噪声(但显然混叠更糟)。
答案 0 :(得分:2)
我在Mathematica中检查了你的过滤器代码,它在这里工作正常,没有引入噪音,因此可能噪音来自你代码的其他部分。
答案 1 :(得分:2)
答案 2 :(得分:1)
您可能存在数值稳定性问题,尤其是当任何极点靠近单位圆时。尝试将所有中间项设置为双精度,然后在最后再回到单精度。我对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]));
答案 3 :(得分:0)
在首次使用它们之前,您尚未正确初始化xv
和yv
数组。在大多数语言中,这意味着它们的值未定义,可能会导致像您这样的意外结果。将它们初始化为适当的值(如0)可以解决您的问题。