このサイトで生成された係数に基づいて、単純なチェビシェフローパスフィルターを作成しました: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を超える周波数の振幅を低減していることを示していますが、信号に大量のノイズが追加されています。これは、私が実装しようとしているフィルタータイプ(バターワース、レイズドコサインなど)のいずれにも当てはまるようです。
私は何か間違ったことをしていますか、それともこれらのフィルターは単に他の周波数でアーティファクトを導入しますか?サンプルのすべてのペアを平均化するという単純なアプローチを使用してダウンサンプリングした場合、このノイズはまったく発生しません(ただし、エイリアシングは明らかにはるかに悪いです)。