Резонатор и режектор |
Предыдущая Содержание Следующая |
|
Обычно используется звено 2-го порядка. Коэффициенты находятся по формулам: где: w - центральная частота, рад/сек g - полоса частот по уровню -3 дБ, рад/сек
Фильтрация выполняется следующим образом:
out = a * input + b * z1 + c * z2 z2 = z1 z1 = out
Резонатор можно использовать как фильтр низкой частоты. Для этого случая частота приравнивается нулю, а полоса выбирается равной удвоенной частоте. Работа резонатораАмплитуда отклика резонатора зависит от добротности, то есть от отношения частота/полоса. Таким образом, амплитуда отклика резонатора с параметрами F=2000 Гц, W=100 Гц в 2 раза больше, чем амплитуда отклика резонатора с параметрами F=1000 Гц, W=100 Гц. Замечание Умные книжки говорят, что подобный вид формул справедлив, только если частота намного превосходит полосу. Полный вид формулы для коэффициента b такой: Решение, когда частота меньше полосы для меня непонятно. Однако, такая ситуация часто встречается на практике... РежекторФормулы выглядят следующим образом: сначала по вышеприведенным формулам для резонатора ищутся коэффициенты, затем преобразуются по формулам:
a = 1 / a b = -b * a c = -c * a
Фильтрация выполняется следующим образом:
out = a * input + b * z1 + c * z2 z2 = z1 z1 = input Замечание При реализации режектора по вышеприведенным формулам отклик не вполне соответствует ожидаемому. В чем тут дело, мне не вполне понятно. Тем не менее, при использовании частоты режектирования меньше 4000 Гц наблюдается сильное увеличение амплитуды выходного сигнала. Также наблюдается рост спектра примерно 6 дБ на октаву в выходном сигнале. В общем, использовать его надо с осторожностью. Код/** * по материалам: * Klatt D.H. Software for cascade/parallel synthesizer * * параметры: * frequency - центральная частота * width - полоса по уровню -3 дБ, характеризует потери * type - тип: true-резонатор или false-режектор * выходной сигнал пропорционален частоте, 6дБ/октаву */ public class Resonator { private int m_fr; private int m_wd; private boolean m_type; public double a; private double b; private double c; private double z1; private double z2; // public Resonator() { m_fr = 0; m_wd = 0; a = 1.0; b = 0.0; c = 0.0; z1 = 0.0; z2 = 0.0; } public Resonator(int frequency, int width, int sampleRate, boolean type) { init( frequency, width, sampleRate, type ); } public void init(int frequency, int width, int sampleRate, boolean type) { m_fr = frequency; m_wd = width; m_type = type; double arg = -Math.PI * width / sampleRate; double r = Math.exp( arg ); c = -(r * r); arg = 2.0 * Math.PI * frequency / sampleRate; b = r * Math.cos( arg ) * 2.0; a = (1.0 - b - c); if( !type ) { a = 1.0 / a; b *= -a; c *= -a; } } public int getFrequency() { return m_fr; } public int getWidth() { return m_wd; } public double proc(double sample) { double out = a * sample + b * z1 + c * z2; z2 = z1; if( m_type ) z1 = out; else z1 = sample; return out; } } |
Предыдущая Содержание Следующая |