Skip to content

Latest commit

 

History

History
4161 lines (3318 loc) · 178 KB

File metadata and controls

4161 lines (3318 loc) · 178 KB

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

Система оптимизации выходного каскада подводной акустической коммуникации


Условные обозначения статуса реализации:

  • Реализовано - модель/функция уже есть в SonarCore
  • НЕ реализовано - требуется реализация
  • ⚠️ Частично реализовано - есть базовая версия, требуется расширение

Сводная таблица статуса реализации:

Компонент Статус Модуль SonarCore Примечание
Трансдьюсер
- TVR, чувствительность core/transducer_model.py Базовая модель
- BVD импеданс scripts/bvd.py РЕАЛИЗОВАНО: Создание BVD, MBVD, EBVD, Mason, KLM моделей из Conductance/Susceptance
- Нелинейность - Требуется реализация
Канал
- Затухание (Франсуа-Гаррисон) core/water_model.py Реализовано
- Геометрическое затухание core/water_model.py Сферическое
- Частотно-зависимое затухание core/channel_model.py Для чирпа
- Шум океана (Wenz) - Требуется реализация
- Многолучевость - Требуется реализация
- Доплеровский сдвиг - Требуется реализация
Сигнал
- Генерация чирпа core/signal_model.py Реализовано
- Оконные функции ⚠️ core/signal_model.py Rect, Hann, Tukey
- Компенсирующая огибающая - Требуется реализация
- Предыскажение (DPD) - Требуется реализация
Обработка
- Согласованная фильтрация core/dsp_model.py Реализовано
- TOF расчет core/dsp_model.py Реализовано
- Метрики корреляции (PSR, ISL) - Требуется реализация
Выходной каскад
- Усилитель класса D - Требуется реализация
- Трансформатор - Требуется реализация
- Согласующая индуктивность - Требуется реализация
Приемник
- LNA core/receiver_model.py Реализовано
- VGA core/receiver_model.py Реализовано
- ADC core/receiver_model.py Реализовано
Оптимизация
- Базовая оптимизация (VGA, Tp) core/optimizer.py Реализовано
- Оптимизация выходного каскада - Требуется реализация
- Многопараметрическая оптимизация - Требуется реализация

1. ОБЩИЕ ПОЛОЖЕНИЯ

1.1 Наименование системы

Программно-математический комплекс для симуляции и многопараметрической оптимизации выходного каскада системы подводной акустической связи с чирп-модуляцией.

1.2 Основание для разработки

Необходимость максимизации скорости передачи данных (битрейта) в подводном акустическом канале при заданных ограничениях на дальность связи, энергопотребление и качество сигнала.

1.3 Назначение системы

Система предназначена для:

  • Моделирования полного электро-акустического тракта передачи
  • Оптимизации параметров выходного каскада
  • Расчета максимально достижимого битрейта для заданной дальности
  • Анализа качества корреляционного отклика
  • Синтеза компенсирующих огибающих и предыскажений
  • Интерактивного изменения параметров и просмотра результатов через графический пользовательский интерфейс (GUI)

2. СТРУКТУРА ВЫХОДНОГО КАСКАДА

