Система оптимизации выходного каскада подводной акустической коммуникации
Условные обозначения статуса реализации:
- ✅ Реализовано - модель/функция уже есть в 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 |
Реализовано |
| - Оптимизация выходного каскада | ❌ | - | Требуется реализация |
| - Многопараметрическая оптимизация | ❌ | - | Требуется реализация |
Программно-математический комплекс для симуляции и многопараметрической оптимизации выходного каскада системы подводной акустической связи с чирп-модуляцией.
Необходимость максимизации скорости передачи данных (битрейта) в подводном акустическом канале при заданных ограничениях на дальность связи, энергопотребление и качество сигнала.
Система предназначена для:
- Моделирования полного электро-акустического тракта передачи
- Оптимизации параметров выходного каскада
- Расчета максимально достижимого битрейта для заданной дальности
- Анализа качества корреляционного отклика
- Синтеза компенсирующих огибающих и предыскажений
- Интерактивного изменения параметров и просмотра результатов через графический пользовательский интерфейс (GUI)
[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₁]
}
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} Гц."
)📌 Статус реализации в 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
}📌 Структура данных 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, битрейт)
Расширенная структура 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)) + поглощение (α(f)·d).
>
> **Высокие частоты (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
# 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)
"""
passrequirements.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
# 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))📌 Статус реализации в 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
- Производительность: Обновление графиков в реальном времени
- Удобство: Интуитивный интерфейс с группировкой параметров по категориям
# 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# tests/test_optimization.py
def test_optimization_convergence():
"""Проверка сходимости оптимизации"""
pass
def test_constraint_satisfaction():
"""Проверка выполнения ограничений"""
pass
def test_multi_distance_consistency():
"""Согласованность результатов для разных дальностей"""
passТест 1: Идеальный случай (без нелинейности, без затухания)
- Ожидаемый PSR для прямоугольного окна: ~13 дБ
- Ширина главного лепестка: 1/B
Тест 2: Согласование на резонансной частоте
- При L = L_opt, |Γ| должно быть минимальным
- Проверка формулы для резонанса
Тест 3: Предел Шеннона
- Битрейт не должен превышать C = B·log₂(1+SNR)
def benchmark_optimization_speed():
"""
Измерение времени оптимизации
Цель: < 10 минут для одной дальности
"""
pass
def benchmark_accuracy():
"""
Сравнение с известными решениями
"""
pass1. Адаптивная модуляция
- Изменение параметров чирпа в зависимости от условий канала
- 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)
class MeasurementInterface:
"""Интерфейс для работы с реальным оборудованием"""
def measure_transducer_impedance(self) -> dict:
"""Измерение импеданса трансдьюсера"""
pass
def calibrate_system(self) -> dict:
"""Калибровка системы"""
pass
def validate_optimization(self, optimal_params) -> dict:
"""Валидация на реальном оборудовании"""
passРуководство пользователя (User Guide):
- Быстрый старт
- Описание параметров
- Примеры использования
- FAQ
- Troubleshooting
API Reference:
- Описание всех классов и функций
- Параметры и возвращаемые значения
- Примеры кода
Математическое описание:
- Все модели с выводом формул
- Алгоритмы оптимизации
- Численные методы
Архитектура системы:
- UML диаграммы
- Диаграммы потоков данных
- Описание модулей
✓ Система корректно моделирует все компоненты тракта ✓ Оптимизация сходится к решению за разумное время ✓ Все ограничения выполняются ✓ Результаты физически осмысленны
✓ Оптимизация для одной дальности: < 10 минут ✓ Полный анализ (5 дальностей): < 1 часа ✓ Генерация отчета: < 2 минут
✓ Точность вычисления импеданса: < 1% ✓ Точность вычисления корреляции: < 0.1 дБ в PSR ✓ Точность вычисления битрейта: < 5%
✓ Покрытие тестами: > 80% ✓ Документация всех публичных функций ✓ Соответствие PEP 8 (для Python) ✓ Отсутствие критических предупреждений линтера
Ожидаемые результаты:
- Оптимальная частота: 40-60 кГц
- Битрейт: > 40 кбит/с
- PSR: > 40 дБ
- Энергопотребление: < 100 Вт средняя
Ожидаемые результаты:
- Оптимальная частота: 8-14 кГц
- Битрейт: 1-3 кбит/с
- PSR: > 50 дБ (нужно подавление боковых)
- Энергопотребление: < 500 Вт средняя
Проверка затухания:
- Затухание на частоте 14 кГц: ~58 дБ (геометрическое 14 дБ + поглощение 44 дБ)
- Требуемый Source Level: >200 дБ re 1μPa @ 1m
- Акустическая мощность: >100 Вт (при КПД трансдьюсера ~30%)
- Вывод: Дальность 5 км достижима, но требует высокой мощности и оптимального согласования
Тест:
- Изменение L на ±20% от оптимума
- Ожидаемое изменение битрейта: < 10%
- Ожидаемое изменение PSR: < 3 дБ
АКФ - Автокорреляционная функция
АЧХ - Амплитудно-частотная характеристика
БПФ - Быстрое преобразование Фурье
ДПФ - Дискретное преобразование Фурье
ЛЧМ - Линейная частотная модуляция (чирп)
ФЧХ - Фазо-частотная характеристика
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
Подводная акустика:
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/
- ПРИЛОЖЕНИЯ ПРИЛОЖЕНИЕ 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)²)
Добротность:
Расчет затухания по формуле Торпа для типовых конфигураций:
Формула затухания:
Полное затухание передачи:
Результаты проверки:
| Дальность | Частота | α(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 км
Полная формула: α(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) Компоненты шума:
-
Турбулентность (< 10 Гц): N_turb = 17 - 30·log₁₀(f) [дБ]
-
Судоходство (20-200 Гц): N_ship = 40 + 20·(s-0.5) + 26·log₁₀(f) - 60·log₁₀(f+0.03) [дБ] где s - уровень судоходства (0-1)
-
Волнение (100 Гц - 100 кГц): N_wave = 50 + 7.5·w^0.5 + 20·log₁₀(f) - 40·log₁₀(f+0.4) [дБ] где w - скорость ветра [м/с]
-
Тепловой шум (> 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"
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: 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()
Перед запуском оптимизации проверьте:
-
✅ Параметры трансдьюсера заданы корректно:
- ✅ BVD параметры (R_s, L_s, C_s, C_p) - РЕАЛИЗОВАНО
- Создание моделей из Conductance/Susceptance:
scripts/bvd.py - Поддержка BVD, MBVD, EBVD, Mason, KLM
- Автоматическая оптимизация параметров
- Создание моделей из Conductance/Susceptance:
- TVR характеристика
- Резонансные частоты соответствуют расчетным
- Модель нелинейности задана
- Ограничения по мощности и напряжению
- ✅ BVD параметры (R_s, L_s, C_s, C_p) - РЕАЛИЗОВАНО
-
Параметры усилителя:
- Диапазон напряжений питания
- Максимальная мощность
- КПД или модель потерь
- Параметры нелинейности
-
Параметры трансформатора:
- Диапазон коэффициентов трансформации
- Параметры рассеяния и потерь
-
Параметры индуктивности:
- Допустимый диапазон значений
- Добротность
- Максимальный ток
-
Параметры канала:
- Температура, соленость, глубина
- Скорость ветра (для шума)
- Модель затухания выбрана
-
Требования:
- Целевые дальности заданы
- Минимальные требования к качеству
- Ограничения по энергопотреблению
-
Настройки оптимизации:
- Алгоритм выбран
- Параметры алгоритма заданы
- Количество итераций достаточно
После завершения оптимизации проверьте:
-
Сходимость оптимизации:
- Алгоритм завершился успешно
- Достигнута требуемая точность
- Нет предупреждений о численных проблемах
-
Выполнение ограничений:
- Все жесткие ограничения выполнены
- 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 отчет сгенерирован
Если оптимизация не сходится или дает плохие результаты:
-
Проверьте начальное приближение:
- Находится ли оно в допустимой области?
- Не слишком ли далеко от оптимума?
-
Проверьте границы переменных:
- Не слишком ли узкие диапазоны?
- Содержит ли допустимая область решение?
-
Проверьте ограничения:
- Не противоречат ли ограничения друг другу?
- Не слишком ли жесткие?
- Корректно ли вычисляются?
-
Проверьте целевую функцию:
- Вычисляется ли без ошибок?
- Нет ли разрывов или особенностей?
- Монотонна ли по ожидаемым направлениям?
-
Увеличьте ресурсы оптимизации:
- Больше итераций (maxiter)
- Больший размер популяции (popsize)
- Другой алгоритм
-
Упростите задачу:
- Зафиксируйте часть параметров
- Ослабьте ограничения
- Уменьшите размерность
-
Проверьте численную устойчивость:
- Нет ли переполнений/потери точности?
- Масштабированы ли переменные?
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: Проверьте:
- Противоречивость ограничений (может не существовать решения)
- Слишком жесткие требования (PSR_min, SNR_min)
- Недостаточная мощность системы для заданной дальности
- Ослабьте требования или уменьшите дальность
Q10: Как валидировать результаты?
A: Несколько способов:
- Предельные случаи:
- d→0: битрейт должен → максимуму
- THD→0: битрейт должен расти
- Сравнение с литературой: типичные значения для подводной связи
- Экспериментальная валидация: измерения в бассейне/море
- Кросс-валидация: сравнение с другими симуляторами (BELLHOP, etc.)
# 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# 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"# 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Латинские буквы:
| Символ | Описание | Единицы |
|---|---|---|
| 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 (средний) |
Настоящее техническое задание определяет полную спецификацию системы оптимизации выходного каскада подводной акустической связи с чирп-модуляцией.
Ключевые особенности системы:
-
Комплексная многопараметрическая оптимизация
- 8-20 оптимизируемых параметров
- Учет нелинейности всех компонентов
- Оптимизация по критерию максимального битрейта
-
Физически корректные модели
- Точная модель трансдьюсера (BVD + нелинейность)
- Модель подводного канала (затухание, шум, многолучевость)
- Частотно-зависимое согласование
-
Инновационные подходы
- Оптимизация индуктивности по корреляции (не по резонансу!)
- Компенсирующая огибающая для выравнивания SNR по полосе
- Адаптивный выбор оконной функции
-
Практическая применимость
- Учет реальных ограничений оборудования
- Валидация результатов
- Интеграция с измерительными системами
Для типовых конфигураций:
| Дальность | Битрейт | 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 дБ
Гражданские:
- Мониторинг океана (сети датчиков)
- Подводная робототехника
- АУВ (автономные подводные аппараты)
- Offshore инфраструктура
- Научные исследования
Военные/специальные:
- Подводная навигация
- Связь с подводными аппаратами
- Минная разведка
- Скрытая связь
Возможные расширения:
-
Адаптивные системы
- Real-time оценка канала
- Динамическая перенастройка параметров
- Адаптивная модуляция
-
MIMO конфигурации
- Множественные трансдьюсеры
- Пространственное мультиплексирование
- Формирование луча
-
Машинное обучение
- Нейросетевое DPD
- Предсказание канала
- Reinforcement Learning для оптимизации
-
Расширенные модуляции
- Комбинация чирп + OFDM
- Spread spectrum
- Coded модуляции
Проект считается успешным, если:
✓ Система корректно моделирует все компоненты
✓ Оптимизация дает физически осмысленные результаты
✓ Битрейт на 30% выше базовой конфигурации
✓ Все ограничения выполняются
✓ Время оптимизации приемлемо (<1 час для 5 дальностей)
✓ Результаты валидированы (аналитически или экспериментально)
✓ Документация полная и понятная
✓ Код покрыт тестами (>80%)