Излучение

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

В работе "Mathur S., Story B., Rodriguez J. Vocal-Tract Modeling: Fractional Elongation of Segment Lengths in a Waveguide Model With Half-Sample Delays" приводится следующее разностное уравнение для реализации нагрузки излучения, найденной Фланаганом и описываемой параллельно соединёнными резистором и индуктивностью:

 

где:

Fm - значение давления прямой волны.

Fprev - значение давления прямой волны на предыдущем шаге.

Bprev - значение давления обратной волны на предыдущем шаге.

Pprev - значение выходного давления на предыдущем шаге.

r - радиус излучающего отверстия, м

 

Таким образом, в базовом алгоритме перед шагом 5 надо произвести расчет коэффициентов, а шаги 12 и 13 заменяются на первые два уравнения.

Замечание:

Есть некоторое сомнение в правильности формулы для L'. Мне кажется, что надо домножить на π.

Код

/**

* Моделирование излучения звука.

* по материалам:

* Фланаган, Анализ, синтез и восприятие речи

* Siddharth Mathur, Vocal-Tract Modeling: Fractional Elongation of Segment Lengths in a Waveguide Model With Half-Sample Delays

*

* использование:

* init( sampleRate, radius )

* ...

* proc( presure )

* back wave = getReflection()

* mouse presure = getPresure()

*/

public class Radiation {

 private double m_b1;

 private double m_b2;

 private double m_f1;

 private double m_fp;

 private double m_B = 0;//отраженная волна на прошлом шаге

 private double m_F = 0;//прямая волна на прошлом шаге

 private double m_P = 0;//давление излучения на прошлом шаге

 //

 public Radiation() {}

 /**

  * установка параметров нагрузки

  * @param sampleRate - частота дискретизации, Гц

  * @param radius - радиус излучающего отверстия, м

  */

 public void init(int sampleRate, double radius) {

         double L = 16 * sampleRate * radius / 3 / Math.PI / Cnt.C0;//С0 - скорость звука

         double R = 128 / 9 / Math.PI / Math.PI;

         double RL = R * L;

         double b = R + L + RL;

         m_b1 = (RL - R - L) / b;

         m_b2 = (L - R - RL) / b;

         m_f1 = (RL + RL) / b;

         m_fp = (RL + L - R) / b;

 }

 /**

  * @return давление отраженной волны

  */

 public double getReflection() { return m_B; }

 /**

  * @return давление прямой волны

  */

 public double getPresure() { return m_P; }

 /**

  * вычисление отраженной волны и звукового давления

  * @param presure - давление прямой волны

  */

 public void proc(double presure) {

         double B = presure * m_b1 + m_F * m_b2 + m_B * m_fp;

         double P = (presure - m_F) * m_f1 + m_P * m_fp;

         m_P = P;

         m_F = presure;

         m_B = B;

 }

}

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