```

[DAC] → [Усилитель класса D] → [Трансформатор] → [Согласующая индуктивность] → [Трансдьюсер] → [Подводный канал]


### 2.2 Компоненты системы

#### 2.2.1 Цифро-аналоговый преобразователь (DAC)

> **📌 Статус реализации в SonarCore:**  
> ⚠️ **Частично реализовано:** Генерация чирп-сигнала в `SignalModel.generate_chirp()`  
> ❌ **НЕ реализовано:** Модель DAC, компенсирующая огибающая, предыскажение (DPD)

**Параметры:**

- Разрядность: $N_{bit}$ [бит] ❌
- Частота дискретизации: $f_s$ [Гц] ✅ **Реализовано в `SignalDTO.sample_rate`**
- Выходное напряжение: $V_{DAC}$ [В] ❌
- Выходной импеданс: $Z_{DAC}$ [Ом] ❌
- КПД: $\eta_{DAC}$ [%] ❌

**Функции:**

- Формирование чирп-сигнала с компенсирующей огибающей ⚠️ **Частично:** чирп есть, огибающая нет
- Реализация цифрового предыскажения (DPD) ❌

#### 2.2.2 Усилитель класса D

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Модель усилителя класса D с PWM-модуляцией  
> ⚠️ **Частично:** Упрощенная модель передатчика в `SignalPathCalculator` (напряжение TX)

**Параметры:**

- Напряжение питания: $V_{dd}$ [В] - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР** ⚠️ **Частично:** используется tx_voltage в SignalPathCalculator
- Диапазон: $V_{dd,min} \leq V_{dd} \leq V_{dd,max}$ ❌
- Выходной импеданс: $R_{amp}$ [Ом] ❌
- КПД: $\eta_{amp}(P_{out})$ [%] - функция от выходной мощности ❌
- Частота коммутации: $f_{PWM}$ [Гц] ❌
- Максимальная выходная мощность: $P_{amp,max}$ [Вт] ❌

**Характеристики нелинейности:**

- Модель AM/AM искажений ❌
- Модель AM/PM искажений ❌
- Коэффициенты гармоник: $\text{THD}(V_{out})$ ❌

##### 2.2.2.1 Механизм PWM-модуляции и формирования напряжения на пьезо

**Физический принцип:**

Усилитель класса D работает в режиме широтно-импульсной модуляции (PWM). Амплитудная огибающая $A(t)$ чирп-сигнала модулирует скважность PWM-сигнала, который после трансформатора и LC-фильтрации (согласующая индуктивность $L$ + емкость трансдьюсера $C_p$) формирует требуемое синусоидальное напряжение на пьезоэлектрическом трансдьюсере.

**Математическая модель PWM-модуляции:**

**1. Формирование PWM-сигнала:**

Входной сигнал от DAC:
$$s_{DAC}(t) = A(t) \cdot \cos(\phi(t))$$

Сравнение с треугольным несущим сигналом частоты $f_{PWM}$:
$$V_{tri}(t) = V_{tri,peak} \cdot (2 \cdot \text{mod}(t \cdot f_{PWM}, 1) - 1)$$

PWM-сигнал на выходе компаратора:
$$\text{PWM}(t) = \begin{cases}
+V_{dd}, & \text{если } s_{DAC}(t) > V_{tri}(t) \\
-V_{dd}, & \text{если } s_{DAC}(t) < V_{tri}(t)
\end{cases}$$

Мгновенная скважность (duty cycle):
$$D(t) = 0.5 + 0.5 \cdot \frac{s_{DAC}(t)}{V_{dd}} = 0.5 \cdot \left(1 + \frac{A(t) \cdot \cos(\phi(t))}{V_{dd}}\right)$$

**2. Среднее напряжение PWM-сигнала:**

За период коммутации $T_{PWM} = 1/f_{PWM}$:
$$V_{PWM,avg}(t) = V_{dd} \cdot (2 \cdot D(t) - 1) = A(t) \cdot \cos(\phi(t))$$

Это означает, что среднее значение PWM-сигнала точно соответствует исходному аналоговому сигналу.

**3. Требование к частоте коммутации:**

Для корректного восстановления сигнала частотой $f_{max}$:
$$f_{PWM} \gg f_{max} \quad \text{(типично } f_{PWM} \geq 10 \cdot f_{max}\text{)}$$

Для полосы чирпа $[f_0, f_1]$:
$$f_{PWM} \geq 10 \cdot \max(f_0, f_1)$$

> **Пример:** при $f_1 = 200$ кГц → $f_{PWM} \geq 2$ МГц (в конфигурации указано 2 МГц - **КОРРЕКТНО**)

**4. Преобразование через трансформатор:**

Трансформатор с коэффициентом $n:1$ преобразует напряжение:
$$V_{sec}(t) = \frac{V_{PWM,avg}(t)}{n} = \frac{A(t) \cdot \cos(\phi(t))}{n}$$

Импеданс трансформатора на вторичной обмотке:
$$Z_{sec} = \frac{Z_{pri}}{n^2}$$

где $Z_{pri} = R_{amp}$ - выходной импеданс усилителя.

**5. LC-фильтрация (согласующая индуктивность + емкость трансдьюсера):**

Согласующая индуктивность $L$ и емкость трансдьюсера $C_p$ (параллельная емкость из BVD модели) образуют LC-фильтр, который:
- Подавляет гармоники PWM (частоты $f_{PWM}$, $2f_{PWM}$, ...)
- Пропускает полезный сигнал в полосе $[f_0, f_1]$

**Физическая схема:**
- Индуктивность $L$ - согласующая индуктивность (внешний элемент)
- Емкость $C$ - это **емкость трансдьюсера** $C_p$ (параллельная емкость из BVD модели)
- Резонансная частота LC-фильтра: $f_{LC} = \frac{1}{2\pi\sqrt{L \cdot C_p}}$

> **Важно:** Емкость $C$ в LC-фильтре - это не отдельный конденсатор, а **параллельная емкость $C_p$ трансдьюсера** из BVD модели. Это означает, что трансдьюсер сам является частью фильтра.

Передаточная функция фильтра:
$$H_{filter}(f) = \frac{Z_{transducer}(f)}{Z_{transducer}(f) + j\omega L + Z_{sec}}$$

где $Z_{transducer}(f)$ включает емкость $C_p$ как часть BVD модели.

На частотах сигнала ($f \ll f_{PWM}$):
$$H_{filter}(f) \approx \frac{Z_{transducer}(f)}{Z_{transducer}(f) + j\omega L + \frac{R_{amp}}{n^2}}$$

Напряжение на пьезо:
$$V_{piezo}(t) = V_{sec}(t) \cdot |H_{filter}(f(t))| \approx \frac{A(t) \cdot \cos(\phi(t))}{n} \cdot |H_{filter}(f(t))|$$

**6. Компенсация частотной зависимости:**

Для выравнивания акустической мощности по полосе чирпа, огибающая $A(t)$ должна компенсировать:
- Импеданс трансдьюсера: $G_Z(f) = \sqrt{\frac{|Z(f)|}{|Z_{ref}|}}$
- Чувствительность TVR: $G_{TVR}(f) = \frac{\text{TVR}(f_{ref})}{\text{TVR}(f)}$
- Затухание в канале: $G_{channel}(f,d) = 10^{\alpha(f) \cdot d / 20}$
- Эффективность согласования: $G_{matching}(f) = \frac{1}{\sqrt{\eta_{matching}(f,L,n)}}$

Итоговая огибающая:
$$A(t) = A_0 \cdot G(f(t))$$

где
$$G(f) = G_Z(f) \cdot G_{TVR}(f) \cdot G_{channel}(f,d) \cdot G_{matching}(f)$$

**7. Мощность на пьезо:**

Мгновенная электрическая мощность:
$$P_{elec}(t) = \frac{|V_{piezo}(t)|^2}{\text{Re}(Z_{transducer}(f(t)))}$$

Средняя мощность за период чирпа:
$$P_{elec,avg} = \frac{1}{T} \int_0^T P_{elec}(t) \, dt$$

**8. Ограничения:**

- Пиковое напряжение: $\max(V_{piezo}(t)) \leq V_{linear,max}$
- Пиковая мощность: $\max(P_{elec}(t)) \leq P_{elec,max}$
- Частота коммутации: $f_{PWM} \geq 10 \cdot f_1$ (для подавления гармоник PWM)
- Нелинейность: $\text{THD}(V_{piezo}(t)) \leq \text{THD}_{max}$ для всех $t$

> **КРИТИЧЕСКОЕ ЗАМЕЧАНИЕ:**  
> В текущей конфигурации (раздел 8.3) указано $f_{PWM} = 2$ МГц, что соответствует требованию $f_{PWM} \geq 10 \cdot f_{max}$ для полосы до 200 кГц. Для более высоких частот или лучшего подавления гармоник рекомендуется $f_{PWM} \geq 2.5-3$ МГц.

#### 2.2.3 Трансформатор

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Модель трансформатора

**Параметры:**

- Коэффициент трансформации: $n$ (отношение витков $n:1$) - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР** ❌
- Диапазон: $n_{min} \leq n \leq n_{max}$ (типично 1:5 до 1:30) ❌
- Индуктивность рассеяния: $L_{leak}$ [Гн] ❌
- Сопротивление обмоток: $R_{pri}$, $R_{sec}$ [Ом] ❌
- КПД: $\eta_{trans}(f)$ [%] - зависимость от частоты ❌
- Паразитная емкость: $C_{par}$ [Ф] ❌

#### 2.2.4 Согласующая индуктивность

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Модель согласующей индуктивности

**Параметры:**

- Индуктивность: $L$ [Гн] - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР** ❌
- Диапазон: $L_{min} \leq L \leq L_{max}$ (типично 10 мкГн - 10 мГн) ❌
- Добротность: $Q_L(f)$ ❌
- Активное сопротивление: $R_L$ [Ом] ❌
- Максимальный ток: $I_{max}$ [А] ❌

**Критерий оптимизации:**

Индуктивность оптимизируется **НЕ** по согласованию на центральной частоте, а по максимуму качества корреляционного отклика (PSR, ISL, SNR_eff).

#### 2.2.5 Акустический трансдьюсер

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** Базовая модель трансдьюсера (`core/transducer_model.py`)
> - TVR (Transmitting Voltage Response) - `get_tx_sensitivity(f)`
> - RX чувствительность - `get_rx_sensitivity(f)`
> - Направленность - `get_directivity(theta)`
> - Время затухания - `get_ringdown_time()`
> - Валидация частоты - `validate_frequency(f)`
> 
> ✅ **РЕАЛИЗОВАНО:** Создание BVD моделей из экспериментальных данных
> - ✅ BVD, MBVD, EBVD, Mason, KLM модели из Conductance/Susceptance (`scripts/bvd.py`)
> - ✅ Автоматическая оптимизация параметров (R_s, L_s, C_s, C_p и др.)
> - ✅ Расчет резонансных частот (f_s, f_p)
> - ✅ Экспорт в формат SonarCore JSON
> 
> ❌ **НЕ реализовано:**
> - Модель нелинейности

**Эквивалентная электрическая схема (модель BVD):**

$$Z_{transducer}(\omega) = \frac{1}{j\omega C_p + \frac{1}{R_s + j\omega L_s + \frac{1}{j\omega C_s}}}$$

**Альтернативная форма (после преобразований):**

$$Z(\omega) = \frac{R_s + j\omega L_s + \frac{1}{j\omega C_s}}{1 + j\omega C_p \left(R_s + j\omega L_s + \frac{1}{j\omega C_s}\right)}$$

**Параметры:**

- $R_s$ - последовательное сопротивление (механические потери) [Ом]
- $L_s$ - последовательная индуктивность (эффективная масса) [Гн]
- $C_s$ - последовательная емкость (упругость) [Ф]
- $C_p$ - параллельная емкость (зажимная емкость) [Ф]

**Резонансные частоты:**

Последовательный резонанс (минимум $|Z|$):
$$f_s = \frac{1}{2\pi\sqrt{L_s \cdot C_s}} \quad \text{[Гц]}$$

Параллельный резонанс (максимум $|Z|$):
$$f_p = f_s \cdot \sqrt{1 + \frac{C_s}{C_p}} \quad \text{[Гц]}$$

> **⚠️ ОГРАНИЧЕНИЕ ДЛЯ ШИРОКОПОЛОСНЫХ СИГНАЛОВ:**  
> **Рабочая полоса частот должна быть ВНЕ резонансной полосы для широкополосных чирп-сигналов!**
> 
> **Физические причины:**
> 
> 1. **Резкое изменение импеданса в узкой полосе:**
>    - В резонансной полосе $[f_s, f_p]$ импеданс меняется в 10-100 раз (20-40 дБ)
>    - Для чирп-сигнала это означает, что разные частоты имеют сильно различающиеся импедансы
>    - Затрудняет компенсацию огибающей: $G_Z(f) = \sqrt{|Z(f)| / |Z_{ref}|}$ становится нестабильной
> 
> 2. **Нестабильность параметров:**
>    - В резонансной полосе импеданс сильно зависит от температуры, нагрузки, старения
>    - Высокий Q-фактор (10-50) означает узкую полосу, где параметры критически чувствительны
> 
> 3. **Усиление нелинейных эффектов:**
>    - На $f_s$ механическая амплитуда максимальна → усиление нелинейности
>    - Повышенный THD, гармоники, интермодуляция
>    - Модель нелинейности становится критически важной
> 
> 4. **Проблемы согласования:**
>    - Резкое изменение импеданса усложняет согласование с усилителем и трансформатором
>    - Коэффициент отражения $\Gamma(f)$ сильно меняется в полосе
>    - Оптимизация согласующей индуктивности $L$ становится нестабильной
> 
> **Рекомендации:**
> - Для широкополосных чирп-сигналов: $f_{max} < 0.8 \cdot f_s$ или $f_{min} > 1.2 \cdot f_p$
> - Для узкополосных сигналов (полоса < 5% от $f_s$): работа вблизи резонанса допустима и даже желательна для эффективности
> - Компромисс: можно работать между $f_s$ и $f_p$, но требуется точная компенсация огибающей и учет нелинейности
> 
> **Пример:** Если $f_s = 30$ кГц и $f_p = 32$ кГц, для чирпа с полосой 20 кГц:
> - ❌ Плохо: $[25, 45]$ кГц (захватывает резонансную полосу)
> - ✅ Хорошо: $[10, 24]$ кГц (ниже резонанса) или $[38, 58]$ кГц (выше резонанса)

**Акустические параметры:**

- $\text{TVR}(f)$ - Transmitting Voltage Response [дБ re 1μPa/V @ 1m] ✅ **Реализовано в `TransducerModel.get_tx_sensitivity()`**
- Чувствительность: $S(f)$ [дБ re 1V/μPa] ✅ **Реализовано в `TransducerModel.get_rx_sensitivity()`**
- Рабочая полоса частот: $[f_{min}, f_{max}]$ [Гц] ✅ **Реализовано**
- Максимальная электрическая мощность: $P_{elec,max}$ [Вт]
- Максимальная акустическая мощность: $P_{acoustic,max}$ [Вт]

**Модель нелинейности (обязательно учитывается):**

**Вариант A: Модель Дуффинга**

$$m \cdot \ddot{x} + c \cdot \dot{x} + k_1 \cdot x + k_3 \cdot x^3 = F(t)$$

где:
- $k_1$ - линейная жесткость [Н/м]
- $k_3$ - коэффициент кубической нелинейности [Н/м³]

**Вариант B: Полиномиальная модель**

$$p_{acoustic}(t) = a_1 \cdot V(t) + a_2 \cdot V^2(t) + a_3 \cdot V^3(t) + \ldots$$

где $V(t)$ - входное напряжение.

**Вариант C: Модель Вольтерра**

$$y(t) = H_1[x(t)] + H_2[x(t)] + H_3[x(t)]$$

где $H_1$, $H_2$, $H_3$ - ядра Вольтерра 1-го, 2-го, 3-го порядка.

**Граница линейности:**

- Порог линейности: $V_{linear}$ [В] или $P_{linear}$ [Вт]
- При превышении: $\text{THD} > \text{THD}_{max}$

---

## 3. МОДЕЛЬ ПОДВОДНОГО АКУСТИЧЕСКОГО КАНАЛА

### 3.1 Затухание в морской воде

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** Формула Франсуа-Гаррисона (`core/water_model.py`)
> - `calculate_attenuation(f, T, S, P)` - затухание по Франсуа-Гаррисону
> - `calculate_absorption_loss(D, f, T, S, z)` - потери на поглощение
> - `calculate_spreading_loss(D)` - геометрическое затухание (сферическое)
> - `calculate_transmission_loss(D, f, T, S, z)` - полное затухание передачи
> 
> ❌ **НЕ реализовано:** Формула Торпа (используется более точная Франсуа-Гаррисон)

**Формула Торпа (Thorp):**

$$\alpha(f) = \frac{0.11 \cdot f^2}{1 + f^2} + \frac{44 \cdot f^2}{4100 + f^2} + 2.75 \times 10^{-4} \cdot f^2 + 0.003 \quad \text{[дБ/км]}$$

где $f$ - частота в кГц.

**Альтернатива:** формула Франсуа-Гаррисона (более точная, зависит от температуры, солености, глубины):
$$\alpha(f, T, S, D)$$ - сложная формула, использовать при наличии данных о среде.

✅ **Реализовано в `WaterModel.calculate_attenuation()`** - использует формулу Франсуа-Гаррисона с учетом:
- Вязкого затухания
- Релаксации борной кислоты B(OH)₃
- Релаксации сульфата магния MgSO₄

### 3.2 Геометрические потери

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** `WaterModel.calculate_spreading_loss(D)` - сферическое распространение

**Сферическое распространение:**
$$\text{TL}_{geom}(d) = 20 \cdot \log_{10}(d) \quad \text{[дБ]}$$

**Цилиндрическое распространение (для мелкой воды):**
$$\text{TL}_{geom}(d) = 10 \cdot \log_{10}(d) \quad \text{[дБ]}$$

❌ **НЕ реализовано:** Цилиндрическое распространение

### 3.3 Полные потери передачи

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** `WaterModel.calculate_transmission_loss(D, f, T, S, z)`  
> ✅ **Реализовано:** `ChannelModel.apply_attenuation_only()` - частотно-зависимое затухание для чирп-сигналов

$$\text{TL}(f, d) = \text{TL}_{geom}(d) + \alpha(f) \cdot d \quad \text{[дБ]}$$

### 3.4 Шум океана

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Модель шума океана (Wenz)

**Модель Венца (Wenz):**

**Компоненты шума:**
- Турбулентность: $N_{turb}(f)$
- Судоходство: $N_{ship}(f, \text{traffic\_level})$
- Волнение: $N_{wave}(f, \text{wind\_speed})$
- Тепловой шум: $N_{thermal}(f)$

**Суммарный шум:**
$$N_{total}(f) = 10 \cdot \log_{10}\left(10^{N_{turb}/10} + 10^{N_{ship}/10} + 10^{N_{wave}/10} + 10^{N_{thermal}/10}\right)$$

**Упрощенная модель:**
$$N_L(f) = 50 + 7.5 \cdot \sqrt{w} + 20 \cdot \log_{10}(f) - 40 \cdot \log_{10}(f + 0.4) \quad \text{[дБ re 1μPa²/Hz]}$$

где $w$ - скорость ветра [м/с].

> **Примечание:** В SonarCore используется упрощенная модель теплового шума в `ReceiverModel` (k_B*T*BW), но не модель океанского шума.

### 3.5 Многолучевость

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Многолучевая модель канала

**Модель канала:**
$$h(t) = \sum_i a_i \cdot \delta(t - \tau_i)$$

где:
- $a_i$ - коэффициент затухания $i$-го луча
- $\tau_i$ - задержка $i$-го луча

**Оценка разброса задержек:**
$$\tau_{spread}(d, H) \approx 0.001 \cdot d + \frac{d^2}{2 \cdot c \cdot H} \quad \text{[секунды]}$$

где:
- $d$ - дальность [м]
- $H$ - глубина канала [м]
- $c$ - скорость звука $\approx 1500$ м/с

### 3.6 Доплеровский сдвиг

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Доплеровский сдвиг

$$\Delta f_{doppler} = \frac{f_c \cdot v_{rel}}{c_{water}}$$

где:
- $v_{rel}$ - относительная скорость приемника/передатчика [м/с]
- $c_{water} \approx 1500$ м/с

---

## 4. СИГНАЛ МОДУЛЯЦИИ

### 4.1 Тип сигнала

Только чирп-сигнал (ЛЧМ - линейная частотная модуляция).

### 4.2 Параметры чирпа

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** `core/signal_model.py` - `SignalModel.generate_chirp()`
> - Генерация линейного чирпа
> - Оконные функции: Rect, Hann, Tukey
> - Расчет мгновенной частоты: `get_instantaneous_frequency()`
> - Расчет полосы: `get_bandwidth()`
> 
> ❌ **НЕ реализовано:** Компенсирующая огибающая A(t)

**Математическое описание:**

$$s(t) = A(t) \cdot \cos(\phi(t)), \quad t \in [0, T]$$

где:
- $\phi(t) = 2\pi \cdot \left(f_0 \cdot t + \frac{(f_1 - f_0) \cdot t^2}{2T}\right)$ - фаза (линейный чирп) ✅ **Реализовано**
- $f(t) = f_0 + \frac{(f_1 - f_0) \cdot t}{T}$ - мгновенная частота ✅ **Реализовано в `get_instantaneous_frequency()`**
- $A(t)$ - амплитудная огибающая (компенсация) ❌ **НЕ реализовано**

**Оптимизируемые параметры:**

- $f_0$ - начальная частота [Гц] - **ОПТИМИЗИРУЕТСЯ**
- $f_1$ - конечная частота [Гц] - **ОПТИМИЗИРУЕТСЯ**
- $T$ - длительность чирпа [с] - **ОПТИМИЗИРУЕТСЯ**

**Производные параметры:**

- $B = f_1 - f_0$ - полоса чирпа [Гц]
- $f_c = \sqrt{f_0 \cdot f_1}$ - геометрическая центральная частота [Гц]
- $TB$ - база сигнала (time-bandwidth product)

> **⚠️ ОГРАНИЧЕНИЕ НА ВЫБОР ЧАСТОТ:**  
> Полоса чирпа $[f_0, f_1]$ должна быть **вне резонансной полосы** трансдьюсера для широкополосных сигналов:
> - $f_1 < 0.8 \cdot f_s$ (ниже последовательного резонанса) **ИЛИ**
> - $f_0 > 1.2 \cdot f_p$ (выше параллельного резонанса)
> 
> Работа в резонансной полосе приводит к резкому изменению импеданса, нестабильности параметров и усилению нелинейных эффектов (см. раздел 2.2.5).

### 4.3 Амплитудная огибающая A(t)

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Компенсирующая огибающая A(t)  
> ✅ **Реализовано:** Оконные функции в `SignalModel.generate_chirp()` (Hann, Tukey, Rect)

> **ВАЖНО:** Огибающая **НЕ** является оконной функцией для подавления боковых лепестков!

**Назначение:**

Компенсация частотно-зависимых характеристик системы для выравнивания акустической мощности по полосе чирпа.

**Формирование:**

$$A(t) = A_0 \cdot G(f(t))$$

где $G(f)$ - функция компенсации:

$$G(f) = G_Z(f) \cdot G_{TVR}(f) \cdot G_{channel}(f,d) \cdot G_{matching}(f,L,n)$$

**Компоненты:**

- $G_Z(f) = \sqrt{\frac{|Z(f)|}{|Z_{ref}|}}$ - компенсация импеданса трансдьюсера
- $G_{TVR}(f) = \frac{\text{TVR}(f_{ref})}{\text{TVR}(f)}$ - компенсация чувствительности
- $G_{channel}(f,d) = 10^{\alpha(f) \cdot d / 20}$ - компенсация частотного затухания
- $G_{matching}(f) = \frac{1}{\sqrt{\eta_{matching}(f,L,n)}}$ - компенсация согласования

**С учетом нелинейности:**

$$G_{optimized}(f) = G_{ideal}(f) \cdot w_{NL}(f)$$

где $w_{NL}(f) = \frac{1}{1 + k \cdot \text{NL}(V(f))}$ - весовая функция

- $\text{NL}(V) = \text{THD}(V)$ - нелинейность от амплитуды
- $k$ - параметр компромисса (оптимизируется)

**Параметризация огибающей (один из вариантов):**

**Вариант A: Дискретные отсчеты**
- $G_{params} = [G_1, G_2, \ldots, G_K]$ - $K$ контрольных точек по частоте
- $G(f) = \text{интерполяция}(f, G_{params})$

**Вариант B: Параметрическая модель**
$$G(f) = G_{base} \cdot \left[1 + \sum_i a_i \cdot \phi_i(f)\right]$$
- $\phi_i(f)$ - базисные функции (полиномы Чебышева, сплайны)
- $G_{params} = [a_1, a_2, \ldots, a_m]$

**Вариант C: Кусочно-линейная**
- Частотный диапазон $[f_0, f_1]$ разбит на $K$ сегментов
- $G_{params}$ = значения в узлах

**Ограничения на огибающую:**

1. Пиковое напряжение: $\max(V_{dd} \cdot G(f)) \leq V_{max}$
2. Средняя мощность: $\frac{1}{T} \int P(G(t)) \, dt \leq P_{avg,max}$
3. Нелинейность: $\text{THD}(f, G(f)) \leq \text{THD}_{max}$ для всех $f$
4. Гладкость: $\max\left|\frac{dG}{df}\right| \leq \text{slope}_{max}$ (избежать скачков)
5. Минимум: $G(f) \geq G_{min}$ для всех $f$ (не обнулять частоты)

### 4.4 Предыскажение (Predistortion)

> **📌 Статус реализации в SonarCore:**  
> ❌ **НЕ реализовано:** Цифровое предыскажение (DPD)

**Цифровое предыскажение (DPD) на уровне DAC:**

**Полиномиальная модель:**
$$x_{predist}(n) = \sum_k b_k \cdot x(n) \cdot |x(n)|^{k-1}$$

Оптимизируемые коэффициенты: $b_1, b_3, b_5, \ldots$

**Memory Polynomial:**
$$x_{predist}(n) = \sum_k \sum_m a_{km} \cdot x(n-m) \cdot |x(n-m)|^k$$

Учет эффектов памяти усилителя.

**Метод обучения:**

- Непрямое обучение (indirect learning architecture)
- Адаптивная подстройка по обратной связи
- Итеративный алгоритм


---

## 5. ОБРАБОТКА НА ПРИЕМЕ

### 5.1 Согласованная фильтрация

**Эталонный сигнал с оконной функцией:**

$$s_{ref}(t) = w(t) \cdot \cos(\phi(t))$$

где:
- $w(t)$ - оконная функция (**НЕ** компенсирующая огибающая!)
- $\phi(t)$ - фаза идеального чирпа (без искажений)

> **КРИТИЧНО:**
> 
> - **Передаваемый сигнал:** $A(t) \cdot \cos(\phi(t))$ - С компенсирующей огибающей, **БЕЗ** окна
> - **Эталонный сигнал:** $w(t) \cdot \cos(\phi(t))$ - С оконной функцией, **БЕЗ** компенсации

### 5.2 Оконные функции

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** `SignalModel.generate_chirp()` поддерживает:
> - Rectangular (`window='Rect'`)
> - Hann (`window='Hann'`)
> - Tukey (`window='Tukey'`, alpha=0.25)
> 
> ❌ **НЕ реализовано:** Hamming, Blackman, Kaiser, Taylor, Dolph-Chebyshev

**Доступные типы окон:**

| Окно | Формула | PSR [дБ] | Расширение | SNR потери [дБ] |
|------|---------|----------|------------|-----------------|
| Rectangular | $w(t) = 1$ | ~13 | 1.0x | 0.0 |
| Hamming | $0.54 - 0.46 \cdot \cos(2\pi t/T)$ | ~42 | 1.3x | -1.34 |
| Hann | $0.5 \cdot (1-\cos(2\pi t/T))$ | ~31 | 1.5x | -1.76 |
| Blackman | $0.42-0.5\cdot\cos(2\pi t/T)+0.08\cdot\cos(4\pi t/T)$ | ~58 | 1.7x | -2.38 |
| Kaiser($\beta$) | $I_0(\beta\sqrt{1-(2t/T-1)^2})/I_0(\beta)$ | зависит от $\beta$ | зависит | -1.8 до -3.5 |
| Tukey($\alpha$) | кусочно-косинусоидальное | зависит от $\alpha$ | 1.1-1.5x | -0.5 до -1.5 |
| Taylor | оптимизированное | ~35-50 | настраивается | настраивается |
| Dolph-Chebyshev | равноуровневые лепестки | настраивается | минимальное | зависит |

**Выбор окна - ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР:**

- `window_type` $\in$ {hamming, kaiser, tukey, taylor, blackman, ...}
- `window_params` - параметры окна ($\beta$ для Kaiser, $\alpha$ для Tukey)

### 5.3 Корреляционная обработка

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** `core/dsp_model.py` - `DSPModel.matched_filter()`
> - Согласованная фильтрация (matched filtering)
> - FFT-based корреляция для больших массивов
> - Поиск пика с параболической интерполяцией: `find_peak()`
> - Расчет TOF и дальности: `calculate_tof()`
> - Оценка неопределенности дальности: `estimate_range_uncertainty()`

**Вычисление автокорреляционной функции:**

$$R(\tau) = \int s_{rx}(t) \cdot s_{ref}^*(t-\tau) \, dt$$

где:
- $s_{rx}(t)$ - принятый сигнал (искаженный каналом)
- $s_{ref}(t)$ - эталонный сигнал с окном ✅ **Реализовано в `SignalModel.generate_chirp()`**

### 5.4 Метрики качества корреляции

**1. Peak-to-Sidelobe Ratio (PSR):**

$$\text{PSR} = 20 \cdot \log_{10}\left(\frac{|R_{peak}|}{\max|R_{sidelobe}|}\right) \quad \text{[дБ]}$$

Требование: $\text{PSR} \geq \text{PSR}_{min}$ (типично 20-30 дБ)

**2. Integrated Sidelobe Level (ISL):**

$$\text{ISL} = 10 \cdot \log_{10}\left(\frac{\int_{sidelobes} |R(\tau)|^2 \, d\tau}{|R_{peak}|^2}\right) \quad \text{[дБ]}$$

Требование: $\text{ISL} \leq \text{ISL}_{max}$ (типично -15 дБ)

**3. Ширина главного лепестка:**

- $\Delta\tau_{3dB}$ - ширина на уровне -3 дБ [с]
- Связь с разрешением: $\Delta r = \frac{c \cdot \Delta\tau_{3dB}}{2}$ [м]
- Требование: минимизировать

**4. Эффективный SNR:**

$$\text{SNR}_{eff} = 20 \cdot \log_{10}\left(\frac{|R_{peak}|}{\sigma_{noise}}\right) - L_{window} \quad \text{[дБ]}$$

где:
- $\sigma_{noise}$ - СКО боковых лепестков (оценка шума)
- $L_{window}$ - потери от оконной функции

**5. Mainlobe-to-Sidelobe Energy Ratio (MSER):**

$$\text{MSER} = \frac{E_{mainlobe}}{E_{sidelobes}}$$

---

## 6. ЗАДАЧА ОПТИМИЗАЦИИ

### 6.1 Вектор оптимизируемых параметров

$$\mathbf{x} = \begin{bmatrix}
    V_{dd}, & n, & L, & f_0, & f_1, & T, & G_{params}, & DPD_{coeffs}, & window_{type}, & window_{param}
\end{bmatrix}^T$$

**Состав вектора:**

- **Электрические параметры (3 переменные):**
  - $V_{dd}$ - Напряжение питания усилителя [В] - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**
  - $n$ - Коэффициент трансформации (отношение витков $n:1$) - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**
  - $L$ - Согласующая индуктивность [Гн] - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**
  
- **Параметры чирпа (3 переменные):**
  - $f_0$ - Начальная частота [Гц] - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**
  - $f_1$ - Конечная частота [Гц] - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**
  - $T$ - Длительность чирпа [с] - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**
  
- **Компенсирующая огибающая ($K$ переменных):**
  - $G_{params} = [G_1, G_2, \ldots, G_K]$ или $[a_1, a_2, \ldots, a_m]$
  
- **Предыскажение ($M$ переменных, опционально):**
  - $DPD_{coeffs} = [b_1, b_3, b_5, \ldots]$ или $[a_{km}]$
  
- **Оконная функция на приеме (1-2 переменные):**
  - $window_{type}$ - Тип окна (дискретный выбор) - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**
  - $window_{param}$ - Параметр окна ($\beta$, $\alpha$, и т.д.) - **ОПТИМИЗИРУЕМЫЙ ПАРАМЕТР**

**Общая размерность:** $6 + K + M + 2$ переменных (типично 15-50)

### 6.2 Целевая функция

**Главная цель:** максимизация битрейта

$$\text{maximize: } R_{bit}(\mathbf{x}, d)$$

где:

$$R_{bit} = \frac{B}{T + T_{guard}} \cdot \eta_{overhead} \cdot \log_2\left(1 + \frac{\text{SNR}_{eff}}{\Gamma_{gap}}\right)$$

**Компоненты:**

- $B = f_1 - f_0$ - полоса [Гц]
- $T_{guard} = \max(\tau_{spread}(d), k \cdot T)$ - защитный интервал [с], $k \approx 0.05-0.1$
- $\eta_{overhead} \approx 0.8$ - потери на служебные данные
- $\Gamma_{gap} \approx 3$ дБ - разрыв до пропускной способности Шеннона
- $\text{SNR}_{eff}$ - эффективный SNR с учетом всех искажений

**Альтернативная многокритериальная формулировка:**

$$\text{maximize: } F(\mathbf{x}) = w_1 \cdot R_{bit}(\mathbf{x}) - w_2 \cdot P_{consumed}(\mathbf{x}) + w_3 \cdot \eta_{total}(\mathbf{x}) - w_4 \cdot \text{Penalty}(\mathbf{x})$$

где:
- $w_1, w_2, w_3, w_4$ - весовые коэффициенты
- $P_{consumed}$ - энергопотребление [Вт]
- $\eta_{total}$ - общий КПД системы
- $\text{Penalty}$ - штрафные функции за нарушение ограничений

### 6.3 Вычисление SNR_eff

**Полная модель:**

$$\text{SNR}_{eff}(\mathbf{x}, d) = \text{SL}(\mathbf{x}) - \text{TL}(f_c, d) - \text{NL}(f_c) + G_{proc}(\mathbf{x}) - L_{NL}(\mathbf{x}) - L_{window}(\mathbf{x})$$

где:
- $\text{SL}(\mathbf{x})$ = Source Level [дБ re 1μPa @ 1m]
- $\text{TL}(f_c, d)$ = Transmission Loss [дБ]
- $\text{NL}(f_c)$ = Noise Level [дБ]
- $G_{proc}(\mathbf{x}) = 10 \cdot \log_{10}(T \cdot B)$ [дБ] - Processing Gain
- $L_{NL}(\mathbf{x})$ = Потери от нелинейности [дБ]
- $L_{window}(\mathbf{x})$ = Потери от оконной функции [дБ]

**Source Level:**

$$\text{SL} = 171.5 + 10 \cdot \log_{10}(P_{acoustic}) \quad \text{[дБ re 1μPa @ 1m]}$$

где $P_{acoustic}$ - акустическая мощность в ваттах.

> Константа 171.5 дБ соответствует 170.8 дБ (стандартное значение) + небольшая поправка на единицы измерения.

где:

$$P_{acoustic} = P_{elec,avg} \cdot \eta_{amp} \cdot \eta_{trans} \cdot \eta_{matching} \cdot \eta_{transducer} \cdot \eta_{envelope}$$

$$P_{elec,avg} = \frac{1}{T} \int_0^T P_{elec}(t) \, dt$$

где мгновенная мощность:

$$P_{elec}(t) = \frac{|V_{piezo}(t)|^2}{\text{Re}(Z_{transducer}(f(t)))}$$

$$V_{piezo}(t) = \frac{A(t) \cdot \cos(\phi(t))}{n} \cdot |H_{filter}(f(t))|$$

**Приближенная оценка (для начальных расчетов):**

$$P_{elec,avg} \approx \frac{V_{dd}^2}{2 \cdot n^2} \cdot \frac{1}{Z_{load,eff}} \cdot \frac{1}{T} \int_0^T G^2(f(t)) \, dt$$

**Эффективность согласования:**

$$\eta_{matching}(f, L, n) = 1 - |\Gamma(f)|^2$$

$$\Gamma(f) = \frac{Z_{total} - Z_{opt}}{Z_{total} + Z_{opt}}$$

$$Z_{total}(f) = \frac{R_{amp}}{n^2} + j\omega L + Z_{transducer}(f)$$

**Потери от огибающей:**

$$\eta_{envelope} = \frac{\int A^2(t) \, dt}{A_{max}^2 \cdot T}$$

**Потери от нелинейности:**

$$L_{NL} = -10 \cdot \log_{10}\left(\frac{1}{1 + \text{THD}^2}\right) \cdot (1 - k_{DPD})$$

где:
- $\text{THD}$ - суммарный коэффициент гармонических искажений
- $k_{DPD}$ - эффективность предыскажения (0.5-0.9)

**Потери от окна:**

$$L_{window} = -10 \cdot \log_{10}\left(\frac{\int w^2(t) \, dt}{T}\right)$$
6.4 Ограничения (Constraints)
Жесткие ограничения (must satisfy):
pythonconstraints = {
    # 0. КРИТИЧЕСКОЕ: Рабочая полоса вне резонанса (для широкополосных сигналов)
    'resonance_avoidance': {
        'f_max < 0.8 * f_s': True,  # или
        'f_min > 1.2 * f_p': True   # рабочая полоса выше резонанса
    },
    # Проверка: (f_max < 0.8 * f_s) ИЛИ (f_min > 1.2 * f_p)
    # Исключение: узкополосные сигналы (полоса < 5% от f_s) могут работать вблизи резонанса
    
    # 1. Энергетические ограничения
    'voltage_limits': V_dd_min ≤ V_dd ≤ V_dd_max,
    'power_peak': P_elec_peak(x) ≤ P_peak_max,
    'power_average': P_elec_avg(x) ≤ P_avg_max,
    
    # 2. Параметры трансформатора (n - оптимизируемый параметр)
    'transformer_ratio': n_min ≤ n ≤ n_max,  # n оптимизируется в диапазоне [n_min, n_max]
    
    # 3. Индуктивность
    'inductance_limits': L_min ≤ L ≤ L_max,
    'inductor_current': I_L_max(x) ≤ I_L_rated,
    
    # 4. Частотные ограничения
    'frequency_range': f_transducer_min ≤ f₀ < f₁ ≤ f_transducer_max,
    'bandwidth_min': B = f₁ - f₀ ≥ B_min,
    'bandwidth_3dB': f₀, f₁ в полосе 3dB трансдьюсера,
    
    # 5. Временные ограничения
    'chirp_duration_min': T ≥ T_min = 5·τ_spread(d),  # ISI margin
    'chirp_duration_max': T ≤ T_max = 1/(2·Δf_doppler),  # Doppler limit
    'time_bandwidth': T·B ≥ TB_min (типично 50-100),
    
    # 6. Качество сигнала
    'THD_limit': THD(f,G(f)) ≤ THD_max для всех f ∈ [f₀,f₁],
    'peak_voltage': max(V_dd·G(f)) ≤ V_linear_max,
    'PAPR': PAPR(A(t)) ≤ PAPR_max,
    
    # 7. Согласование
    'impedance_matching': |Γ(f,n,L)| ≤ Γ_max для всех f (типично 0.3, VSWR<2),
    
    # 8. Корреляция
    'PSR_requirement': PSR(x) ≥ PSR_min (типично 20-30 дБ),
    'ISL_requirement': ISL(x) ≤ ISL_max (типично -15 дБ),
    
    # 9. Огибающая
    'envelope_min': G(f) ≥ G_min для всех f,
    'envelope_smoothness': max|dG/df| ≤ slope_max,
    
    # 10. SNR
    'SNR_threshold': SNR(f,d) ≥ SNR_min для всех f ∈ [f₀,f₁]
}

6.5 Области определения переменных

Bounds (типовые значения, корректируются под конкретное оборудование):

V_dd:    [10, 100] В
n:       [5, 30]   (безразмерный)
L:       [10e-6, 10e-3] Гн (10 мкГн - 10 мГн)
f₀:      [5e3, 100e3] Гц (5 - 100 кГц)
f₁:      [f₀+B_min, 200e3] Гц
T:       [1e-3, 2.0] с (1 мс - 2 с)
G_k:     [0.1, 2.0] (относительная амплитуда)
b_DPD:   [-10, 10] (коэффициенты предыскажения)
β_kaiser:[0, 10] (параметр окна Kaiser)
α_tukey: [0, 1] (параметр окна Tukey)

---

## 7. АЛГОРИТМ ОПТИМИЗАЦИИ

> **📌 Статус реализации в SonarCore:**  
> ✅ **Реализовано:** Базовая оптимизация в `core/optimizer.py`
> - Оптимизация VGA gain для достижения target SNR
> - Оптимизация Tp (pulse duration)
> - Стратегии: `max_tp_min_vga`, `min_tp_for_snr`
> 
> ❌ **НЕ реализовано:** Многопараметрическая оптимизация выходного каскада
> - Оптимизация V_dd, n, L, f0, f1, T, G_params
> - Эволюционные алгоритмы (Differential Evolution, PSO, NSGA-II)
> - Оптимизация по битрейту
### 7.1 Общая структура

Многоуровневая оптимизация:
Уровень 0: Анализ дальности
└─ for d in [d₁, d₂, ..., dₙ]:Weiter07:33    Уровень 1: Грубый поиск частотного диапазона
    └─ for f_center in [10, 20, 30, 50, 100] кГц:
        
        Уровень 2: Оптимизация длительности чирпа
        └─ for T_candidate in [0.01, 0.05, 0.1, 0.2, 0.5, 1.0] с:
            
            Уровень 3: Оптимизация электрических параметров
            └─ Optimize [V_dd, n, L] при фиксированных [f₀, f₁, T]
               Метод: L-BFGS-B, SLSQP или Powell
               
            Уровень 4: Оптимизация огибающей
            └─ Optimize [G_params] при фиксированных электрических
               Метод: Sequential Quadratic Programming
               
            Уровень 5: Тонкая подстройка L по корреляции
            └─ Optimize [L] по метрикам PSR, ISL, SNR_eff
               Метод: Golden Section Search или Brent
               
            Уровень 6: Выбор оптимального окна
            └─ for window in [hamming, kaiser, tukey, ...]:
                   Evaluate correlation metrics
                   Select best window
            
            Уровень 7: Синтез предыскажения (опционально)
            └─ Train DPD coefficients
               Метод: Least Squares или Adaptive
            
            Сохранить Парето-оптимальные решения

Финальный анализ: Построение зависимостей битрейт(дальность, частота)
7.2 Рекомендуемые методы оптимизации
Для многопараметрической задачи (полный вектор x):
Вариант A: Differential Evolution
pythonfrom scipy.optimize import differential_evolution

result = differential_evolution(
    func=objective_function,
    bounds=bounds,
    constraints=NonlinearConstraint(constraint_functions, lb, ub),
    strategy='best1bin',
    maxiter=1000,
    popsize=50,
    mutation=(0.5, 1.5),
    recombination=0.7,
    workers=-1,  # параллельно на всех ядрах
    seed=42,
    polish=True  # локальная доводка лучшего решения
)
Вариант B: Particle Swarm Optimization
pythonfrom pyswarm import pso

xopt, fopt = pso(
    func=objective_function,
    lb=lower_bounds,
    ub=upper_bounds,
    ieqcons=inequality_constraints,
    f_ieqcons=constraint_functions,
    swarmsize=100,
    maxiter=500,
    processes=8
)
Вариант C: Genetic Algorithm (NSGA-II для многокритериальной)
pythonfrom pymoo.algorithms.moo.nsga2 import NSGA2
from pymoo.optimize import minimize

algorithm = NSGA2(pop_size=100)

result = minimize(
    problem=OptimizationProblem(),
    algorithm=algorithm,
    termination=('n_gen', 500),
    seed=1,
    verbose=True
)

# Получение Парето-фронта
pareto_front = result.F
pareto_solutions = result.X
Вариант D: Bayesian Optimization (для дорогих функций)
pythonfrom skopt import gp_minimize

result = gp_minimize(
    func=objective_function,
    dimensions=search_space,
    n_calls=200,
    n_random_starts=20,
    acq_func='EI',  # Expected Improvement
    random_state=42
)
7.3 Алгоритм вычисления целевой функции
pythondef objective_function(x, d, transducer_params, channel_params):
    """
    Вычисление целевой функции (битрейта) для заданных параметров
    
    Args:
        x: вектор оптимизируемых параметров
        d: дальность [м]
        transducer_params: параметры трансдьюсера
        channel_params: параметры канала (температура, соленость, ветер)
    
    Returns:
        -R_bit (отрицательное значение для минимизации)
        или tuple(-R_bit, constraints_violations) для штрафного метода
    """
    
    # 1. Распаковка параметров
    V_dd, n, L, f0, f1, T = x[0:6]
    G_params = x[6:6+K]
    DPD_coeffs = x[6+K:6+K+M] if use_DPD else None
    window_idx = int(x[-2])
    window_param = x[-1]
    
    # 2. Проверка базовых ограничений
    if not check_basic_constraints(x):
        return PENALTY_VALUE  # большое положительное число
    
    # 3. Построение компенсирующей огибающей
    G_envelope = construct_envelope(f0, f1, G_params, L, n, transducer_params)
    
    # 4. Синтез передаваемого сигнала
    t, s_tx = generate_chirp_with_envelope(f0, f1, T, G_envelope)
    
    # 5. Применение предыскажения
    if use_DPD:
        s_tx = apply_predistortion(s_tx, DPD_coeffs)
    
    # 6. Моделирование прохождения через электрический тракт
    s_amplified = amplifier_model(s_tx, V_dd, amp_params)
    s_transformed = transformer_model(s_amplified, n, transformer_params)
    s_matched = matching_network_model(s_transformed, L, f0, f1)
    
    # 7. Преобразование в акустический сигнал
    p_acoustic = transducer_model(s_matched, transducer_params, 
                                    nonlinearity=True)
    
    # 8. Вычисление нелинейных искажений
    THD = compute_THD_spectrum(s_matched, p_acoustic, f0, f1)
    if np.max(THD) > THD_max:
        return PENALTY_VALUE
    
    # 9. Распространение в канале
    p_received = channel_propagation_model(p_acoustic, f0, f1, d, 
                                           channel_params)
    
    # 10. Добавление шума
    noise = generate_ocean_noise(f0, f1, T, channel_params)
    s_rx = p_received + noise
    
    # 11. Выбор оконной функции
    windows = ['hamming', 'kaiser', 'tukey', 'taylor', 'blackman']
    window_type = windows[window_idx]
    window = create_window(window_type, len(t), window_param)
    
    # 12. Согласованная фильтрация
    s_ref = window * np.cos(2*np.pi*(f0*t + (f1-f0)*t**2/(2*T)))
    correlation = correlate(s_rx, s_ref)
    
    # 13. Вычисление метрик корреляции
    metrics = compute_correlation_metrics(correlation, T, f1-f0)
    
    PSR = metrics['PSR']
    ISL = metrics['ISL']
    mainlobe_width = metrics['mainlobe_width']
    SNR_eff = metrics['SNR_eff']
    
    # 14. Проверка качества корреляции
    if PSR < PSR_min or ISL > ISL_max:
        return PENALTY_VALUE
    
    # 15. Вычисление битрейта
    B = f1 - f0
    T_guard = max(compute_delay_spread(d, channel_params), 0.05*T)
    T_symbol = T + T_guard
    
    eta_overhead = 0.8  # потери на кодирование и служебные данные
    Gamma_gap = 10**(3/10)  # 3 dB gap to Shannon capacity
    
    R_bit = (B / T_symbol) * eta_overhead * np.log2(1 + 10**(SNR_eff/10) / Gamma_gap)
    
    # 16. Вычисление энергопотребления
    P_consumed = compute_power_consumption(V_dd, n, L, G_envelope, T)
    
    # 17. Многокритериальная оценка (опционально)
    if multi_objective:
        eta_total = compute_total_efficiency(V_dd, n, L, transducer_params)
        objectives = [
            -R_bit,           # минимизация (инвертированный битрейт)
            P_consumed,       # минимизация
            -eta_total,       # минимизация (инвертированный КПД)
            -PSR              # минимизация (инвертированный PSR)
        ]
        return objectives
    
    # 18. Однокритериальная целевая функция
    score = w1*R_bit - w2*P_consumed + w3*PSR
    
    return -score  # минимизация = максимизация битрейта
7.4 Специализированные подпрограммы
7.4.1 Оптимизация индуктивности по корреляции
pythondef optimize_inductance_for_correlation(V_dd, n, f0, f1, T, G_envelope, 
                                        d, window_type):
    """
    Оптимизация L по качеству корреляционного пика
    """
    
    def objective_L(L):
        # Вычислить метрики корреляции
        metrics = compute_correlation_with_window(
            V_dd, n, L, f0, f1, T, G_envelope, d, window_type
        )
        
        # Комбинированная метрика
        # PSR важнее для обнаружения, SNR для демодуляции
        score = 0.6 * metrics['PSR'] + 0.4 * metrics['SNR_eff']
        
        # Штраф за фазовые искажения
        phase_penalty = compute_phase_distortion(L, f0, f1, n, 
                                                  transducer_params)
        
        return -(score - 0.1*phase_penalty)
    
    # Поиск на отрезке
    result = minimize_scalar(
        objective_L,
        bounds=(L_min, L_max),
        method='bounded',
        options={'xatol': 1e-9}
    )
    
    return result.x, -result.fun
7.4.2 Оптимизация огибающей
pythondef optimize_envelope(V_dd, n, L, f0, f1, T, d, transducer_params):
    """
    Оптимизация компенсирующей огибающей G(f)
    """
    
    # Частотная ось
    freqs = np.linspace(f0, f1, K)
    
    def objective_envelope(G_values):
        # Интерполяция огибающей
        G_interp = scipy.interpolate.interp1d(freqs, G_values, 
                                              kind='cubic')
        
        # Вычислить SNR по полосе
        SNR_spectrum = []
        THD_spectrum = []
        
        for f in freqs:
            G_f = G_interp(f)
            
            # Выходная мощность на частоте f
            P_out = compute_output_power(V_dd, n, L, f, G_f, 
                                         transducer_params)
            
            # Source level
            SL = 171.5 + 10*np.log10(P_out)
            
            # Потери канала
            TL = transmission_loss(f, d)
            
            # Шум
            NL = noise_level(f)
            
            # SNR
            SNR = SL - TL - NL
            SNR_spectrum.append(SNR)
            
            # THD
            V_trans = V_dd * G_f / n
            THD = compute_transducer_THD(V_trans, f, transducer_params)
            THD_spectrum.append(THD)
        
        SNR_spectrum = np.array(SNR_spectrum)
        THD_spectrum = np.array(THD_spectrum)
        
        # Целевая функция: максимизировать минимальный SNR
        # с ограничением на THD
        SNR_min = np.min(SNR_spectrum)
        SNR_std = np.std(SNR_spectrum)  # штраф за неравномерность
        THD_violation = np.sum(np.maximum(0, THD_spectrum - THD_max)**2)
        
        return -(SNR_min - 0.1*SNR_std - 10*THD_violation)
    
    # Ограничения
    def constraint_voltage(G_values):
        # Пиковое напряжение
        return V_max - V_dd * np.max(G_values)
    
    def constraint_power(G_values):
        # Средняя мощность
        P_avg = compute_average_power(V_dd, G_values, n, L)
        return P_avg_max - P_avg
    
    def constraint_smoothness(G_values):
        # Гладкость (ограничение на производную)
        dG = np.diff(G_values)
        return slope_max - np.max(np.abs(dG))
    
    constraints = [
        {'type': 'ineq', 'fun': constraint_voltage},
        {'type': 'ineq', 'fun': constraint_power},
        {'type': 'ineq', 'fun': constraint_smoothness}
    ]
    
    # Начальное приближение - компенсация импеданса
    G_init = compute_impedance_compensation(freqs, n, L, transducer_params)
    
    # Оптимизация
    result = minimize(
        objective_envelope,
        x0=G_init,
        method='SLSQP',
        bounds=[(G_min, G_max)]*K,
        constraints=constraints,
        options={'maxiter': 200}
    )
    
    return result.x
7.4.3 Выбор оптимального окна
pythondef select_optimal_window(V_dd, n, L, f0, f1, T, G_envelope, d,
                          requirements):
    """
    Выбор оптимальной оконной функции на приеме
    """
    
    PSR_min = requirements['PSR_min']
    resolution_priority = requirements['resolution_priority']
    SNR_expected = requirements['SNR_expected']
    
    # Кандидаты окон
    if resolution_priority == 'high':
        candidates = [
            ('tukey', {'alpha': 0.05}),
            ('tukey', {'alpha': 0.1}),
            ('tukey', {'alpha': 0.2}),
            ('hamming', None)
        ]
    elif resolution_priority == 'low' or SNR_expected < 10:
        candidates = [
            ('blackman', None),
            ('kaiser', {'beta': 8}),
            ('kaiser', {'beta': 6}),
            ('kaiser', {'beta': 4})
        ]
    else:
        candidates = [
            ('hamming', None),
            ('kaiser', {'beta': 5}),
            ('tukey', {'alpha': 0.2}),
            ('taylor', {'nbar': 4, 'sll': -35}),
            ('hann', None)
        ]
    
    best_window = None
    best_score = -np.inf
    
    for window_type, window_params in candidates:
        # Вычислить метрики
        metrics = compute_correlation_with_window(
            V_dd, n, L, f0, f1, T, G_envelope, d,
            window_type=window_type,
            window_params=window_params
        )
        
        # Проверка минимальных требований
        if metrics['PSR'] < PSR_min:
            continue
        
        # Скоринг
        if resolution_priority == 'high':
            # Минимизировать расширение главного лепестка
            score = 1.0 / metrics['mainlobe_width']
        else:
            # Максимизировать PSR и SNR
            score = 0.5*metrics['PSR'] + 0.5*metrics['SNR_eff']
        
        if score > best_score:
            best_score = score
            best_window = (window_type, window_params, metrics)
    
    return best_window

8. ВХОДНЫЕ ДАННЫЕ

> **📌 Структура данных SonarCore:**  
> Система использует DTO (Data Transfer Objects) из `core/dto.py`:
> - `InputDTO` - входные параметры симуляции
> - `HardwareDTO` - параметры оборудования (transducer_id, lna_id, vga_id, adc_id)
> - `SignalDTO` - параметры чирп-сигнала (f_start, f_end, Tp, window, sample_rate)
> - `EnvironmentDTO` - параметры среды (T, S, z, bottom_reflection)
> - `RangeDTO` - параметры дальности (D_min, D_max, D_target)
> - `OutputDTO` - результаты симуляции
> 
> Данные оборудования загружаются через `data_provider` из JSON файлов в `data/`

### 8.1 Параметры трансдьюсера (обязательно)

**Структура в SonarCore:**

Трансдьюсеры хранятся в `data/transducers/*.json` и загружаются через `DataProvider.get_transducer(id)`.

**Текущая структура (упрощенная):**
```python
transducer_params = {
    'model': str,           # Название модели
    'f_min': float,         # Минимальная частота [Гц]
    'f_max': float,         # Максимальная частота [Гц]
    'f_0': float,           # Центральная частота [Гц]
    'B_tr': float,          # Полоса -3 дБ [Гц]
    'S_TX': float,          # TX чувствительность [дБ re 1µPa/V]
    'S_RX': float,          # RX чувствительность [дБ re 1V/µPa]
    'Theta_BW': float,     # Ширина луча [градусы]
    'Q': float,             # Добротность
    'T_rd': float,          # Время затухания [мкс]
    'Z': float,             # Импеданс [Ом] (упрощенный)
    'source': str,          # Источник данных
    'version': str          # Версия
}

✅ РЕАЛИЗОВАНО: JSON структура расширена для поддержки BVD моделей. Модели можно создавать из экспериментальных данных с помощью scripts/bvd.py.

Расширенная структура для OSO:

{
  "model": "Transducer Model Name",
  "f_min": 10000,
  "f_max": 200000,
  "f_0": 100000,
  "B_tr": 190000,
  "S_TX": 148,
  "S_RX": -180,
  "Theta_BW": 10,
  "Q": 15,
  "T_rd": 20,
  "Z": 50,
  "source": "Manufacturer",
  "version": "1.0",
  
  // === НОВЫЕ ПОЛЯ ДЛЯ OSO ===
  "bvd_model_type": "EBVD",  // ✅ РЕАЛИЗОВАНО: Тип модели (BVD, MBVD, EBVD, Mason, KLM)
  "bvd_model": {              // ✅ РЕАЛИЗОВАНО: Параметры BVD модели (создаются через scripts/bvd.py)
    // Параметры зависят от типа модели
  },
  "bvd": {                    // Альтернативное название (для обратной совместимости)
    "R_s": 50.0,        // Последовательное сопротивление [Ом]
    "L_s": 0.0025,      // Последовательная индуктивность [Гн]
    "C_s": 1.35e-8,     // Последовательная емкость [Ф]
    "C_p": 2.7e-9       // Параллельная емкость [Ф]
  },
  "resonance": {
    "f_s": 30000,       // Последовательный резонанс [Гц] (вычисляется или задается)
    "f_p": 32000        // Параллельный резонанс [Гц]
  },
  // ⚠️ ВАЖНО: Рабочая полоса [f_min, f_max] должна быть ВНЕ резонансной полосы [f_s, f_p]
  // Для широкополосных сигналов: f_max < 0.8*f_s ИЛИ f_min > 1.2*f_p
  "tvr": {
    "type": "tabulated",  // или "model"
    "frequencies": [10000, 30000, 50000, 70000, 90000, 110000, 130000, 150000, 170000, 190000, 200000],
    "values": [142, 144, 146, 147, 148, 147, 146, 144, 142]  // [дБ re 1μPa/V @ 1m]
  },
  "limits": {
    "P_elec_max": 500,    // Максимальная электрическая мощность [Вт]
    "V_linear_max": 150   // Порог линейности [В]
  },
  "nonlinearity": {
    "type": "polynomial",  // или "duffing", "volterra"
    "coefficients": {
      "a1": 1.0,
      "a2": 0.0,
      "a3": 0.05,
      "a5": 0.001
    },
    "V_linear_max": 150
  }
}

Валидация параметров трансдьюсера:

При загрузке параметров трансдьюсера необходимо проверить соответствие рабочей полосы резонансным частотам:

def validate_transducer_params(params):
    """
    Проверяет параметры трансдьюсера на корректность.
    
    Args:
        params: Словарь с параметрами трансдьюсера
    
    Raises:
        ValueError: Если параметры некорректны
    """
    f_s = params.get('resonance', {}).get('f_s')
    f_p = params.get('resonance', {}).get('f_p')
    f_min = params.get('f_min')
    f_max = params.get('f_max')
    
    if f_s is None or f_p is None:
        return  # Резонансные частоты не заданы - пропускаем проверку
    
    # Проверка: рабочая полоса вне резонанса (для широкополосных сигналов)
    bandwidth = f_max - f_min
    is_wideband = bandwidth > 0.05 * f_s  # Полоса > 5% от f_s
    
    if is_wideband:
        # Для широкополосных сигналов: f_max < 0.8*f_s ИЛИ f_min > 1.2*f_p
        below_resonance = f_max < 0.8 * f_s
        above_resonance = f_min > 1.2 * f_p
        
        if not (below_resonance or above_resonance):
            raise ValueError(
                f"Рабочая полоса [{f_min}, {f_max}] Гц попадает в резонансную полосу "
                f"[{0.8*f_s:.0f}, {1.2*f_p:.0f}] Гц (f_s={f_s:.0f} Гц, f_p={f_p:.0f} Гц). "
                f"Для широкополосных сигналов (полоса {bandwidth/1000:.1f} кГц) это приведет к:\n"
                f"- Резкому изменению импеданса в полосе (20-40 дБ)\n"
                f"- Нестабильности параметров\n"
                f"- Усилению нелинейных эффектов\n"
                f"- Проблемам согласования\n\n"
                f"Используйте f_max < {0.8*f_s:.0f} Гц или f_min > {1.2*f_p:.0f} Гц."
            )

8.2 Параметры усилителя класса D

📌 Статус реализации в SonarCore:
НЕ реализовано: Модель усилителя класса D с PWM-модуляцией
Реализовано: Упрощенная модель передатчика в SignalPathCalculator (напряжение TX)

Структура данных для OSO:

Создать новый файл data/amplifiers/*.json:

{
  "model": "Class D Amplifier",
  "type": "class_D",
  "voltage": {
    "min": 24,
    "max": 100,
    "nominal": 48
  },
  "power": {
    "max": 1000
  },
  "impedance": {
    "output": 0.1
  },
  "efficiency": {
    "type": "model",
    "eta_max": 0.92,
    "R_on": 0.05,
    "losses_fixed": 5
  },
  "pwm": {
    "frequency": 2000000
  },
  "nonlinearity": {
    "THD_at_50pct": 0.01,
    "P_1dB": 900
  }
}

Python структура (для внутреннего использования):

amplifier_params = {
    'V_dd_min': float,       # Минимальное напряжение питания [В]
    'V_dd_max': float,       # Максимальное напряжение питания [В]
    'R_out': float,          # Выходной импеданс [Ом]
    'P_max': float,          # Максимальная выходная мощность [Вт]
    'f_PWM': float,          # Частота ШИМ [Гц]
    
    # КПД как функция от выходной мощности
    'efficiency': {
        'P_out': np.array,   # Выходная мощность [Вт]
        'eta': np.array      # КПД [0-1]
    },
    
    # Или модель
    'eta_model': {
        'eta_max': float,    # Максимальный КПД
        'R_on': float,       # Сопротивление открытого ключа [Ом]
        'losses_fixed': float  # Постоянные потери [Вт]
    },
    
    # Нелинейность
    'AM_AM': {              # Амплитудная характеристика
        'V_in': np.array,
        'V_out': np.array
    },
    'AM_PM': {              # Фазовая характеристика
        'V_in': np.array,
        'phase_shift': np.array  # [радианы]
    }
}
### 8.3 Параметры трансформатора

> **📌 Статус реализации в SonarCore:**  
>**НЕ реализовано:** Модель трансформатора

**Структура данных для OSO:**

Создать новый файл `data/transformers/*.json`:

```json
{
  "model": "Ferrite Core Transformer",
  "type": "ferrite_core",
  "turns_ratio": {
    "min": 5,
    "max": 30
  },
  "losses": {
    "L_leak_ratio": 0.02,
    "R_pri": 0.1,
    "R_sec_per_turn2": 0.001
  },
  "efficiency": {
    "typ": 0.90
  }
}

Python структура (для внутреннего использования):

transformer_params = {
    'n_min': float,          # Минимальный коэффициент трансформации
    'n_max': float,          # Максимальный коэффициент трансформации
    'L_leak': float,         # Индуктивность рассеяния [Гн]
    'R_pri': float,          # Сопротивление первичной обмотки [Ом]
    'R_sec': float,          # Сопротивление вторичной обмотки [Ом]
    'C_par': float,          # Паразитная емкость [Ф]
    
    # КПД по частоте
    'efficiency_vs_freq': {
        'frequencies': np.array,
        'eta': np.array
    },
    
    # Или модель потерь
    'loss_model': {
        'core_loss_coeff': float,     # Потери в сердечнике
        'copper_loss_coeff': float    # Потери в меди
    }
}
### 8.4 Параметры индуктивности

> **📌 Статус реализации в SonarCore:**  
>**НЕ реализовано:** Модель согласующей индуктивности

**Структура данных для OSO:**

Создать новый файл `data/inductors/*.json`:

```json
{
  "model": "Air Core Inductor",
  "type": "air_core",
  "inductance": {
    "min": 1.0e-5,
    "max": 1.0e-2
  },
  "quality": {
    "Q_at_100kHz": 100
  },
  "current": {
    "max": 20
  }
}

Python структура (для внутреннего использования):

inductor_params = {
    'L_min': float,          # Минимальная индуктивность [Гн]
    'L_max': float,          # Максимальная индуктивность [Гн]
    'Q_factor': float,       # Добротность или Q(f)
    'R_L': float,            # Последовательное сопротивление [Ом]
    'I_sat': float,          # Ток насыщения [А]
    'I_rated': float         # Номинальный ток [А]
}
### 8.5 Параметры подводного канала

> **📌 Статус реализации в SonarCore:**  
>**Реализовано:** `core/environment.py``EnvironmentDTO` (T, S, z, bottom_reflection)  
>**Реализовано:** `core/water_model.py` - затухание по Франсуа-Гаррисону  
>**Реализовано:** `core/channel_model.py` - применение затухания к сигналу  
>**НЕ реализовано:** Модель шума океана (Wenz), многолучевость, доплеровский сдвиг

**Структура в SonarCore:**

Используется `EnvironmentDTO` из `core/dto.py`:

```python
class EnvironmentDTO(BaseModel):
    T: float              # Температура воды [°C] ✅
    S: float              # Соленость [PSU] ✅
    z: float              # Глубина [м] ✅
    bottom_reflection: float  # Коэффициент отражения дна [дБ] ✅

Расширенная структура для OSO (требуется реализация):

Расширение EnvironmentDTO:

class EnvironmentDTO(BaseModel):
    # Существующие поля
    T: float
    S: float
    z: float
    bottom_reflection: float
    
    # === НОВЫЕ ПОЛЯ ДЛЯ OSO ===
    pH: Optional[float] = None          # pH воды (для точного расчета затухания)
    wind_speed: Optional[float] = None   # Скорость ветра [м/с] (для модели шума)
    sea_state: Optional[int] = None      # Состояние моря (0-9 по шкале Бофорта)
    geometry: str = 'spherical'          # 'spherical' или 'cylindrical'
    bottom_type: Optional[str] = None   # 'soft', 'hard', 'rock' (для многолучевости)
    v_relative_max: Optional[float] = None  # Максимальная относительная скорость [м/с]
    attenuation_model: str = 'francois-garrison'  # 'thorp' или 'francois-garrison'

Python структура для оптимизации:

channel_params = {
    # Параметры среды
    'temperature': float,    # Температура воды [°C] ✅ EnvironmentDTO.T
    'salinity': float,       # Соленость [PSU] ✅ EnvironmentDTO.S
    'depth': float,          # Глубина канала [м] ✅ EnvironmentDTO.z
    'pH': float,             # pH воды (для точного расчета затухания) ❌
    
    # Поверхностные условия
    'wind_speed': float,     # Скорость ветра [м/с] ❌
    'sea_state': int,        # Состояние моря (0-9 по шкале Бофорта) ❌
    
    # Геометрия
    'geometry': 'spherical', # или 'cylindrical' ❌
    'bottom_type': str,      # 'soft', 'hard', 'rock' (для многолучевости) ❌
    
    # Динамика
    'v_relative_max': float, # Максимальная относительная скорость [м/с] ❌
    
    # Модель затухания
    'attenuation_model': 'francois-garrison',  # ✅ Реализовано в WaterModel
    
    # Дальности для анализа
    'distances': np.array,   # [м] например [100, 500, 1000, 2000, 5000] ✅ RangeDTO
}
8.6 Требования и ограничения
pythonrequirements = {
    # Целевые параметры
    'target_distances': np.array,  # Дальности для оптимизации [м]
    'min_bitrate': float,          # Минимальный приемлемый битрейт [бит/с]
    
    # Ограничения на качество
    'PSR_min': float,              # Минимальный PSR [дБ], типично 20-30
    'ISL_max': float,              # Максимальный ISL [дБ], типично -15
    'THD_max': float,              # Максимальный THD [%], типично 10%
    'SNR_min': float,              # Минимальный SNR [дБ], типично 6-10
    
    # Энергетические ограничения
    'P_peak_max': float,           # Максимальная пиковая мощность [Вт]
    'P_avg_max': float,            # Максимальная средняя мощность [Вт]
    'energy_per_bit_max': float,   # Максимальная энергия на бит [Дж/бит]
    
    # Приоритеты
    'resolution_priority': str,    # 'high', 'medium', 'low'
    'power_efficiency_weight': float,  # Вес энергоэффективности (0-1)
    
    # Временные ограничения
    'T_min': float,                # Минимальная длительность чирпа [с]
    'T_max': float,                # Максимальная длительность чирпа [с]
    'TB_min': float,               # Минимальная база сигнала
    
    # Частотные ограничения
    'B_min': float,                # Минимальная полоса [Гц]
    'B_max': float,                # Максимальная полоса [Гц]
    
    # Согласование
    'VSWR_max': float,             # Максимальный VSWR, типично 2.0
}

9. ВЫХОДНЫЕ ДАННЫЕ

📌 Структура данных SonarCore:
Реализовано: OutputDTO из core/dto.py содержит:

  • Измеренная дальность: D_measured, sigma_D
  • SNR на выходе ADC: SNR_ADC
  • Сигналы на разных этапах: tx_signal, received_signal, signal_after_lna, signal_after_vga
  • Параметры приемника: lna_gain, vga_gain, adc_full_scale, adc_bits
  • Рекомендации оптимизации: recommendations

НЕ реализовано: Параметры оптимизации выходного каскада (V_dd, n, L, G_envelope, DPD_coeffs, PSR, ISL, битрейт)

9.1 Оптимальные параметры для каждой дальности

Расширенная структура OutputDTO для OSO:

Расширение OutputDTO в core/dto.py:

class OutputDTO(BaseModel):
    # Существующие поля
    D_measured: float
    sigma_D: float
    SNR_ADC: float
    # ... (остальные существующие поля)
    
    # === НОВЫЕ ПОЛЯ ДЛЯ OSO ===
    # Оптимальные параметры выходного каскада
    V_dd_opt: Optional[float] = None           # [В]
    n_opt: Optional[float] = None              # Коэффициент трансформации
    L_opt: Optional[float] = None             # [Гн]
    f0_opt: Optional[float] = None            # [Гц]
    f1_opt: Optional[float] = None            # [Гц]
    T_opt: Optional[float] = None            # [с]
    B_opt: Optional[float] = None            # [Гц]
    TB_product: Optional[float] = None       # [-]
    
    # Огибающая
    G_envelope: Optional[Dict] = None        # {frequencies: [], values: []}
    
    # Оконная функция
    window_type: Optional[str] = None
    window_param: Optional[float] = None
    
    # Предыскажение
    DPD_coeffs: Optional[List[float]] = None
    
    # Метрики корреляции
    PSR: Optional[float] = None              # [дБ]
    ISL: Optional[float] = None               # [дБ]
    SNR_eff: Optional[float] = None          # [дБ]
    mainlobe_width: Optional[float] = None  # [с]
    
    # Энергетика
    P_elec_peak: Optional[float] = None      # [Вт]
    P_elec_avg: Optional[float] = None       # [Вт]
    P_acoustic: Optional[float] = None      # [Вт]
    SL: Optional[float] = None               # Source Level [дБ]
    eta_total: Optional[float] = None       # Общий КПД [%]
    energy_per_bit: Optional[float] = None # [Дж/бит]
    
    # Битрейт
    R_bit: Optional[float] = None            # [бит/с]

Python структура (для внутреннего использования):

results = {
    distance_1: {
        # Оптимальные параметры
        'V_dd_opt': float,           # [В]
        'n_opt': float,              # [-]
        'L_opt': float,              # [Гн]
        'f0_opt': float,             # [Гц]
        'f1_opt': float,             # [Гц]
        'T_opt': float,              # [с]
        'B_opt': float,              # [Гц]
        'TB_product': float,         # [-]
        
        # Огибающая
        'G_envelope': {
            'frequencies': np.array,
            'values': np.array
        },
        
        # Оконная функция
        'window_type': str,
        'window_param': float,
        
        # Предыскажение (если используется)
        'DPD_coeffs': np.array,
        
        # Достигнутые показатели
        'R_bit': float,              # Битрейт [бит/с]
        'PSR': float,                # [дБ]
        'ISL': float,                # [дБ]
        'SNR_eff': float,            # [дБ]
        'mainlobe_width': float,     # [с]
        'range_resolution': float,   # [м]
        
        # Энергетика
        'P_elec_peak': float,        # [Вт]
        'P_elec_avg': float,         # [Вт]
        'P_acoustic': float,         # [Вт]
        'SL': float,                 # Source Level [дБ]
        'eta_total': float,          # Общий КПД [%]
        'energy_per_bit': float,     # [Дж/бит]
        
        # Качество сигнала
        'THD_max': float,            # Максимальный THD по полосе [%]
        'THD_spectrum': {
            'frequencies': np.array,
            'values': np.array
        },
        
        # Согласование
        'VSWR_max': float,
        'Gamma_max': float,
        'eta_matching_avg': float,   # Средний КПД согласования [%]
        
        # Временные характеристики
        'T_symbol': float,           # Длительность символа [с]
        'T_guard': float,            # Защитный интервал [с]
        'delay_spread': float,       # Разброс задержек [с]
        
        # Сигналы для визуализации
        'signals': {
            's_tx_time': np.array,   # Переданный сигнал во времени
            's_tx_freq': np.array,   # Спектр переданного сигнала
            's_rx_time': np.array,   # Принятый сигнал
            'correlation': np.array, # Корреляционная функция
            'time_axis': np.array,
            'freq_axis': np.array
        }
    },
    
    distance_2: { ... },
    ...
}
9.2 Сводные таблицы
**Таблица 1: Зависимость битрейта от дальности**

| Дальность [м] | f-f₁ [кГц] | T [мс] | База | Окно      | V_dd [В] | n   | L [мкГн] | Битрейт [кбит/с] | SNR [дБ] | PSR [дБ] | Затухание [дБ] |
|---------------|-------------|--------|------|-----------|----------|-----|----------|------------------|----------|----------|----------------|
| 50            | 175-200     | 30     | 750  | Hamming   | 48       | 1:6 | 150      | 65.8             | 30.5     | 42.8     | ~37 (200 кГц)  |
| 100           | 175-200     | 40     | 1000 | Tukey(0.2)| 48       | 1:8 | 180      | 58.2             | 28.8     | 43.2     | ~45 (200 кГц)  |
| 100           | 40-60       | 50     | 1000 | Tukey(0.2)| 48       | 1:8 | 220      | 45.2             | 28.3     | 43.5     | ~24 (60 кГц)   |
| 500           | 25-40       | 100    | 1500 | Hamming   | 60       | 1:12| 450      | 18.7             | 22.1     | 42.1     | ~32 (40 кГц)   |
| 1000          | 18-30       | 150    | 1800 | Kaiser(5) | 72       | 1:15| 680      | 10.3             | 18.5     | 45.2     | ~38 (30 кГц)   |
| 2000          | 12-22       | 250    | 2500 | Blackman  | 85       | 1:18| 980      | 4.8              | 14.2     | 52.3     | ~46 (22 кГц)   |
| 5000          | 8-14        | 400    | 2400 | Kaiser(8) | 95       | 1:22| 1500     | 1.9              | 10.8     | 54.1     | ~58 (14 кГц)   |
| 10000         | 5-9         | 600    | 2400 | Kaiser(10)| 100      | 1:25| 2000     | 0.8              | 8.5      | 55.8     | ~86 (7 кГц)    |
| 20000         | 5-9         | 800    | 3200 | Blackman  | 100      | 1:28| 2500     | 0.4              | 6.2      | 57.2     | ~99 (7 кГц)    |

> **Примечание:** Затухание рассчитано по формуле Торпа для максимальной частоты в полосе. Полное затухание = геометрическое (20·log₁₀(d)) + поглощение (α(fd). 
> 
> **Высокие частоты (175-200 кГц):**
> - Для дальности 50 м на частоте 200 кГц: TL = 36.5 дБ (геом. 34.0 дБ + поглощ. 2.6 дБ)
> - Для дальности 100 м на частоте 200 кГц: TL = 45.1 дБ (геом. 40.0 дБ + поглощ. 5.1 дБ)
> 
> **Низкие частоты (5-9 кГц, включая 7 кГц):**
> - Для дальности 10 км на частоте 7 кГц: TL = 86.4 дБ (геом. 80.0 дБ + поглощ. 6.4 дБ)
> - Для дальности 20 км на частоте 7 кГц: TL = 98.9 дБ (геом. 86.0 дБ + поглощ. 12.9 дБ)
> 
> Для дальностей >1 км требуется Source Level >200 дБ для достижения SNR >10 дБ при типичном уровне шума океана.

**Таблица 2: Энергетические характеристики**

| Дальность [м] | P_peak [Вт] | P_avg [Вт] | P_acoustic [Вт] | SL [дБ] | η_total [%] | E/bit [mJ/bit] |
|---------------|-------------|------------|------------------|---------|-------------|----------------|
| 50            | 120         | 55         | 28               | 195.5   | 24.5        | 0.84           |
| 100           | 180         | 85         | 42               | 197.2   | 23.3        | 1.88           |
| 500           | 280         | 135        | 58               | 200.6   | 21.5        | 7.22           |
| 1000          | 420         | 195        | 78               | 203.9   | 20.0        | 18.93          |
| 2000          | 650         | 285        | 102              | 207.1   | 17.9        | 59.37          |
| 5000          | 900         | 395        | 128              | 209.1   | 16.2        | 207.89         |
| 10000         | 1100        | 480        | 145              | 210.6   | 15.0        | 600.0          |
| 20000         | 1200        | 520        | 155              | 211.9   | 14.2        | 1300.0         |

**Таблица 3: Качество корреляции**

| Дальность [м] | PSR [дБ] | ISL [дБ] | Δτ_3dB [мкс] | MSER [дБ] | Разрешение [м] | Window Loss [dB] |
|---------------|----------|----------|--------------|-----------|----------------|------------------|
| 50            | 42.5     | -17.8    | 20.0         | 31.5      | 15.0           | -1.34            |
| 100           | 43.5     | -18.2    | 25.0         | 32.1      | 18.8           | -1.34            |
| 500           | 42.1     | -17.5    | 33.3         | 30.8      | 25.0           | -1.34            |
| 1000          | 45.2     | -19.8    | 41.7         | 34.5      | 31.3           | -1.80            |
| 2000          | 52.3     | -23.1    | 50.0         | 38.9      | 37.5           | -2.38            |
| 5000          | 54.1     | -24.5    | 83.3         | 40.2      | 62.5           | -3.21            |
| 10000         | 55.5     | -25.2    | 125.0        | 41.8      | 93.8           | -3.50            |
| 20000         | 57.2     | -26.1    | 166.7        | 43.2      | 125.0          | -2.38            |

### 9.3 Графические результаты

**Обязательные графики (для каждой дальности):**

1. **Частотные характеристики системы**
   - |Z_transducer(f)| - модуль импеданса трансдьюсера
   - TVR(f) - чувствительность
   - η_matching(f, L_opt) - эффективность согласования
   - H_system(f) - суммарная АЧХ системы
   - G(f) - компенсирующая огибающая

2. **Временные сигналы**
   - s_tx(t) - переданный чирп с огибающей
   - s_rx(t) - принятый сигнал
   - s_ref(t) - эталонный сигнал с окном
   - Спектрограммы передачи и приема

3. **Корреляционная функция**
   - |R(τ)| - модуль АКФ с обозначением:
     * Главный лепесток
     * Боковые лепестки
     * Уровни PSR, ISL
     * Ширина главного лепестка Δτ_3dB

4. **Спектральный анализ**
   - Спектр передаваемого сигнала
   - Спектр принятого сигнала
   - Спектр шума океана
   - SNR по частоте

5. **Нелинейные искажения**
   - THD(f) - спектр гармонических искажений
   - AM/AM характеристика с рабочей точкой
   - Спектр интермодуляционных продуктов

6. **Энергетические характеристики**
   - P(t) - мгновенная мощность
   - Распределение КПД по компонентам
   - Энергия на символ

**Сводные графики (по всем дальностям):**

1. **Битрейт vs дальность**
   - R_bit(d) для разных частотных диапазонов
   - Парето-фронт (битрейт vs энергопотребление)

2. **Оптимальные параметры vs дальность**
   - V_dd(d), n(d), L(d)
   - f₀(d), f₁(d), B(d), T(d)

3. **Качество связи vs дальность**
   - SNR(d), PSR(d), ISL(d)
   - Разрешение по дальности

4. **Энергетика vs дальность**
   - P_consumed(d), η_total(d)
   - Энергия на бит E/bit(d)

5. **Сравнение оконных функций**
   - PSR vs SNR loss для разных окон
   - Главный лепесток для разных окон
   - Битрейт для разных окон (при фиксированных параметрах)

6. **Чувствительность к параметрам**
   -R_bit/V_dd, ∂R_bit/n, ∂R_bit/L
   - Контурные графики R_bit(L, n) и т.д.

### 9.4 Файлы данных

**Формат HDF5 (рекомендуется):**
optimization_results.h5
├── metadata/
│   ├── timestamp
│   ├── version
│   ├── optimization_algorithm
│   └── computation_time
│
├── input_parameters/
│   ├── transducer_params/
│   ├── amplifier_params/
│   ├── transformer_params/
│   ├── inductor_params/
│   ├── channel_params/
│   └── requirements/
│
├── results/
│   ├── distance_100m/
│   │   ├── optimal_params/
│   │   ├── performance_metrics/
│   │   ├── signals/
│   │   └── spectra/
│   │
│   ├── distance_500m/
│   │   └── ...
│   │
│   └── ...
│
└── summary/
├── bitrate_vs_distance
├── optimal_params_vs_distance
├── energy_vs_distance
└── pareto_front

**CSV файлы для таблиц:**
- `summary_table.csv` - основная сводная таблица
- `energy_table.csv` - энергетические характеристики
- `correlation_metrics.csv` - метрики корреляции

### 9.5 Отчет (PDF или HTML)

**Структура отчета:**

1. **Executive Summary**
   - Основные результаты
   - Ключевые выводы
   - Рекомендации

2. **Входные параметры**
   - Спецификация трансдьюсера
   - Параметры электроники
   - Условия канала
   - Требования

3. **Методология**
   - Математические модели
   - Алгоритм оптимизации
   - Допущения

4. **Результаты для каждой дальности**
   - Оптимальная конфигурация
   - Достигнутые показатели
   - Графики и диаграммы

5. **Сравнительный анализ**
   - Зависимость от дальности
   - Компромиссы
   - Чувствительность к параметрам

6. **Выводы и рекомендации**
   - Оптимальные рабочие режимы
   - Ограничения системы
   - Направления улучшения

---

## 10. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

> **📌 Статус реализации в SonarCore:**  
>**Реализовано:** Базовая архитектура SonarCore  
>**Реализовано:** Модули в `core/` (transducer_model, channel_model, water_model, signal_model, dsp_model, receiver_model)  
>**Реализовано:** DTO структура (`core/dto.py`)  
>**Реализовано:** DataProvider для загрузки JSON данных  
>**НЕ реализовано:** Модули оптимизации выходного каскада (amplifier, transformer, inductor)  
>**НЕ реализовано:** Оптимизатор параметров (требуется реализация по разделу 6)

### 10.1 Архитектура системы

**Текущая архитектура SonarCore:**

SonarCore/ ├── core/ │ ├── transducer_model.py ✅ Базовая модель трансдьюсера │ ├── channel_model.py ✅ Модель канала (затухание) │ ├── water_model.py ✅ Модель воды (Франсуа-Гаррисон) │ ├── signal_model.py ✅ Генерация чирпа │ ├── dsp_model.py ✅ Согласованная фильтрация │ ├── receiver_model.py ✅ Модель приемника (LNA, VGA, ADC) │ ├── signal_path.py ✅ Расчет сигнального пути │ ├── dto.py ✅ Структуры данных │ └── simulator.py ✅ Главный симулятор │ ├── data/ │ ├── transducers/ ✅ JSON файлы трансдьюсеров │ ├── lna/ ✅ JSON файлы LNA │ ├── vga/ ✅ JSON файлы VGA │ └── adc/ ✅ JSON файлы ADC │ └── gui/ ✅ GUI интерфейс ├── main_window.py ✅ Главное окно приложения ├── sbp_window.py ✅ Окно SBP симулятора └── signal_path_widget.py ✅ Виджет сигнального пути


**Расширенная архитектура для OSO:**

SonarCore/ ├── core/ │ ├── ... (существующие модули) │ ├── amplifier_model.py ❌ НОВЫЙ: Модель усилителя класса D │ ├── transformer_model.py ❌ НОВЫЙ: Модель трансформатора │ ├── inductor_model.py ❌ НОВЫЙ: Модель согласующей индуктивности │ ├── envelope_optimizer.py ❌ НОВЫЙ: Оптимизация огибающей │ ├── output_stage_optimizer.py ❌ НОВЫЙ: Оптимизатор выходного каскада │ └── correlation_analyzer.py ❌ НОВЫЙ: Анализ корреляции (PSR, ISL) │ ├── data/ │ ├── ... (существующие) │ ├── amplifiers/ ❌ НОВЫЙ: JSON файлы усилителей │ ├── transformers/ ❌ НОВЫЙ: JSON файлы трансформаторов │ └── inductors/ ❌ НОВЫЙ: JSON файлы индуктивностей │ └── optimizer/ ❌ НОВЫЙ: Модуль оптимизации ├── init.py ├── optimization_engine.py # Главный оптимизатор ├── objective_function.py # Целевая функция (битрейт) └── constraints.py # Ограничения


**Предлагаемая структура (для справки):**

underwater_acoustic_optimizer/ │ ├── core/ │ ├── init.py │ ├── models.py # Математические модели │ ├── optimization.py # Алгоритмы оптимизации │ ├── signal_processing.py # Обработка сигналов │ └── channel.py # Модель канала │ ├── components/ │ ├── init.py │ ├── transducer.py # Модель трансдьюсера │ ├── amplifier.py # Модель усилителя │ ├── transformer.py # Модель трансформатора │ ├── matching.py # Согласующие цепи │ └── predistortion.py # DPD │ ├── analysis/ │ ├── init.py │ ├── correlation.py # Корреляционный анализ │ ├── nonlinearity.py # Анализ нелинейности │ └── metrics.py # Вычисление метрик │ ├── visualization/ │ ├── init.py │ ├── plots.py # Графики │ ├── reports.py # Генерация отчетов │ └── interactive.py # Интерактивная визуализация │ ├── utils/ │ ├── init.py │ ├── io.py # Ввод/вывод │ ├── validation.py # Валидация параметров │ └── helpers.py # Вспомогательные функции │ ├── tests/ │ ├── test_models.py │ ├── test_optimization.py │ └── test_components.py │ ├── examples/ │ ├── example_basic.py │ ├── example_advanced.py │ └── example_custom_transducer.py │ ├── data/ │ ├── transducers/ # Библиотека трансдьюсеров │ ├── amplifiers/ # Библиотека усилителей │ └── channel_profiles/ # Профили каналов │ ├── config/ │ ├── default_config.yaml │ └── optimization_config.yaml │ ├── requirements.txt ├── setup.py ├── README.md └── LICENSE

10.2 Основные классы

# core/models.py

class TransducerModel:
    """Модель акустического трансдьюсера"""
    
    def __init__(self, params: dict):
        self.R_s = params['R_s']
        self.L_s = params['L_s']
        self.C_s = params['C_s']
        self.C_p = params['C_p']
        self.TVR = params['TVR']
        self.nonlinearity = params['nonlinearity']
    
    def impedance(self, frequency: float) -> complex:
        """Вычисление импеданса на частоте"""
        pass
    
    def acoustic_pressure(self, voltage: np.ndarray, 
                         frequency: np.ndarray) -> np.ndarray:
        """Преобразование напряжения в акустическое давление"""
        pass
    
    def compute_THD(self, voltage: float, frequency: float) -> float:
        """Вычисление THD"""
        pass


class ChannelModel:
    """Модель подводного акустического канала"""
    
    def __init__(self, params: dict):
        self.temperature = params['temperature']
        self.salinity = params['salinity']
        self.depth = params['depth']
        self.wind_speed = params['wind_speed']
    
    def attenuation(self, frequency: float) -> float:
        """Затухание [дБ/км]"""
        pass
    
    def transmission_loss(self, frequency: float, 
                         distance: float) -> float:
        """Полные потери передачи [дБ]"""
        pass
    
    def noise_level(self, frequency: float) -> float:
        """Уровень шума [дБ re 1μPa²/Hz]"""
        pass
    
    def delay_spread(self, distance: float) -> float:
        """Разброс задержек [с]"""
        pass


class ChirpSignal:
    """Чирп-сигнал с компенсирующей огибающей"""
    
    def __init__(self, f0: float, f1: float, T: float, 
                 G_envelope: callable):
        self.f0 = f0
        self.f1 = f1
        self.T = T
        self.G_envelope = G_envelope
    
    def generate(self, fs: float) -> tuple:
        """Генерация сигнала"""
        pass
    
    def spectrum(self) -> tuple:
        """Спектр сигнала"""
        pass


class MatchedFilter:
    """Согласованный фильтр с оконной функцией"""
    
    def __init__(self, chirp: ChirpSignal, window_type: str, 
                 window_param: float = None):
        self.chirp = chirp
        self.window_type = window_type
        self.window_param = window_param
    
    def filter(self, signal: np.ndarray) -> np.ndarray:
        """Согласованная фильтрация"""
        pass
    
    def correlation_metrics(self, correlation: np.ndarray) -> dict:
        """Вычисление PSR, ISL, и т.д."""
        pass
# core/optimization.py

class SystemOptimizer:
    """Главный класс оптимизации"""
    
    def __init__(self, 
                 transducer: TransducerModel,
                 amplifier: AmplifierModel,
                 transformer: TransformerModel,
                 channel: ChannelModel,
                 requirements: dict):
        
        self.transducer = transducer
        self.amplifier = amplifier
        self.transformer = transformer
        self.channel = channel
        self.requirements = requirements
    
    def objective_function(self, x: np.ndarray, distance: float) -> float:
        """Целевая функция - битрейт"""
        pass
    
    def constraints(self, x: np.ndarray) -> list:
        """Ограничения задачи"""
        pass
    
    def optimize(self, distance: float, 
                 method: str = 'differential_evolution') -> dict:
        """
        Главная функция оптимизации
        
        Returns:
            dict с оптимальными параметрами и метриками
        """
        pass
    
    def optimize_multi_distance(self, 
                                distances: np.ndarray) -> dict:
        """Оптимизация для множества дальностей"""
        pass
    
    def sensitivity_analysis(self, optimal_params: dict) -> dict:
        """Анализ чувствительности"""
        pass


class EnvelopeOptimizer:
    """Оптимизация компенсирующей огибающей"""
    
    def optimize(self, V_dd, n, L, f0, f1, T, distance,
                 transducer, channel) -> callable:
        """Оптимизация G(f)"""
        pass


class InductanceOptimizer:
    """Оптимизация индуктивности по корреляции"""
    
    def optimize(self, V_dd, n, f0, f1, T, G_envelope,
                 distance, window_type) -> float:
        """Оптимизация L по PSR и SNR_eff"""
        pass


class WindowSelector:
    """Выбор оптимальной оконной функции"""
    
    def select(self, system_params, requirements) -> tuple:
        """
        Returns:
            (window_type, window_param)
        """
        pass

10.3 Основные зависимости

requirements.txt numpy>=1.21.0 scipy>=1.7.0 matplotlib>=3.4.0 pandas>=1.3.0 h5py>=3.3.0 pyyaml>=5.4.0 Оптимизация scikit-optimize>=0.9.0 pymoo>=0.5.0 pyswarm>=0.6 Обработка сигналов librosa>=0.9.0 # для спектрограмм soundfile>=0.10.0 Визуализация seaborn>=0.11.0 plotly>=5.0.0 bokeh>=2.4.0 Отчеты jinja2>=3.0.0 weasyprint>=54.0 # для PDF Параллелизация joblib>=1.0.0 dask>=2021.10.0 Тестирование pytest>=6.2.0 pytest-cov>=2.12.0 Опционально tensorflow>=2.6.0 # для нейросетевого DPD torch>=1.9.0

10.4 Пример использования

# examples/example_basic.py

from underwater_acoustic_optimizer import (
    TransducerModel, ChannelModel, SystemOptimizer,
    load_config, save_results, generate_report
)

# 1. Загрузка конфигурации
config = load_config('config/default_config.yaml')

# 2. Определение параметров трансдьюсера
transducer_params = {
    'R_s': 50,      # Ом
    'L_s': 2.5e-3,  # Гн
    'C_s': 1.35e-8, # Ф
    'C_p': 2.7e-9,  # Ф
    'TVR': {
        'frequencies': np.linspace(10e3, 50e3, 100),
        'values': 145 + 3*np.sin(np.linspace(0, 2*np.pi, 100))
    },
    'nonlinearity': {
        'type': 'polynomial',
        'coefficients': {
            'a1': 1.0,
            'a3': 0.05,
            'a5': 0.001
        }
    },
    'f_min': 10e3,
    'f_max': 50e3,
    'P_elec_max': 500,
    'V_linear_max': 150
}

# 3. Параметры канала
channel_params = {
    'temperature': 15,    # °C
    'salinity': 35,       # PSU
    'depth': 100,         # м
    'wind_speed': 5,      # м/с
    'geometry': 'spherical',
    'attenuation_model': 'thorp'
}

# 4. Требования
requirements = {
    'target_distances': np.array([100, 500, 1000, 2000, 5000]),
    'PSR_min': 25,
    'ISL_max': -15,
    'THD_max': 0.10,
    'SNR_min': 8,
    'P_peak_max': 1000,
    'P_avg_max': 500,
    'resolution_priority': 'medium'
}

# 5. Создание моделей
transducer = TransducerModel(transducer_params)
channel = ChannelModel(channel_params)

# 6. Создание оптимизатора
optimizer = SystemOptimizer(
    transducer=transducer,
    channel=channel,
    requirements=requirements
)

# 7. Запуск оптимизации
print("Starting optimization...")
results = optimizer.optimize_multi_distance(
    distances=requirements['target_distances'],
    method='differential_evolution',
    n_jobs=-1  # использовать все ядра
)

# 8. Сохранение результатов
save_results(results, 'output/optimization_results.h5')

# 9. Генерация отчета
generate_report(
    results=results,
    output_file='output/report.pdf',
    format='pdf',
    include_plots=True
)

print("Optimization complete!")
print(f"Results saved to: output/")

# 10. Вывод сводной таблицы
import pandas as pd
summary = pd.DataFrame([
    {
        'Distance [m]': d,
        'Bitrate [kbps]': results[d]['R_bit']/1000,
        'f0-f1 [kHz]': f"{results[d]['f0_opt']/1000:.0f}-{results[d]['f1_opt']/1000:.0f}",
        'T [ms]': results[d]['T_opt']*1000,
        'V_dd [V]': results[d]['V_dd_opt'],
        'PSR [dB]': results[d]['PSR'],
        'SNR [dB]': results[d]['SNR_eff']
    }
    for d in requirements['target_distances']
])
print("\n", summary.to_string(index=False))

10.5 Графический пользовательский интерфейс (GUI)

📌 Статус реализации в SonarCore:
Реализовано: Базовый GUI в gui/main_window.py для основной симуляции
Реализовано: GUI для SBP симулятора в gui/sbp_window.py
НЕ реализовано: GUI для оптимизации выходного каскада (OSO) - требуется разработка

Назначение GUI:

Графический пользовательский интерфейс обеспечивает интерактивную работу с системой оптимизации выходного каскада, позволяя пользователю:

1. Интерактивное изменение параметров:

  • Выбор компонентов:

    • Выбор трансдьюсера из библиотеки (data/transducers/)
    • Выбор усилителя класса D (data/amplifiers/)
    • Выбор трансформатора (data/transformers/)
    • Выбор согласующей индуктивности (data/inductors/)
  • Настройка параметров чирпа:

    • Начальная частота $f_0$ [Гц] (слайдер или поле ввода) - оптимизируемый параметр
    • Конечная частота $f_1$ [Гц] (слайдер или поле ввода) - оптимизируемый параметр
    • Длительность чирпа $T$ [мс] (слайдер или поле ввода) - оптимизируемый параметр
    • Выбор оконной функции (выпадающий список) - оптимизируемый параметр
    • Параметры окна ($\beta$ для Kaiser, $\alpha$ для Tukey) - оптимизируемый параметр
  • Настройка параметров выходного каскада:

    • Напряжение питания $V_{dd}$ [В] - оптимизируемый параметр
    • Коэффициент трансформации $n$ - оптимизируемый параметр
    • Согласующая индуктивность $L$ [мкГн] - оптимизируемый параметр
    • Компенсирующая огибающая $G(f)$ (табличный ввод или графический редактор)
    • Параметры предыскажения (DPD) - опционально
  • Параметры среды:

    • Температура воды $T$ [°C]
    • Соленость $S$ [PSU]
    • Глубина $z$ [м]
    • Целевая дальность связи $d$ [м]
  • Параметры оптимизации:

    • Выбор алгоритма оптимизации (Differential Evolution, PSO, NSGA-II, Bayesian)
    • Параметры алгоритма (популяция, итерации, мутация)
    • Весовые коэффициенты целевой функции
    • Ограничения (жесткие и мягкие)

2. Просмотр результатов в реальном времени:

  • Таблицы результатов:

    • Оптимальные параметры для каждой дальности
    • Достигнутые метрики (битрейт, SNR, PSR, ISL)
    • Энергетические характеристики (мощность, КПД, энергия на бит)
  • Графики и визуализация:

    • Частотные характеристики:

      • Импеданс трансдьюсера $|Z(f)|$
      • TVR характеристика
      • Эффективность согласования $\eta_{matching}(f)$
      • АЧХ системы $H_{system}(f)$
      • Компенсирующая огибающая $G(f)$
    • Временные сигналы:

      • Переданный чирп $s_{tx}(t)$ с огибающей
      • Принятый сигнал $s_{rx}(t)$
      • Эталонный сигнал $s_{ref}(t)$ с окном
      • Спектрограммы передачи и приема
    • Корреляционная функция:

      • Модуль АКФ $|R(\tau)|$ с обозначением главного и боковых лепестков
      • Метрики качества (PSR, ISL, ширина главного лепестка)
    • Энергетические характеристики:

      • Мгновенная мощность $P(t)$
      • Распределение КПД по компонентам
      • Энергия на бит $E/bit$
    • Зависимости от дальности:

      • Битрейт $R_{bit}(d)$
      • SNR $(d)$, PSR $(d)$, ISL $(d)$
      • Оптимальные параметры $V_{dd}(d)$, $n(d)$, $L(d)$
      • Энергопотребление и КПД
    • Сравнительный анализ:

      • Парето-фронт (битрейт vs энергопотребление)
      • Сравнение разных оконных функций
      • Чувствительность к параметрам

3. Управление оптимизацией:

  • Запуск оптимизации с визуальным индикатором прогресса
  • Остановка и возобновление оптимизации
  • Сохранение промежуточных результатов
  • Сравнение результатов для разных конфигураций
  • Экспорт результатов в различные форматы (JSON, HDF5, CSV, PNG)

4. Валидация и предупреждения:

  • Проверка входных параметров на соответствие ограничениям
  • Предупреждения о нарушении физических ограничений
  • Визуальная индикация допустимых диапазонов параметров
  • Проверка резонансных частот трансдьюсера

Технические требования к GUI:

  • Платформа: Desktop приложение (PyQt5/PyQt6 или Tkinter)
  • Реализация: Многопоточность для выполнения оптимизации без блокировки UI
  • Производительность: Обновление графиков в реальном времени
  • Удобство: Интуитивный интерфейс с группировкой параметров по категориям

11. ВАЛИДАЦИЯ И ТЕСТИРОВАНИЕ

11.1 Юнит-тесты

# tests/test_models.py

def test_transducer_impedance():
    """Тест расчета импеданса трансдьюсера"""
    pass

def test_transducer_resonance():
    """Проверка резонансных частот"""
    pass

def test_channel_attenuation():
    """Тест модели затухания"""
    pass

def test_chirp_generation():
    """Тест генерации чирпа"""
    pass

def test_correlation_metrics():
    """Тест вычисления PSR, ISL"""
    pass

11.2 Интеграционные тесты

# tests/test_optimization.py

def test_optimization_convergence():
    """Проверка сходимости оптимизации"""
    pass

def test_constraint_satisfaction():
    """Проверка выполнения ограничений"""
    pass

def test_multi_distance_consistency():
    """Согласованность результатов для разных дальностей"""
    pass

11.3 Валидация по аналитическим решениям

Тест 1: Идеальный случай (без нелинейности, без затухания)

  • Ожидаемый PSR для прямоугольного окна: ~13 дБ
  • Ширина главного лепестка: 1/B

Тест 2: Согласование на резонансной частоте

  • При L = L_opt, |Γ| должно быть минимальным
  • Проверка формулы для резонанса

Тест 3: Предел Шеннона

  • Битрейт не должен превышать C = B·log₂(1+SNR)

11.4 Бенчмарки

def benchmark_optimization_speed():
    """
    Измерение времени оптимизации
    Цель: < 10 минут для одной дальности
    """
    pass

def benchmark_accuracy():
    """
    Сравнение с известными решениями
    """
    pass

12. РАСШИРЕНИЯ И ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ

12.1 Опциональные функции

1. Адаптивная модуляция

  • Изменение параметров чирпа в зависимости от условий канала
  • Real-time оптимизация

2. MIMO конфигурация

  • Оптимизация для нескольких трансдьюсеров
  • Пространственное мультиплексирование

3. Кодирование канала

  • Учет помехоустойчивого кодирования
  • Turbo codes, LDPC

4. Машинное обучение

  • Нейросетевое DPD
  • Предсказание параметров канала
  • RL-based оптимизация

5. Интерактивный GUI

📌 Статус реализации в SonarCore:
Реализовано: Базовый GUI интерфейс в gui/main_window.py
Реализовано: GUI для SBP симулятора в gui/sbp_window.py
НЕ реализовано: GUI для оптимизации выходного каскада (OSO)

Назначение GUI:

GUI обеспечивает интерактивный интерфейс для:

  • Настройки параметров системы:

    • Выбор трансдьюсера, усилителя, трансформатора из библиотеки компонентов
    • Ввод параметров чирпа (f₀, f₁, T, окно)
    • Настройка параметров выходного каскада (V_dd, n, L)
    • Задание параметров среды (температура, соленость, глубина)
    • Установка целевой дальности связи
  • Интерактивного изменения параметров:

    • Реальное время изменение параметров с немедленным пересчетом результатов
    • Слайдеры и поля ввода для всех оптимизируемых параметров
    • Валидация входных данных с предупреждениями о нарушении ограничений
    • Сохранение и загрузка конфигураций
  • Просмотра результатов:

    • Визуализация оптимальных параметров (V_dd, n, L) для разных дальностей
    • Графики битрейта, SNR, PSR в зависимости от дальности
    • Частотные характеристики системы (импеданс, TVR, АЧХ)
    • Временные сигналы (переданный, принятый, эталонный)
    • Корреляционная функция с метриками качества
    • Энергетические характеристики (мощность, КПД, энергия на бит)
    • Таблицы результатов оптимизации
  • Управления оптимизацией:

    • Запуск оптимизации с выбором алгоритма и параметров
    • Мониторинг прогресса оптимизации в реальном времени
    • Сравнение результатов для разных конфигураций
    • Экспорт результатов в различные форматы (JSON, HDF5, CSV)

12.2 Интеграция с измерительным оборудованием

class MeasurementInterface:
    """Интерфейс для работы с реальным оборудованием"""
    
    def measure_transducer_impedance(self) -> dict:
        """Измерение импеданса трансдьюсера"""
        pass
    
    def calibrate_system(self) -> dict:
        """Калибровка системы"""
        pass
    
    def validate_optimization(self, optimal_params) -> dict:
        """Валидация на реальном оборудовании"""
        pass

13. ДОКУМЕНТАЦИЯ

13.1 Пользовательская документация

Руководство пользователя (User Guide):

  • Быстрый старт
  • Описание параметров
  • Примеры использования
  • FAQ
  • Troubleshooting

API Reference:

  • Описание всех классов и функций
  • Параметры и возвращаемые значения
  • Примеры кода

13.2 Техническая документация

Математическое описание:

  • Все модели с выводом формул
  • Алгоритмы оптимизации
  • Численные методы

Архитектура системы:

  • UML диаграммы
  • Диаграммы потоков данных
  • Описание модулей

14. КРИТЕРИИ ПРИЕМКИ

14.1 Функциональные требования

✓ Система корректно моделирует все компоненты тракта ✓ Оптимизация сходится к решению за разумное время ✓ Все ограничения выполняются ✓ Результаты физически осмысленны

14.2 Требования к производительности

✓ Оптимизация для одной дальности: < 10 минут ✓ Полный анализ (5 дальностей): < 1 часа ✓ Генерация отчета: < 2 минут

14.3 Требования к точности

✓ Точность вычисления импеданса: < 1% ✓ Точность вычисления корреляции: < 0.1 дБ в PSR ✓ Точность вычисления битрейта: < 5%

14.4 Требования к качеству кода

✓ Покрытие тестами: > 80% ✓ Документация всех публичных функций ✓ Соответствие PEP 8 (для Python) ✓ Отсутствие критических предупреждений линтера


15. КОНТРОЛЬНЫЕ ПРИМЕРЫ

15.1 Пример 1: Ближняя связь (100 м)

Ожидаемые результаты:

  • Оптимальная частота: 40-60 кГц
  • Битрейт: > 40 кбит/с
  • PSR: > 40 дБ
  • Энергопотребление: < 100 Вт средняя

15.2 Пример 2: Дальняя связь (5 км)

Ожидаемые результаты:

  • Оптимальная частота: 8-14 кГц
  • Битрейт: 1-3 кбит/с
  • PSR: > 50 дБ (нужно подавление боковых)
  • Энергопотребление: < 500 Вт средняя

Проверка затухания:

  • Затухание на частоте 14 кГц: ~58 дБ (геометрическое 14 дБ + поглощение 44 дБ)
  • Требуемый Source Level: >200 дБ re 1μPa @ 1m
  • Акустическая мощность: >100 Вт (при КПД трансдьюсера ~30%)
  • Вывод: Дальность 5 км достижима, но требует высокой мощности и оптимального согласования

15.3 Пример 3: Чувствительность к параметрам

Тест:

  • Изменение L на ±20% от оптимума
  • Ожидаемое изменение битрейта: < 10%
  • Ожидаемое изменение PSR: < 3 дБ

16. ГЛОССАРИЙ

АКФ - Автокорреляционная функция
АЧХ - Амплитудно-частотная характеристика
БПФ - Быстрое преобразование Фурье
ДПФ - Дискретное преобразование Фурье
ЛЧМ - Линейная частотная модуляция (чирп)
ФЧХ - Фазо-частотная характеристика
BVD - Butterworth-Van Dyke (модель трансдьюсера)
DAC - Digital-to-Analog Converter
DPD - Digital Predistortion
ISL - Integrated Sidelobe Level
MSER - Mainlobe-to-Sidelobe Energy Ratio
PAPR - Peak-to-Average Power Ratio
PSR - Peak-to-Sidelobe Ratio
PWM - Pulse Width Modulation (ШИМ)
SNR - Signal-to-Noise Ratio
THD - Total Harmonic Distortion
TVR - Transmitting Voltage Response
VSWR - Voltage Standing Wave Ratio


17. ССЫЛКИ И ЛИТЕРАТУРАWeiter11:5417.1 Теоретические основы

Подводная акустика:

Urick, R.J. "Principles of Underwater Sound", 3rd Edition, McGraw-Hill, 1983 Lurton, X. "An Introduction to Underwater Acoustics: Principles and Applications", Springer, 2010 Medwin, H., Clay, C.S. "Fundamentals of Acoustical Oceanography", Academic Press, 1998

Модели затухания: 4. Thorp, W.H. "Analytic Description of the Low-Frequency Attenuation Coefficient", JASA, 1967 5. Francois, R.E., Garrison, G.R. "Sound Absorption Based on Ocean Measurements", JASA, 1982 Модели шума океана: 6. Wenz, G.M. "Acoustic Ambient Noise in the Ocean", JASA, 1962 Распространение в мелкой воде: 7. Jensen, F.B. et al. "Computational Ocean Acoustics", Springer, 2011 17.2 Обработка сигналов Чирп-сигналы и согласованная фильтрация: 8. Cook, C.E., Bernfeld, M. "Radar Signals: An Introduction to Theory and Application", Academic Press, 1967 9. Richards, M.A. "Fundamentals of Radar Signal Processing", McGraw-Hill, 2005 Оконные функции: 10. Harris, F.J. "On the Use of Windows for Harmonic Analysis with the Discrete Fourier Transform", IEEE Proc., 1978 11. Oppenheim, A.V., Schafer, R.W. "Discrete-Time Signal Processing", Pearson, 2009 Корреляционная обработка: 12. Turin, G.L. "An Introduction to Matched Filters", IRE Trans. Information Theory, 1960 17.3 Подводная связь Системы связи: 13. Stojanovic, M., Preisig, J. "Underwater Acoustic Communication Channels", IEEE Communications Magazine, 2009 14. Kilfoyle, D.B., Baggeroer, A.B. "The State of the Art in Underwater Acoustic Telemetry", IEEE OCEANS, 2000 15. Singer, A.C. et al. "Signal Processing for Underwater Acoustic Communications", IEEE Communications Magazine, 2009 Модуляция: 16. Chitre, M. et al. "Recent Advances in Underwater Acoustic Communications", MTS/IEEE OCEANS, 2008 Эквализация и многолучевость: 17. Stojanovic, M. "On the Relationship Between Capacity and Distance in an Underwater Acoustic Communication Channel", MobiCom, 2006 17.4 Нелинейные системы и предыскажение Нелинейность усилителей: 18. Raich, R., Zhou, G.T. "Orthogonal Polynomials for Power Amplifier Modeling and Predistorter Design", IEEE Trans. Vehicular Technology, 2004 19. Ding, L. et al. "A Robust Digital Baseband Predistorter Constructed Using Memory Polynomials", IEEE Trans. Communications, 2004 Модель Вольтерра: 20. Schetzen, M. "The Volterra and Wiener Theories of Nonlinear Systems", Wiley, 1980 Нелинейность пьезоэлектрических преобразователей: 21. Hall, D.A. "Review Nonlinearity in Piezoelectric Ceramics", J. Materials Science, 2001 22. Aurelle, N. et al. "Nonlinear Behavior of an Ultrasonic Transducer", Ultrasonics, 1996 17.5 Согласование импедансов Теория согласования: 23. Pozar, D.M. "Microwave Engineering", 4th Edition, Wiley, 2011 24. Carlin, H.J., Civalleri, P.P. "Wideband Circuit Design", CRC Press, 1998 Согласование в акустике: 25. Kinsler, L.E. et al. "Fundamentals of Acoustics", Wiley, 1999 17.6 Оптимизация Методы многопараметрической оптимизации: 26. Nocedal, J., Wright, S.J. "Numerical Optimization", 2nd Edition, Springer, 2006 27. Boyd, S., Vandenberghe, L. "Convex Optimization", Cambridge University Press, 2004 Эволюционные алгоритмы: 28. Deb, K. "Multi-Objective Optimization using Evolutionary Algorithms", Wiley, 2001 29. Storn, R., Price, K. "Differential Evolution – A Simple and Efficient Heuristic", J. Global Optimization, 1997 Байесовская оптимизация: 30. Brochu, E. et al. "A Tutorial on Bayesian Optimization", arXiv:1012.2599, 2010 17.7 Стандарты и спецификации JANUS стандарт подводной связи: 31. NATO STANAG 4748 "JANUS Underwater Communications" Пьезокерамика: 32. IEEE Standard on Piezoelectricity, ANSI/IEEE Std 176-1987 Акустические измерения: 33. IEC 60565 "Underwater Acoustics - Hydrophones - Calibration" 17.8 Программные библиотеки и инструменты Python библиотеки: 34. SciPy Documentation: https://docs.scipy.org/ 35. NumPy Documentation: https://numpy.org/doc/ 36. PyMOO: Multi-objective Optimization in Python: https://pymoo.org/ Специализированные инструменты: 37. BELLHOP Acoustic Propagation Model: https://oalib.hlsresearch.com/ Специализированное ПО: 40. ARLUT (ARL Underwater Toolbox): https://github.com/org-arl/arlut 41. Acoustics Toolbox (AT): https://oalib.hlsresearch.com/AcousticsToolbox/

  1. ПРИЛОЖЕНИЯ ПРИЛОЖЕНИЕ A. Формулы и вычисления A.1 Полная модель импеданса трансдьюсера Эквивалентная схема BVD: Z_transducer(ω) = 1 / (jωC_p + 1/(R_s + jωL_s + 1/(jωC_s)))

После преобразований: Z(ω) = (R_s + jωL_s + 1/(jωC_s)) / (1 + jωC_p(R_s + jωL_s + 1/(jωC_s))) Резонансные частоты: Последовательный резонанс (минимум |Z|): f_s = 1/(2π√(L_s·C_s))

Параллельный резонанс (максимум |Z|): f_p = f_s · √(1 + C_s/C_p)

Эффективный коэффициент связи: k_eff = √(1 - (f_s/f_p)²) Добротность: $$Q_s = \frac{\omega L_s}{R_s} = \frac{1}{\omega R_s \cdot C_s} \quad \text{на частоте } f_s$$

A.2 Проверка затухания для заявленных дальностей

Расчет затухания по формуле Торпа для типовых конфигураций:

Формула затухания: $$\alpha(f) = \frac{0.11 \cdot f^2}{1 + f^2} + \frac{44 \cdot f^2}{4100 + f^2} + 2.75 \times 10^{-4} \cdot f^2 + 0.003 \quad \text{[дБ/км]}$$

Полное затухание передачи: $$\text{TL}(f, d) = 20 \cdot \log_{10}(d) + \alpha(f) \cdot d \quad \text{[дБ]}$$

Результаты проверки:

Дальность Частота α(f) [дБ/км] Геом. [дБ] Поглощ. [дБ] Полное TL [дБ] Реалистичность
50 м 200 кГц 51.0 34.0 2.6 36.6 ✓ Реалистично
100 м 200 кГц 51.0 40.0 5.1 45.1 ✓ Реалистично
200 м 200 кГц 51.0 46.0 10.2 56.2 ⚠ Требует высокой мощности
50 м 150 кГц 43.5 34.0 2.2 36.2 ✓ Реалистично
100 м 150 кГц 43.5 40.0 4.4 44.4 ✓ Реалистично
200 м 150 кГц 43.5 46.0 8.7 54.7 ⚠ Требует высокой мощности
50 м 100 кГц 34.1 34.0 1.7 35.7 ✓ Реалистично
100 м 100 кГц 34.1 40.0 3.4 43.4 ✓ Реалистично
200 м 100 кГц 34.1 46.0 6.8 52.8 ⚠ Требует высокой мощности
500 м 60 кГц 21.7 54.0 10.8 64.8 ⚠ Требует высокой мощности
1 км 60 кГц 21.7 60.0 21.7 81.7 ⚠ Требует SL>200 дБ
2 км 60 кГц 21.7 66.0 43.3 109.3 ⚠ Требует SL>200 дБ (макс.)
500 м 40 кГц 12.9 54.0 6.5 60.5 ⚠ Требует высокой мощности
1 км 40 кГц 12.9 60.0 12.9 72.9 ⚠ Требует SL>200 дБ
2 км 40 кГц 12.9 66.0 25.8 91.8 ⚠ Требует SL>200 дБ
3 км 40 кГц 12.9 69.5 38.7 108.2 ⚠ Требует SL>200 дБ (макс.)
1 км 30 кГц 8.3 60.0 8.3 68.3 ⚠ Требует высокой мощности
2 км 30 кГц 8.3 66.0 16.6 82.6 ⚠ Требует SL>200 дБ
5 км 30 кГц 8.3 74.0 41.4 115.4 ⚠ Требует SL>200 дБ (макс.)
2 км 22 кГц 4.9 66.0 9.8 75.8 ⚠ Требует SL>200 дБ
5 км 22 кГц 4.9 74.0 24.5 98.4 ⚠ Требует SL>200 дБ
8 км 22 кГц 4.9 78.1 39.1 117.2 ⚠ Требует SL>200 дБ (макс.)
2 км 14 кГц 2.2 66.0 4.4 70.4 ⚠ Требует SL>200 дБ
5 км 14 кГц 2.2 74.0 10.9 84.9 ⚠ Требует SL>200 дБ
10 км 14 кГц 2.2 80.0 21.7 101.7 ⚠ Требует SL>200 дБ
16 км 14 кГц 2.2 84.1 34.7 118.8 ⚠ Требует SL>200 дБ (макс.)
5 км 7 кГц 0.64 74.0 3.2 77.2 ⚠ Требует SL>200 дБ
10 км 7 кГц 0.64 80.0 6.4 86.4 ⚠ Требует SL>200 дБ
15 км 7 кГц 0.64 83.5 9.7 93.2 ⚠ Требует SL>200 дБ
20 км 7 кГц 0.64 86.0 12.9 98.9 ⚠ Требует SL>200 дБ
30 км 7 кГц 0.64 89.5 19.2 108.7 ⚠ Требует SL>200 дБ
42 км 7 кГц 0.64 92.5 26.9 119.4 ⚠ Требует SL>200 дБ (макс.)

Выводы:

Максимальные дальности для разных частот (при TL < 120 дБ):

  • 200 кГц: ~1 км (α = 51.0 дБ/км) - только ближняя связь
  • 150 кГц: ~1 км (α = 43.5 дБ/км) - только ближняя связь
  • 100 кГц: ~1 км (α = 34.1 дБ/км) - ближняя связь
  • 60 кГц: ~2 км (α = 21.7 дБ/км) - средняя дальность
  • 40 кГц: ~3 км (α = 12.9 дБ/км) - средняя дальность
  • 30 кГц: ~5 км (α = 8.3 дБ/км) - дальняя связь
  • 22 кГц: ~8 км (α = 4.9 дБ/км) - дальняя связь
  • 14 кГц: ~16 км (α = 2.2 дБ/км) - очень дальняя связь
  • 7 кГц: ~42 км (α = 0.64 дБ/км) - максимальная дальность

Рекомендации по выбору частоты:

  • Ближняя связь (50-200 м): Высокие частоты (100-200 кГц) обеспечивают высокую пропускную способность
  • Средние дальности (500 м - 2 км): Средние частоты (30-60 кГц) оптимальны
  • Большие дальности (2-10 км): Низкие частоты (14-22 кГц) обеспечивают приемлемое затухание
  • Очень большие дальности (10-42 км): Очень низкие частоты (7-14 кГц) с минимальным затуханием

Требования к мощности:

  • Дальности до 1 км: требуют SL >190 дБ
  • Дальности 2-5 км: требуют SL >200 дБ
  • Дальности >10 км: требуют SL >200 дБ и оптимального согласования
  • На частотах >100 кГц затухание резко возрастает (34-51 дБ/км), ограничивая дальность
  • На частоте 7 кГц затухание минимально (0.64 дБ/км), позволяя достигать дальностей до 42 км

A.3 Затухание в морской воде (модель Франсуа-Гаррисона)

Полная формула: α(f,T,S,D,pH) = A₁·P₁·f₁·f²/(f₁² + f²) + A₂·P₂·f₂·f²/(f₂² + f²) + A₃·P₃·f²

где: f - частота [кГц] T - температура [°C] S - соленость [PSU] D - глубина [м] pH - кислотность

f₁ - релаксационная частота борной кислоты f₂ - релаксационная частота сульфата магния

f₁ = 0.78·√(S/35)·exp(T/26)

f₂ = 42·exp(T/17)

A₁ = 0.106·exp((pH-8)/0.56)

A₂ = 0.52·(1 + T/43)·(S/35)·exp(-D/6)

A₃ = 0.00049·exp(-(T/27 + D/17))

P₁, P₂, P₃ - поправки на давление (глубину) Упрощенная модель Торпа (для T=4°C, S=35 PSU): α(f) = 0.11·f²/(1+f²) + 44·f²/(4100+f²) + 2.75·10⁻⁴·f² + 0.003 [дБ/км]

где f в кГц A.4 Модель шума океана (Wenz) Компоненты шума:

  1. Турбулентность (< 10 Гц): N_turb = 17 - 30·log₁₀(f) [дБ]

  2. Судоходство (20-200 Гц): N_ship = 40 + 20·(s-0.5) + 26·log₁₀(f) - 60·log₁₀(f+0.03) [дБ] где s - уровень судоходства (0-1)

  3. Волнение (100 Гц - 100 кГц): N_wave = 50 + 7.5·w^0.5 + 20·log₁₀(f) - 40·log₁₀(f+0.4) [дБ] где w - скорость ветра [м/с]

  4. Тепловой шум (> 100 кГц): N_thermal = -15 + 20·log₁₀(f) [дБ]

Суммарный шум: N_total(f) = 10·log₁₀(Σᵢ 10^(Nᵢ/10)) [дБ re 1μPa²/Hz] A.5 Выигрыш обработки чирпа Для идеального согласованного фильтра: G_proc = T·B [безразмерный]

В децибелах: G_proc [дБ] = 10·log₁₀(T·B)

Примеры: T = 0.1 с, B = 10 кГц → G = 30 дБ T = 0.5 с, B = 20 кГц → G = 40 дБ T = 1.0 с, B = 10 кГц → G = 40 дБ С учетом оконной функции: G_proc_window = 10·log₁₀(T·B) - L_window

где L_window - потери от окна: Rectangular: 0.0 дБ Hamming: -1.34 дБ Hann: -1.76 дБ Blackman: -2.38 дБ Kaiser(β=5): -2.0 дБ A.6 Пропускная способность Шеннона Для AWGN канала: C = B·log₂(1 + SNR) [бит/с]

С учетом разрыва до емкости (implementation gap): C_practical = B·log₂(1 + SNR/Γ)

где Γ ≈ 3 дБ (≈ 2 линейно) для хорошего кодирования Для частотно-селективного канала: C = ∫ log₂(1 + SNR(f)) df [бит/с] B

где SNR(f) - SNR на частоте f A.7 Метрики корреляции Peak-to-Sidelobe Ratio (PSR): PSR = 20·log₁₀(|R_peak| / max{|R(τ)|, τ ∉ mainlobe}) [дБ]

Требования:

  • Базовые системы: PSR > 15 дБ
  • Хорошие системы: PSR > 25 дБ
  • Отличные системы: PSR > 40 дБ Integrated Sidelobe Level (ISL): ISL = 10·log₁₀(E_sidelobes / |R_peak|²) [дБ]

где E_sidelobes = ∫|R(τ)|² dτ sidelobes

Требования:

  • ISL < -10 дБ (приемлемо)
  • ISL < -15 дБ (хорошо)
  • ISL < -20 дБ (отлично) Ширина главного лепестка: Δτ_3dB ≈ k/B

где k - коэффициент расширения от окна:

  • Rectangular: k = 0.89
  • Hamming: k = 1.30
  • Blackman: k = 1.68

Разрешение по дальности: Δr = c·Δτ_3dB/2 [м] A.8 Потери от нелинейности Упрощенная модель: SNR_out = SNR_in - L_NL

где L_NL = 10·log₁₀(1 + THD²) [дБ]

С учетом DPD: L_NL_DPD = (1 - η_DPD)·L_NL

где η_DPD - эффективность предыскажения (0.5-0.9) Интермодуляционные искажения (IMD): Для двух тонов f₁ и f₂: IMD3 = 3·(P_in - P_1dB) [дБ]

где P_1dB - точка компрессии 1 дБ ПРИЛОЖЕНИЕ B. Типовые параметры оборудования B.1 Пьезокерамические трансдьюсеры Тип 1: Низкочастотный (5-20 кГц) f_s = 12 кГц f_p = 12.8 кГц R_s = 80 Ом L_s = 15 мГн C_s = 11.7 нФ C_p = 12 нФ TVR = 145 дБ @ 12 кГц P_max = 1000 Вт Размер: 200 мм диаметр Тип 2: Среднечастотный (20-100 кГц) f_s = 30 кГц f_p = 32 кГц R_s = 50 Ом L_s = 2.5 мГн C_s = 11.3 нФ C_p = 2.7 нФ TVR = 148 дБ @ 30 кГц P_max = 500 Вт Размер: 80 мм диаметр Тип 3: Высокочастотный (50-200 кГц) f_s = 100 кГц f_p = 105 кГц R_s = 30 Ом L_s = 0.5 мГн C_s = 5.1 нФ C_p = 1.2 нФ TVR = 140 дБ @ 100 кГц P_max = 100 Вт Размер: 30 мм диаметр B.2 Усилители класса D Тип 1: Низкая мощность (< 200 Вт) V_dd: 12-48 В P_max: 200 Вт R_out: 0.1 Ом η_max: 90% f_PWM: 200 кГц THD: < 0.5% @ 50% мощности Тип 2: Средняя мощность (200-1000 Вт) V_dd: 24-100 В P_max: 1000 Вт R_out: 0.05 Ом η_max: 92% f_PWM: 100 кГц THD: < 1% @ 50% мощности Тип 3: Высокая мощность (> 1000 Вт) V_dd: 48-200 В P_max: 5000 Вт R_out: 0.02 Ом η_max: 93% f_PWM: 50 кГц THD: < 2% @ 50% мощности B.3 Трансформаторы Ферритовые сердечники (10-100 кГц): n: 1:5 до 1:30 L_leak/L_pri: 0.01-0.05 η: 85-95% Максимальная мощность: 100 Вт - 5 кВт Ламинированные сердечники (< 20 кГц): n: 1:5 до 1:50 L_leak/L_pri: 0.02-0.10 η: 90-97% Максимальная мощность: 500 Вт - 50 кВт B.4 Индуктивности Воздушные катушки: L: 10 мкГн - 1 мГн Q @ 100 кГц: 50-200 I_max: 1-50 А Ферритовые дроссели: L: 100 мкГн - 10 мГн Q @ 100 кГц: 30-100 I_max: 0.5-20 А ПРИЛОЖЕНИЕ C. Примеры конфигурационных файлов C.1 Файл конфигурации (YAML) yaml# config/example_config.yaml

project: name: "Underwater Acoustic Link Optimization" version: "1.0" author: "Research Team" date: "2026-01-05"

transducer: type: "piezoelectric" model: "custom"

BVD параметры

electrical: R_s: 50.0 # Ом L_s: 0.0025 # Гн (2.5 мГн) C_s: 1.35e-8 # Ф (13.5 нФ) C_p: 2.7e-9 # Ф (2.7 нФ)

Резонансы (вычисляются или задаются)

resonance: f_s: 30000 # Гц f_p: 32000 # Гц Q_s: 15

TVR характеристика

tvr: type: "tabulated" # или "model" frequencies: [10000, 30000, 50000, 70000, 90000, 110000, 130000, 150000, 170000, 190000, 200000] values: [142, 144, 146, 147, 148, 147, 146, 144, 142] # дБ re 1μPa/V @ 1m

Нелинейность

nonlinearity: type: "polynomial" coefficients: a1: 1.0 a2: 0.0 a3: 0.05 a5: 0.001 V_linear_max: 150 # В

Ограничения

limits: f_min: 10000 # Гц f_max: 200000 # Гц P_elec_max: 500 # Вт V_max: 200 # В

amplifier: type: "class_D"

voltage: min: 24 # В max: 100 # В nominal: 48 # В

power: max: 1000 # Вт

impedance: output: 0.1 # Ом

efficiency: type: "model" eta_max: 0.92 R_on: 0.05 # Ом losses_fixed: 5 # Вт

pwm: frequency: 2000000 # Гц (должна быть ≥ 10·f_max сигнала, для полосы до 200 кГц минимум 2 МГц, рекомендуется 2.5-3 МГц)

nonlinearity: THD_at_50pct: 0.01 # 1% P_1dB: 900 # Вт

transformer: type: "ferrite_core"

turns_ratio: min: 5 max: 30

losses: L_leak_ratio: 0.02 # L_leak/L_pri R_pri: 0.1 # Ом R_sec_per_turn2: 0.001 # Ом

efficiency: typ: 0.90

inductor: type: "air_core"

inductance: min: 1.0e-5 # Гн (10 мкГн) max: 1.0e-2 # Гн (10 мГн)

quality: Q_at_100kHz: 100

current: max: 20 # А

channel: environment: temperature: 15 # °C salinity: 35 # PSU depth: 100 # м pH: 8.1

surface: wind_speed: 5 # м/с sea_state: 3 # Beaufort scale

geometry: type: "spherical" # или "cylindrical" bottom_type: "soft"

attenuation: model: "thorp" # или "francois-garrison"

dynamics: v_relative_max: 2.0 # м/с (для Doppler)

optimization:

Дальности для анализа

distances: [100, 500, 1000, 2000, 5000] # м

Алгоритм

algorithm: method: "differential_evolution" options: maxiter: 1000 popsize: 50 mutation: [0.5, 1.5] recombination: 0.7 workers: -1 # все ядра seed: 42 polish: true

Альтернативные алгоритмы

algorithms_available: - "differential_evolution" - "particle_swarm" - "genetic_algorithm" - "bayesian_optimization"

Начальные приближения

initial_guess: V_dd: 48 n: 12 L: 500.0e-6 f0: 20000 f1: 40000 T: 0.1

requirements:

Минимальные требования

quality: PSR_min: 25 # дБ ISL_max: -15 # дБ THD_max: 0.10 # 10% SNR_min: 8 # дБ

Энергетика

power: P_peak_max: 1000 # Вт P_avg_max: 500 # Вт energy_per_bit_max: 1.0 # Дж/бит

Согласование

matching: VSWR_max: 2.0

Временные параметры

timing: T_min: 0.001 # с (1 мс) T_max: 2.0 # с TB_min: 50 # минимальная база

Частотные параметры

frequency: B_min: 5000 # Гц (5 кГц) B_max: 40000 # Гц (40 кГц)

Приоритеты

priorities: resolution: "medium" # "low", "medium", "high" power_efficiency_weight: 0.3 # 0-1 bitrate_weight: 0.7

processing:

Дискретизация

sampling: fs_multiplier: 10 # fs = 10 * f_max min_samples: 1000

Окна на приеме

windows: candidates: - type: "hamming" - type: "kaiser" param: 5 - type: "tukey" param: 0.2 - type: "blackman" - type: "taylor" param: nbar: 4 sll: -35

Предыскажение

predistortion: enabled: true type: "memory_polynomial" order: 5 memory_depth: 3

output:

Форматы

formats: - "hdf5" - "csv"

Графики

plots: dpi: 300 format: "png" style: "seaborn"

Отчет

report: format: "pdf" # "pdf" или "html" include_plots: true include_data_tables: true language: "en" # "en" или "ru"

Путь сохранения

directory: "output/"

Детализация

verbosity: 2 # 0-3 C.2 Пример скрипта запуска python# run_optimization.py

#!/usr/bin/env python3

import yaml import argparse from pathlib import Path import logging

from underwater_acoustic_optimizer import ( SystemOptimizer, TransducerModel, AmplifierModel, TransformerModel, ChannelModel, load_config, save_results, generate_report )

def setup_logging(verbosity): levels = [logging.WARNING, logging.INFO, logging.DEBUG] level = levels[min(verbosity, len(levels)-1)]

logging.basicConfig(
    level=level,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('optimization.log'),
        logging.StreamHandler()
    ]
)

def main(): parser = argparse.ArgumentParser( description='Underwater Acoustic Communication System Optimizer' ) parser.add_argument( '-c', '--config', type=str, default='config/default_config.yaml', help='Path to configuration file' ) parser.add_argument( '-o', '--output', type=str, default='output/', help='Output directory' ) parser.add_argument( '-v', '--verbosity', type=int, default=1, choices=[0, 1, 2, 3], help='Verbosity level' ) parser.add_argument( '--skip-optimization', action='store_true', help='Skip optimization, only generate report from existing results' )

args = parser.parse_args()

# Setup logging
setup_logging(args.verbosity)
logger = logging.getLogger(__name__)

# Load configuration
logger.info(f"Loading configuration from {args.config}")
config = load_config(args.config)

# Create output directory
output_dir = Path(args.output)
output_dir.mkdir(parents=True, exist_ok=True)

if not args.skip_optimization:
    # Create models
    logger.info("Creating system models...")
    transducer = TransducerModel(config['transducer'])
    amplifier = AmplifierModel(config['amplifier'])
    transformer = TransformerModel(config['transformer'])
    channel = ChannelModel(config['channel'])
    
    # Create optimizer
    logger.info("Initializing optimizer...")
    optimizer = SystemOptimizer(
        transducer=transducer,
        amplifier=amplifier,
        transformer=transformer,
        channel=channel,
        requirements=config['requirements'],
        optimization_config=config['optimization']
    )
    
    # Run optimization
    logger.info("Starting optimization...")
    logger.info(f"Target distances: {config['optimization']['distances']} m")
    
    results = optimizer.optimize_multi_distance(
        distances=config['optimization']['distances']
    )
    
    # Save results
    logger.info(f"Saving results to {output_dir}")
    save_results(
        results,
        output_dir / 'optimization_results.h5',
        config
    )
    
    # Save summary tables
    results.to_csv(output_dir / 'summary_table.csv')
else:
    # Load existing results
    logger.info(f"Loading existing results from {output_dir}")
    results = load_results(output_dir / 'optimization_results.h5')

# Generate report
logger.info("Generating report...")
generate_report(
    results=results,
    config=config,
    output_file=output_dir / 'optimization_report.pdf',
    format=config['output']['report']['format']
)

logger.info("Optimization complete!")
logger.info(f"Results saved to: {output_dir}")

# Print summary
print("\n" + "="*70)
print("OPTIMIZATION SUMMARY")
print("="*70)

for distance in config['optimization']['distances']:
    r = results[distance]
    print(f"\nDistance: {distance} m")
    print(f"  Bitrate:        {r['R_bit']/Weiter11:571000:.2f} kbps")

print(f" Frequency: {r['f0_opt']/1000:.1f} - {r['f1_opt']/1000:.1f} kHz") print(f" Chirp duration: {r['T_opt']*1000:.1f} ms") print(f" Bandwidth: {r['B_opt']/1000:.1f} kHz") print(f" Time-Bandwidth: {r['TB_product']:.0f}") print(f" Voltage: {r['V_dd_opt']:.1f} V") print(f" Transform ratio: 1:{r['n_opt']:.1f}") print(f" Inductance: {r['L_opt']*1e6:.1f} μH") print(f" PSR: {r['PSR']:.1f} dB") print(f" SNR: {r['SNR_eff']:.1f} dB") print(f" Power (avg): {r['P_elec_avg']:.1f} W") print(f" Efficiency: {r['eta_total']*100:.1f} %") print(f" Window: {r['window_type']}") print("\n" + "="*70) if name == 'main': main()

ПРИЛОЖЕНИЕ D. Контрольные списки

D.1 Контрольный список входных данных

Перед запуском оптимизации проверьте:

  • Параметры трансдьюсера заданы корректно:

    • BVD параметры (R_s, L_s, C_s, C_p) - РЕАЛИЗОВАНО
      • Создание моделей из Conductance/Susceptance: scripts/bvd.py
      • Поддержка BVD, MBVD, EBVD, Mason, KLM
      • Автоматическая оптимизация параметров
    • TVR характеристика
    • Резонансные частоты соответствуют расчетным
    • Модель нелинейности задана
    • Ограничения по мощности и напряжению
  • Параметры усилителя:

    • Диапазон напряжений питания
    • Максимальная мощность
    • КПД или модель потерь
    • Параметры нелинейности
  • Параметры трансформатора:

    • Диапазон коэффициентов трансформации
    • Параметры рассеяния и потерь
  • Параметры индуктивности:

    • Допустимый диапазон значений
    • Добротность
    • Максимальный ток
  • Параметры канала:

    • Температура, соленость, глубина
    • Скорость ветра (для шума)
    • Модель затухания выбрана
  • Требования:

    • Целевые дальности заданы
    • Минимальные требования к качеству
    • Ограничения по энергопотреблению
  • Настройки оптимизации:

    • Алгоритм выбран
    • Параметры алгоритма заданы
    • Количество итераций достаточно

D.2 Контрольный список проверки результатов

После завершения оптимизации проверьте:

  • Сходимость оптимизации:

    • Алгоритм завершился успешно
    • Достигнута требуемая точность
    • Нет предупреждений о численных проблемах
  • Выполнение ограничений:

    • Все жесткие ограничения выполнены
    • PSR ≥ PSR_min
    • ISL ≤ ISL_max
    • THD ≤ THD_max
    • SNR ≥ SNR_min
    • Мощность в допустимых пределах
  • Физическая осмысленность:

    • Битрейт уменьшается с ростом дальности
    • Оптимальная частота снижается для больших дальностей
    • Длительность чирпа растет с дальностью
    • Напряжение питания растет с дальностью
    • КПД в разумных пределах (10-30%)
  • Качество корреляции:

    • Главный лепесток четко выражен
    • Боковые лепестки подавлены
    • PSR соответствует выбранному окну
    • Ширина главного лепестка ≈ 1/B
  • Энергетика:

    • Source Level реалистичен (180-215 дБ)
    • Энергия на бит не слишком велика
    • КПД компонентов в ожидаемых диапазонах
  • Согласование:

    • VSWR < 2 (или заданное)
    • Эффективность передачи мощности > 70%
  • Графики и визуализация:

    • Все графики сгенерированы
    • Нет артефактов или разрывов
    • Масштабы осей адекватны
  • Файлы результатов:

    • HDF5 файл создан и читается
    • CSV таблицы корректны
    • PDF отчет сгенерирован

D.3 Контрольный список отладки

Если оптимизация не сходится или дает плохие результаты:

  • Проверьте начальное приближение:

    • Находится ли оно в допустимой области?
    • Не слишком ли далеко от оптимума?
  • Проверьте границы переменных:

    • Не слишком ли узкие диапазоны?
    • Содержит ли допустимая область решение?
  • Проверьте ограничения:

    • Не противоречат ли ограничения друг другу?
    • Не слишком ли жесткие?
    • Корректно ли вычисляются?
  • Проверьте целевую функцию:

    • Вычисляется ли без ошибок?
    • Нет ли разрывов или особенностей?
    • Монотонна ли по ожидаемым направлениям?
  • Увеличьте ресурсы оптимизации:

    • Больше итераций (maxiter)
    • Больший размер популяции (popsize)
    • Другой алгоритм
  • Упростите задачу:

    • Зафиксируйте часть параметров
    • Ослабьте ограничения
    • Уменьшите размерность
  • Проверьте численную устойчивость:

    • Нет ли переполнений/потери точности?
    • Масштабированы ли переменные?

ПРИЛОЖЕНИЕ E. Часто задаваемые вопросы (FAQ)

Q1: Почему оптимальная индуктивность не соответствует резонансу на центральной частоте?

A: Индуктивность оптимизируется по качеству корреляционного пика (PSR, SNR_eff), а не по импедансному согласованию на одной частоте. Оптимум зависит от:

  • Формы импеданса трансдьюсера по всей полосе
  • Компенсирующей огибающей G(f)
  • Частотной зависимости затухания в канале
  • Выбранной оконной функции на приеме

Q2: Какую оконную функцию выбрать?

A: Зависит от требований:

  • Высокий SNR (>15 дБ) + многолучевость: Blackman или Kaiser(β=6-8) для максимального подавления боковых лепестков
  • Средний SNR (10-15 дБ): Hamming - лучший компромисс
  • Низкий SNR (<10 дБ): Tukey(α=0.1-0.2) - минимальные потери SNR
  • Максимальное разрешение: Tukey(α=0.05) или Rectangular

Q3: Почему битрейт не растет пропорционально полосе?

A: Битрейт зависит не только от полосы B, но и от:

  • SNR, который падает на высоких частотах из-за затухания
  • Эффективности согласования η(f)
  • Нелинейных искажений THD(f)
  • Длительности символа T + T_guard Оптимальная полоса - это компромисс между этими факторами.

Q4: Как влияет нелинейность трансдьюсера на битрейт?

A: Нелинейность приводит к:

  • Генерации гармоник (потеря энергии из полезной полосы)
  • Интермодуляционным искажениям
  • Ухудшению корреляции (снижение PSR)
  • Эффективным потерям SNR: L_NL ≈ 10·log₁₀(1+THD²)

При THD=10% потери ≈ 0.4 дБ, при THD=30% потери ≈ 2.5 дБ.

Q5: Зачем нужна компенсирующая огибающая G(f)?

A: Без компенсации:

  • На частотах с высоким импедансом → малая мощность
  • На частотах с большим затуханием → малый SNR
  • Результат: неравномерный SNR по полосе, снижение битрейта

С компенсацией:

  • Выравнивается SNR по всей полосе
  • Битрейт увеличивается на 20-40%
  • Но! Увеличивается нелинейность на некоторых частотах - требуется компромисс

Q6: Почему длительность чирпа растет с дальностью?

A: С ростом дальности:

  • SNR падает → нужен больший выигрыш обработки G=T·B
  • Разброс задержек τ_spread растет → T должно быть >>τ_spread
  • Доплеровский сдвиг становится критичным → T ограничено сверху

Оптимальная T - баланс между выигрышем обработки и символьной скоростью.

Q7: Можно ли использовать более одного трансдьюсера?

A: Да, система может быть расширена для MIMO (Multiple Input Multiple Output):

  • Увеличение мощности (несколько передатчиков)
  • Пространственное мультиплексирование
  • Разнесенный прием для борьбы с замираниями

Требуется модификация модели и целевой функции.

Q8: Как учесть движение приемника/передатчика?

A: Доплеровский сдвиг уже учтен через ограничение: T ≤ 1/(2·Δf_doppler) = c/(2·f_c·v_rel)

Для компенсации доплера на приеме можно:

  • Использовать банк согласованных фильтров с разными смещениями частоты
  • Применить алгоритмы оценки и компенсации доплера
  • Это выходит за рамки текущего ТЗ, но может быть добавлено

Q9: Что делать, если оптимизация не находит решения?

A: Проверьте:

  1. Противоречивость ограничений (может не существовать решения)
  2. Слишком жесткие требования (PSR_min, SNR_min)
  3. Недостаточная мощность системы для заданной дальности
  4. Ослабьте требования или уменьшите дальность

Q10: Как валидировать результаты?

A: Несколько способов:

  1. Предельные случаи:
    • d→0: битрейт должен → максимуму
    • THD→0: битрейт должен расти
  2. Сравнение с литературой: типичные значения для подводной связи
  3. Экспериментальная валидация: измерения в бассейне/море
  4. Кросс-валидация: сравнение с другими симуляторами (BELLHOP, etc.)

ПРИЛОЖЕНИЕ F. Примеры типовых конфигураций

F.1 Ближняя связь высокоскоростная (100 м, >40 кбит/с)

# config/near_field_high_speed.yaml

transducer:
  type: "high_frequency"
  electrical:
    R_s: 30
    L_s: 0.0005
    C_s: 5.1e-9
    C_p: 1.2e-9
  resonance:
    f_s: 100000
    f_p: 105000

channel:
  environment:
    temperature: 20
    salinity: 35
    depth: 50
  surface:
    wind_speed: 3

optimization:
  distances: [50, 100, 200]
  initial_guess:
    f0: 80000
    f1: 120000
    T: 0.05

requirements:
  quality:
    PSR_min: 20
    SNR_min: 12
  frequency:
    B_min: 20000

F.2 Средняя дальность универсальная (1 км, ~10 кбит/с)

# config/medium_range.yaml

transducer:
  type: "medium_frequency"
  electrical:
    R_s: 50
    L_s: 0.0025
    C_s: 1.35e-8
    C_p: 2.7e-9
  resonance:
    f_s: 30000
    f_p: 32000

channel:
  environment:
    temperature: 15
    salinity: 35
    depth: 100
  surface:
    wind_speed: 5

optimization:
  distances: [500, 1000, 1500]
  initial_guess:
    f0: 20000
    f1: 40000
    T: 0.15

requirements:
  quality:
    PSR_min: 25
    SNR_min: 10
  priorities:
    resolution: "medium"

F.3 Дальняя связь энергоэффективная (5 км, ~2 кбит/с)

# config/long_range_efficient.yaml

transducer:
  type: "low_frequency"
  electrical:
    R_s: 80
    L_s: 0.015
    C_s: 1.17e-8
    C_p: 1.2e-8
  resonance:
    f_s: 12000
    f_p: 12800

amplifier:
  voltage:
    min: 48
    max: 200

channel:
  environment:
    temperature: 10
    salinity: 35
    depth: 200
  surface:
    wind_speed: 7

optimization:
  distances: [2000, 5000, 8000]
  initial_guess:
    f0: 8000
    f1: 16000
    T: 0.5

requirements:
  quality:
    PSR_min: 30
    SNR_min: 8
  power:
    P_avg_max: 400
  priorities:
    power_efficiency_weight: 0.5
    bitrate_weight: 0.5

processing:
  windows:
    candidates:
      - type: "blackman"
      - type: "kaiser"
        param: 8

ПРИЛОЖЕНИЕ G. Глоссарий математических обозначений

Латинские буквы:

Символ Описание Единицы
A(t) Амплитудная огибающая [-]
B Полоса частот [Гц]
C Пропускная способность [бит/с]
c Скорость звука в воде [м/с]
d Дальность [м]
f Частота [Гц]
f₀, f₁ Начальная/конечная частота чирпа [Гц]
f_s, f_p Последовательный/параллельный резонанс [Гц]
G(f) Компенсирующая огибающая [-]
H(f) Передаточная функция [-]
I Ток [А]
L Индуктивность [Гн]
n Коэффициент трансформации [-]
P Мощность [Вт]
Q Добротность [-]
R Сопротивление / Корреляция [Ом] / [-]
R_bit Битрейт [бит/с]
SNR Отношение сигнал/шум [дБ]
SL Source Level [дБ re 1μPa @ 1m]
T Длительность [с]
TL Transmission Loss [дБ]
TVR Transmitting Voltage Response [дБ re 1μPa/V @ 1m]
V Напряжение [В]
w(t) Оконная функция [-]
Z Импеданс [Ом]

Греческие буквы:

Символ Описание Единицы
α Затухание [дБ/км]
β Параметр окна Kaiser [-]
Γ Коэффициент отражения [-]
η КПД [-] или [%]
θ Фаза [рад]
λ Длина волны [м]
τ Задержка [с]
φ Фаза [рад]
ω Угловая частота [рад/с]

Индексы:

Индекс Описание
s series (последовательный)
p parallel (параллельный)
tx transmit (передача)
rx receive (прием)
ref reference (опорный)
opt optimal (оптимальный)
min, max minimum, maximum
eff effective (эффективный)
avg average (средний)

19. ЗАКЛЮЧЕНИЕ

19.1 Основные результаты ТЗ

Настоящее техническое задание определяет полную спецификацию системы оптимизации выходного каскада подводной акустической связи с чирп-модуляцией.

Ключевые особенности системы:

  1. Комплексная многопараметрическая оптимизация

    • 8-20 оптимизируемых параметров
    • Учет нелинейности всех компонентов
    • Оптимизация по критерию максимального битрейта
  2. Физически корректные модели

    • Точная модель трансдьюсера (BVD + нелинейность)
    • Модель подводного канала (затухание, шум, многолучевость)
    • Частотно-зависимое согласование
  3. Инновационные подходы

    • Оптимизация индуктивности по корреляции (не по резонансу!)
    • Компенсирующая огибающая для выравнивания SNR по полосе
    • Адаптивный выбор оконной функции
  4. Практическая применимость

    • Учет реальных ограничений оборудования
    • Валидация результатов
    • Интеграция с измерительными системами

19.2 Ожидаемые характеристики

Для типовых конфигураций:

Дальность Битрейт f_min [кГц] f_max [кГц] Полоса [кГц] Энергия/бит Затухание [дБ] Проверка
50 м 50-80 кбит/с 175 200 25 0.5-1 мДж/бит ~37 (200 кГц) ✓ Реалистично (ближняя связь)
100 м 40-70 кбит/с 175 200 25 1-2 мДж/бит ~45 (200 кГц) ✓ Реалистично (ближняя связь)
100 м 30-50 кбит/с 40 60 20 1-3 мДж/бит ~42 (60 кГц) ✓ Реалистично
500 м 15-25 кбит/с 25 40 15 5-10 мДж/бит ~60 (40 кГц) ⚠ Требует высокой мощности
1 км 8-15 кбит/с 18 30 12 15-30 мДж/бит ~68 (30 кГц) ⚠ Требует высокой мощности
2 км 3-8 кбит/с 12 22 10 40-80 мДж/бит ~76 (22 кГц) ⚠ Требует SL>200 дБ
5 км 1-3 кбит/с 8 14 6 150-300 мДж/бит ~85 (14 кГц) ⚠ Требует SL>200 дБ
10 км 0.5-2 кбит/с 5 9 4 300-600 мДж/бит ~86 (7 кГц) ⚠ Требует SL>200 дБ
20 км 0.2-1 кбит/с 5 9 4 600-1500 мДж/бит ~99 (7 кГц) ⚠ Требует SL>200 дБ

Проверка затухания: Затухание рассчитано по формуле Торпа для максимальной частоты в полосе. Полное затухание = геометрическое (20·log₁₀(d)) + поглощение (α(f)·d).

Высокие частоты (175-200 кГц):

  • Для дальности 50 м на частоте 200 кГц: TL = 36.5 дБ (геом. 34.0 дБ + поглощ. 2.6 дБ)
  • Для дальности 100 м на частоте 200 кГц: TL = 45.1 дБ (геом. 40.0 дБ + поглощ. 5.1 дБ)

Средние частоты (18-60 кГц):

  • Для дальности 100 м на частоте 60 кГц: TL = 42.2 дБ (геом. 40.0 дБ + поглощ. 2.2 дБ)
  • Для дальности 500 м на частоте 40 кГц: TL = 60.4 дБ (геом. 54.0 дБ + поглощ. 6.5 дБ)
  • Для дальности 1 км на частоте 30 кГц: TL = 68.3 дБ (геом. 60.0 дБ + поглощ. 8.3 дБ)
  • Для дальности 2 км на частоте 22 кГц: TL = 75.8 дБ (геом. 66.0 дБ + поглощ. 9.8 дБ)

Низкие частоты (5-14 кГц):

  • Для дальности 5 км на частоте 14 кГц: TL = 84.9 дБ (геом. 74.0 дБ + поглощ. 10.9 дБ)
  • Для дальности 10 км на частоте 7 кГц: TL = 86.4 дБ (геом. 80.0 дБ + поглощ. 6.4 дБ)
  • Для дальности 20 км на частоте 7 кГц: TL = 98.9 дБ (геом. 86.0 дБ + поглощ. 12.9 дБ)

Выводы:

  • Высокие частоты (175-200 кГц) пригодны только для малых дальностей (50-100 м) из-за сильного затухания (51 дБ/км)
  • Низкие частоты (5-9 кГц) позволяют достигать больших дальностей (10-20 км) благодаря минимальному затуханию (0.64 дБ/км)
  • Для дальностей >1 км требуется Source Level >200 дБ для достижения SNR >10 дБ при типичном уровне шума океана

Улучшение по сравнению с неоптимизированной системой:

  • Битрейт: +30-50%
  • Энергоэффективность: +20-40%
  • Надежность связи (PSR): +10-15 дБ

19.3 Области применения

Гражданские:

  • Мониторинг океана (сети датчиков)
  • Подводная робототехника
  • АУВ (автономные подводные аппараты)
  • Offshore инфраструктура
  • Научные исследования

Военные/специальные:

  • Подводная навигация
  • Связь с подводными аппаратами
  • Минная разведка
  • Скрытая связь

19.4 Дальнейшее развитие

Возможные расширения:

  1. Адаптивные системы

    • Real-time оценка канала
    • Динамическая перенастройка параметров
    • Адаптивная модуляция
  2. MIMO конфигурации

    • Множественные трансдьюсеры
    • Пространственное мультиплексирование
    • Формирование луча
  3. Машинное обучение

    • Нейросетевое DPD
    • Предсказание канала
    • Reinforcement Learning для оптимизации
  4. Расширенные модуляции

    • Комбинация чирп + OFDM
    • Spread spectrum
    • Coded модуляции

19.5 Критерии успеха проекта

Проект считается успешным, если:

✓ Система корректно моделирует все компоненты
✓ Оптимизация дает физически осмысленные результаты
✓ Битрейт на 30% выше базовой конфигурации
✓ Все ограничения выполняются
✓ Время оптимизации приемлемо (<1 час для 5 дальностей)
✓ Результаты валидированы (аналитически или экспериментально)
✓ Документация полная и понятная
✓ Код покрыт тестами (>80%)