Резонатор и режектор

Предыдущая  Содержание  Следующая  V*D*V

Обычно используется звено 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;

 }

}

Предыдущая  Содержание  Следующая