Как я обещал, публикую немного кода, прежде всего для morontt, но может ещё кому будет интересно.
Оставляя за бортом архитектуру программы, я намеренно упрощаю код, используя только обычные переменные и выражения.
Итак, у нас есть динамик, описаный параметрами Тиля-Смолла:
- re - сопротивление в омах, не то, которое обычно пишут на динамиках, а то, которое измеряется омметром на постоянном токе - разница бывает значительна, например, у меня много динамиков "на 16 Ом", у которых re ~ 12-13 Ом.
- bl - произведение магнитной индукции на длину проводника; для нахождения силы Ампера достаточно умножить на значение тока в Амперах;
- le - эквивалентная индуктивность, измеряется обычно не в генри, а в миллигенри;
- cms - гибкость подвеса; что такое гибкость - жёсткость наоборот (вот так же, как сопротивление это проводимость наоборт), натурально: cms = 1/k, где k - коэффициент жёсткости/упругости из закона Гука;
- rms - потери в подвесе;
- sd - эффективная площадь диффузора; подвес входит в неё частично, так что грубо можно измерить диаметр по середине подвеса и вычислить площадь как площадь круга (а не как конуса); измеряется обычно не в квадратных метрах, а в сантиметрах, однако столь же квадратных;
- mmd - масса подвижной системы БЕЗ воздуха (с воздухом - mms); как узнать - ну в идеале снять TS-параметры в вакууме, там присоединённая масса воздуха будет нулевой за неимением такового, можно взвесить до сборки, но непонятно, как учитывать вес подвеса, которые так же неполностью должен входить в mmd, как и в sd, а можно просто взять mms, считая, что будет достаточно точно; я собираюсь моделировать воздух отдельно, так что мне нужно именно mmd; обычно измеряется в граммах, а не килограммах.
В формулах ниже считаю, что le, sd и mmd уже приведены в генри, квадратные метры и колограммы соответственно.
Сначала безо всякого моделирования можно найти остальные параметры. Для этого нам потребуются плотность воздуха rho, и скорость звука в нём - c. Например, 1.2041 кг/м^3 и 343.25 м/с соответственно.
Сразу скажу, что vas обычно измеряют в литрах, а не в кубометрах, как вычисляется ниже; желающие литров могут умножить кубометры на тысячу. M_PI - это просто число пи из math.h.
double fs = 1 / (2 * M_PI * sqrt(cms * mmd));
double qes = 2 * M_PI * fs * mmd * re / pow(bl, 2);
double qms = 2 * M_PI * fs * mmd / rms;
double qts = (qms * qes) / (qms + qes);
double vas = rho * pow(c * sd, 2) * cms;
Максимальный импеданс - обычно его измеряют и из него вычисляют добротности, но тут мы вычислим его - и эффективность динамика (или КПД - от 0 до 1, можно умножить на 100 и получить проценты, как правило 1-2%).
double zmax = re * (1 + qms / qes);
double eta0 = rho * pow(bl * sd / mmd, 2) / (2 * M_PI * c * re);
Отдача на одном ватте и на напряжении 2.83В. соответственно:
double spl1w = 112.1 + 10.0 * log10(eta0);
double spl283v = spl1w + 10 * log10(8.0 / re);
Дальше моделирование и в вот таких условиях:
- rout - выходное сопротивление источника;
- p - атмосферное давление;
Сетка моделирования:
- dt - длительность шага в секундах;
- dx - размер "кубика" сетки в метрах;
Состояние динамика на предыдущем шаге (dt сек. назад):
- x0 - положение (смещение) диффузора;
- v0 - скорость диффузора;
- i0 - ток в катушке;
Входные данные:
- u_in - напряжение источника (без нагрузки);
- dp0 - разница давлений по разные стороны диффузора (из модели воздуха);
Сначала напряжение и ток (делитель напряжения и закон ома).
double u = u_in * re / (re + rout);
double i = u / re;
ЭДС, вызванная силой Лоренца и ЭДС самоиндукции (тут точно есть ошибка, дифур бы решить).
double eds_lorenz = - bl * speaker->v;
double eds_l = - le * (i - i0) / dt;
Влияние ЭДС на напряжение и ток.
i += (eds_lorenz + eds_l) / (re + rout);
u += (eds_lorenz + eds_l) * rout / (re + rout);
Силы, действующие на диффузор - "мотор", упругость, потери и давление на диффузор, как на поршень.
double f_bl = bl * i;
double f_cms = - x0 / cms;
double f_rms = - rms * v0;
double f_p = - dp0 * sd;
Равнодействующая сила и вызванное ей ускорение.
double f = f_bl + f_cms + f_rms + f_p;
double a = f / mmd;
Теперь динамик сдвигается - на один шаг.
double v = v0 + a * dt;
double x = x0 + v * dt;
Вот давление перед диффузором.
double p0 = p + dp;
Динамик - поршень. Считаю как изменится давление в одном (в каждом) кубике dx*dx*dx
double p1 = p0 * dx / (dx - (x - x0);
double dp = p1 - p0;
Теперь dp подаётся в модель воздуха...