HCG и LCG: Физика и Математика управления сенсором
Современные CMOS-матрицы (Sony Starvis, Pregius, OmniVision) достигли предела чувствительности не только за счет улучшения оптики, но и благодаря архитектуре Dual Conversion Gain (DCG). Эта технология позволяет динамически изменять физические свойства пикселя в зависимости от условий освещения.
1. Физическая концепция: Узел Floating Diffusion
В основе каждого пикселя лежит узел плавающего диффузора (FD), выполняющий роль конденсатора. Его задача — конвертировать накопленные фотоэлектроны в электрический потенциал. Ключевая проблема классических сенсоров — фиксированная емкость этого узла.
- V — Результирующее напряжение (сигнал)
- Q — Заряд (количество пойманных фотонов)
- C — Емкость конверсионного узла
2. Два режима работы
| Характеристика | LCG Low Conversion Gain | HCG High Conversion Gain |
|---|---|---|
| Емкость (C) | Высокая (добавлен конденсатор) | Низкая (минимум паразитной емкости) |
| Динамический диапазон | Максимальный (>12-14 стопов) | Снижен (быстрое насыщение) |
| Шум считывания (RN) | Средний/Высокий | Ультра-низкий (около 1.0e-) |
| Чувствительность | Низкая (для яркого света) | Экстремальная (для темноты) |
3. Математика шума и точка перегиба
Режим HCG не просто "усиливает" картинку. Он уменьшает шум считывания (Read Noise) путем увеличения коэффициента преобразования (Conversion Gain, выражаемого в мкВ/электрон). Это критично в условиях Photon Starvation (дефицита фотонов).
На графиках зависимости SNR (Signal-to-Noise Ratio) от усиления (Gain) точка включения HCG выглядит как резкий скачок качества вверх. Для популярных сенсоров типа IMX290 этот порог обычно находится в диапазоне +18dB ... +22dB.
4. Программный контроль через регистры I2C
Управление режимом осуществляется через запись в регистры управления логикой сенсора. Для серии Starvis это обычно регистр 0x3009 . Использование групповой записи HOLD обязательно для предотвращения строчных артефактов.
#define GAIN_REG_ADDR 0x3014
#define MODE_REG_ADDR 0x3009
void update_sensor_state(int target_gain) {
write_reg(0x3001, 0x01); // Group Hold START
if (target_gain > HCG_THRESHOLD) {
write_reg(MODE_REG_ADDR, 0x10); // Активация HCG (Bit 4)
} else {
write_reg(MODE_REG_ADDR, 0x00); // Возврат в LCG
}
write_reg(GAIN_REG_ADDR, target_gain);
write_reg(0x3001, 0x00); // Group Hold END (Применение одновременно)
}
5. Практические выводы
Использование Dual Conversion Gain позволяет достичь качества изображения, недоступного ранее для сенсоров малого формата (1/2.8", 1/1.8"). Правильная настройка порогов переключения позволяет автоматике бесшовно переходить от дневного мониторинга к ночному видению с сохранением детализации в глубоких тенях. Расчет экспозиции для GLOBAL SHUTTER
Статья подготовлена специалистами в области компьютерного зрения и обработки сигналов CMOS.
Интерактивный симулятор: Логика переключения Gain
Передвигайте ползунок усиления, чтобы увидеть момент физического переключения емкости FD: Перейти в полноценный иммертатор камеры.
Оценка профпригодности: Тест на «Эффект Желе»
Введите параметры съемки, чтобы узнать, насколько сильно будет проявляться искажение геометрии (Rolling Shutter): Перейти к расчетам
Программная реализация (Implementation Guide)
Примеры кода для управления физическими регистрами сенсора:
static int imx_update_conversion_gain(struct imx_sensor *sensor, u32 gain_val)
{
/* Порог активации HCG обычно 0x50 (прибл. 18-21dB) */
bool hcg_enable = (gain_val > 0x50);
// 1. Активируем Group Hold для атомарной записи (регистр 0x3001)
imx_write_reg(sensor, 0x3001, 0x01);
// 2. Переключаем режим FD (Floating Diffusion)
// Регистр 0x3009, Bit 4: 1 = HCG, 0 = LCG
imx_write_reg(sensor, 0x3009, hcg_enable ? 0x10 : 0x00);
// 3. Записываем значение аналогового усиления (Gain)
imx_write_reg(sensor, 0x3014, gain_val & 0xFF);
// 4. Снимаем Hold - настройки применяются в одном кадре
return imx_write_reg(sensor, 0x3001, 0x00);
}
import os
def set_sensor_mode(mode: str):
"""
mode: 'HCG' для ночи, 'LCG' для дня
"""
path = "/sys/bus/i2c/devices/10-001a/conversion_gain"
if not os.path.exists(path):
print("Ошибка: Драйвер не поддерживает sysfs управление.")
return
try:
with open(path, 'w') as f:
f.write(mode)
print(f"Система переведена в режим: {mode}")
except PermissionError:
print("Ошибка: Запуск возможен только через sudo.")
# Пример вызова
set_sensor_mode("HCG")