Скорость потока

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

Описывается следующим разностным уравнением:

 

Так как вид формул параметров, входящих в данное уравнение, в разных публикациях описан по-разному (однако при элементарной проверке оказывается неверным), приводится решение основанное на здравом смысле, которое не претендует на верное, однако дает результат очень похожий на приводимый в тех же публикациях.

где:

Cx - коэффициент динамического сопротивления, ~1.4

r - плотность воздуха, 0.00114 г/см3

m - коэффициент вязкости воздуха, 0.000186 г/(см*сек)

W(t) - скорость потока в предыдущем периоде времени дискретизации

Dp(t + Dt) - перепад давления над голосовой щелью, ~1500 Pa

S(t + Dt) - площадь голосовой щели, обычно, 0 ... 0,4 см2

a = 1 - e^( -12 * μ / S(t + Δt) / ρ * dT ), требуется устранить неопределенность деления на ноль

dT - период времени дискретизации, сек

 

Замечание

Разные авторы указывают на необходимость учета влияния сужения щели. Корректировать предлагается увеличением эффективной длины голосовой щели. В работе Сорокина "Синтез речи" приводятся 2 формулы:

и

где для 2-ой формулы,

S - площадь трахеи, 3 см2

Sg - площадь сужения, в пределах < 0,16 * S

 

Однако, если приглядеться к формулам, то можно заметить в 1-ой формуле неадекватность - при увеличении площади растёт длина, хотя должно быть наоборот. Вторая формула смущает тем, что при любом Sg происходит удлинение.

Формула 1 приведена в "Ф. Морз. Колебания и звук", стр. 261, однако вывод её, чтобы проверить откуда она берётся, я не нашел.

Комментарий И. Макарова

На аэродинамику это очень мало влияет.

Код

 private int m_dP;// = 1500;//Pa

 private double m_k1;

 private double m_H;// = 12 * 0.000186 * 1.5;//12*u*h

 private double m_Wt = 0;//объемная скорость на предыдущем шаге

 private double m_W = 0;//объемная скорость в текущем шаге

 /**

  * h - см, глубина голосовой щели

  * dP - Pa, перепад давления ~1500 Pa

  */

 public VoicingSource(int sampleRate, double h, int dP) {

         m_k1 = -12 * 0.000186 / 0.00114 / sampleRate;

         m_dP = dP;

         m_H = 12 * 0.000186 * h;

 }

 /**

  * расчет скорость воздушного потока по площади голосовой щели

  * вызывать только один раз за период!

  * @param S - площадь голосовой щели, 0-0.2 см^2

  * @return объемная скорость воздушного потока, 0...200 sm^3/s

  */

  public double calculateSpeed(double S)

   {// S = 0 ... 0,2 sm^2, площадь голосовой щели

         /*

          * Ro = 0.00114 g/sm^3 плотность воздуха

          * u = 0.000186 g/(sm*s) коэффициент вязкости воздуха

          * h = 1.5 sm глубина голосовой щели

          * dP = 1500.0 Pa перепад давления над голосовой щелью

          * Cx = 1.4 коэффициент динамического сопротивления

          *

          * alpha = 1 - Math.pow(Math.E, -12*u/Ro/sampleRate/(S<0.0001?0.0001:S));

          * k1 = 12 * u * h;

          * k2 = alpha / k1 * Cx * Ro;

          * W = 0...180 скорость воздушного потока sm^3

          * W = (Math.sqrt(1.0-2*k2*(alpha*(Wt-dP*S*S/k1)-Wt))-1.0)/k2;

          */

         double alpha = 1.0 - Math.exp( m_k1 / (S<0.0001?0.0001:S) );

         double k1 = m_H;//здесь можно учесть удлинение щели при уменьшении площади

         double k2 = alpha / k1 * 0.001596;

         m_Wt = m_W;

         m_W = (Math.sqrt(1.0-2.0*k2*(alpha*(m_Wt-m_dP*S*S/k1)-m_Wt))-1.0)/k2;

 

         return m_W;

   }

  /**

    * левая производная от скорости, +10...-50 sm^3/s

    */

  public double getPulse() {

         return m_W - m_Wt;

   }

 

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