Здравствуйте, товарищи.
У меня возник вопрос по цифровым фильтрам.
Я строю полосовой фильтр:
Код
public final double getValue(double w) {
if (w < (leftFrequency + rightFrequency) / 2) {
return getHighPassValue(w);
} else {
return getLowPassValue(w);
}
}
protected final double getLowPassValue(double w) {
return getIntermediateValue(w / rightFrequency);
}
protected final double getHighPassValue(double w) {
return getIntermediateValue(leftFrequency / w);
}
protected abstract double getIntermediateValue(double w);
Ну а в реализациях фильтра последняя функция возвращает значение нормализованного фильтра (частота среза = 1 Гц).
Так вот, я строил график и заметил, что график получается отнюдь не симметричным. В районе leftFrequency АЧХ взмывает вверх быстрее, чем в районе АЧХ убывает.
Приведу конкретный пример.
leftFrequency = 40 Гц.
rightFrequency = 1000 Гц.
G(leftFrequency+20) = 0.99; G(rightFrequency-20) = 0.62;
Непосредственные причины понятны: отношение 40/60 куда меньше 980/1000. В нормализации всё дело.
А вот как сделать правильную нормализацию, чтобы подъём и спад имели одинаковую крутизну на любых частотах?
Возможно, при этом нужно будет поменять тело getValue().
Сообщение отредактировал QuickNick - Jul 5 2011, 06:12