The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

Излучение

Излучение

Предыдущая  Содержание  Следующая  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;

 }

}

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