Излучение |
Предыдущая Содержание Следующая |
|
В работе "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; } } |
Предыдущая Содержание Следующая |