Документация Engee

Публичные методы программного управления Genie

Пример создания простого приложения с помощью фреймворка Genie также представлен в Сообществе Engee.

Здесь представлены все публичные методы программного управления genie для работы с фреймворком Genie. Для их использования в приложениях Genie, подключите библиотеку инструментов Engee с помощью команды using Engee внутри вашего кода (app.jl).

Методы genie

EngeeDSP.modulate(x, fc, fs)
EngeeDSP.modulate(x, fc, fs, method)
EngeeDSP.modulate(x, fc, fs, method, opt)

Модуляция для моделирования систем связи.

Вызов функции

  • (y, t) = modulate(x, fc, fs, method, opt) — модулирует вещественный полезный сигнал x с использованием несущей частоты fc, частоты дискретизации fs и метода method с дополнительными параметрами, заданными в opt, и возвращает внутренний вектор времени t.

  • (y, t) = modulate(x, fc, fs, method) — модулирует вещественный полезный сигнал x с использованием несущей частоты fc, частоты дискретизации fs и метода method.

  • (y, t) = modulate(x, fc, fs) — модулирует вещественный полезный сигнал x с использованием несущей частоты fc и частоты дискретизации fs. Если x является матрицей, то модулированный сигнал вычисляется независимо для каждого столбца и сохраняется в соответствующем столбце y.

Аргументы

Входные аргументы

  • x::AbstractVector{<:Real} | AbstractMatrix{<:Real}: полезный сигнал (вещественный вектор или матрица). Если x — матрица, модуляция выполняется независимо по каждому столбцу.

  • fc::Real: несущая частота (вещественный положительный скаляр).

  • fs::Real: частота дискретизации (вещественный положительный скаляр).

  • method::String: метод модуляции. Возможные значения: "am" (по умолчанию), "amdsb-sc", "amdsb-tc", "amssb", "fm", "pm", "pwm", "ppm", "qam".

    • "am" или "amdsb-sc": амплитудная модуляция (две боковые полосы, подавленная несущая). Умножает x на косинус с частотой fc.

      y = x .* cos(2*pi*fc*t)
    • "amdsb-tc": амплитудная модуляция (две боковые полосы, передаваемая несущая). Вычитает скаляр opt из x и умножает результат на косинус с частотой fc.

      y = (x - opt) .* cos(2*pi*fc*t)

      Если opt не задан, используется значение по умолчанию min(min(x)), чтобы (x - opt) был неотрицательным и имел минимальное значение 0.

    • "amssb": амплитудная модуляция (одиночная боковая полоса). Умножает x на косинус с частотой fc и добавляет преобразование Гильберта x, умноженное на синус с частотой fc.

      y = x .* cos(2*pi*fc*t) + imag(hilbert(x)) .* sin(2*pi*fc*t)

      Этот метод эффективно устраняет верхнюю боковую полосу частот.

    • "fm": частотная модуляция. Создает косинус с мгновенной частотой, которая изменяется в зависимости от x.

      y = cos(2*pi*fc*t + opt*cumsum(x))

      cumsum(x) — прямоугольная аппроксимация интеграла от x. opt используется как константа частотной модуляции. Если opt не задан, по умолчанию: opt = (fc/fs)*2*pi/(max(max(x))), поэтому максимальное отклонение частоты от fc будет fc Гц.

    • "pm": фазовая модуляция. Создает косинус с частотой fc, фаза которого изменяется в зависимости от x.

      y = cos(2*pi*fc*t + opt*x)

      opt используется как константа фазовой модуляции. Если opt не задан, по умолчанию: opt = pi/(max(max(x))), поэтому максимальное отклонение фазы будет π рад.

    • "pwm": широтно-импульсная модуляция. Создает ШИМ-сигнал на основе длин импульсов в x. Элементы x должны быть в диапазоне [0, 1] и задают длительность каждого импульса в долях периода. Импульсы начинаются в начале каждого периода несущей (выровнены по левому краю). При вызове modulate(x, fc, fs, "pwm", "centered") импульсы центрируются в начале каждого периода. Длина (y, t) равна length(x)*fs/fc.

    • "ppm": позиционно-импульсная модуляция. Создает сигнал с ПИМ из позиций импульсов в x. Элементы x должны быть в диапазоне [0, 1] и задают левый край каждого импульса в долях периода. opt — скаляр от 0 до 1, задающий длину каждого импульса в долях периода (по умолчанию 0.1). Длина (y, t) равна length(x)*fs/fc.

    • "qam": квадратурная амплитудная модуляция. Создает сигнал из x и opt.

      y = x .* cos(2*pi*fc*t) + opt .* sin(2*pi*fc*t)

      Входной аргумент opt должен быть той же размерности, что и x.

  • opt: дополнительные параметры для некоторых методов. Подробнее в method. Типы данных: Float32, Float64, Char, String. Поддержка комплексных чисел: да.

Выходные аргументы

  • y: модулированный полезный сигнал (вещественный вектор или матрица). Сигнал y имеет ту же размерность, что и x, за исключением методов method: "pwm" и "ppm".

  • t: внутренний вектор времени.

EngeeDSP.demod(y, fc, fs, method)
EngeeDSP.demod(y, fc, fs, method, opt)

Демодуляция для моделирования систем связи.

Вызов функции

  • x = demod(y, fc, fs, method, opt) — демодулирует вещественный полезный сигнал y с использованием несущей частоты fc, частоты дискретизации fs и метода method с дополнительными параметрами, заданными в opt.

  • x = demod(y, fc, fs, method) — демодулирует вещественный полезный сигнал y с использованием несущей частоты fc, частоты дискретизации fs и метода method.

Аргументы

Входные аргументы

  • y::AbstractVector{<:Real} | AbstractMatrix{<:Real}: модулированный сигнал (вещественный вектор или матрица). Сигнал y имеет ту же размерность, что и x, за исключением методов method: "pwm" и "pmm".

  • fc::Real: несущая частота (вещественный положительный скаляр).

  • fs::Real: частота дискретизации (вещественный положительный скаляр).

  • method::String: метод модуляции. Возможные значения: "am" (по умолчанию), "amdsb-sc", "amdsb-tc", "amssb", "fm", "pm", "pwm", "pmm", "qam".

    • "am" или "amdsb-sc": амплитудная демодуляция (две боковые полосы, подавленная несущая). Умножает y на косинус с частотой fc и применяет ФНЧ Баттерворта 5-го порядка с использованием filtfilt.

      x = y .* cos(2*pi*fc*t)
      b, a = butter(5, fc*2/fs)
      x = filtfilt(b, a, x)
    • "amdsb-tc": амплитудная демодуляция (две боковые полосы, передаваемая несущая). Умножает y на косинус с частотой fc и применяет ФНЧ Баттерворта 5-го порядка с использованием filtfilt. Если указан opt, то после фильтрации вычитает скаляр opt из x (по умолчанию opt = 0).

      x = y .* cos(2*pi*fc*t)
      b, a = butter(5, fc*2/fs)
      x = filtfilt(b, a, x)
      # при наличии opt: x = x .- opt
    • "amssb": амплитудная демодуляция (SSB). Умножает y на косинус с частотой fc и применяет ФНЧ Баттерворта 5-го порядка с использованием filtfilt.

      x = y .* cos(2*pi*fc*t)
      b, a = butter(5, fc*2/fs)
      x = filtfilt(b, a, x)
    • "fm": частотная демодуляция. Демодулирует ЧМ-сигнал путём модуляции преобразования Гильберта y комплексной экспонентой частоты -fc Гц и получает в результате мгновенную частоту.

    • "pm": фазовая демодуляция. Демодулирует ФМ-сигнал путём модуляции преобразования Гильберта y комплексной экспонентой частоты -fc Гц и получает в результате мгновенную фазу.

    • "pwm": широтно-импульсная демодуляция. Определяет ширину импульсов ШИМ-сигнала y и возвращает вектор x, элементы которого задают длительность каждого импульса в долях периода. Импульсы в y должны начинаться с начала каждого периода несущей (выровнены по левому краю). При модуляции modulate(x, fc, fs, "pwm", "centered") получаются импульсы, центрированные в начале каждого периода. Длина y равна length(x)*fs/fc.

    • "pmm": позиционно-импульсная демодуляция. Определяет положения импульсов в сигнале y. Для правильной демодуляции импульсы не должны перекрываться. Длина x равна length(t)*fc/fs.

    • "qam": квадратурная амплитудная демодуляция. Вызов demod(y, fc, fs, "qam") возвращает два сигнала (x1, x2): умножает y на косинус и синус с частотой fc и применяет ФНЧ Баттерворта 5-го порядка, используя filtfilt.

      x1 = y .* cos(2*pi*fc*t)
      x2 = y .* sin(2*pi*fc*t)
      b, a = butter(5, fc*2/fs)
      x1 = filtfilt(b, a, x1)
      x2 = filtfilt(b, a, x2)
  • opt: дополнительные параметры для некоторых методов. Подробнее в method. Типы данных: Float32, Float64, Char, String. Поддержка комплексных чисел: да.

Выходные аргументы

  • x: демодулированный полезный сигнал (вещественный вектор или матрица). Для метода "qam" возвращаются два сигнала: (x1, x2).

EngeeDSP.square(t)
EngeeDSP.square(t, duty)

Прямоугольный сигнал.

Вызов функции

  • x = square(t) — генерирует прямоугольный сигнал с периодом для элементов массива времени t. Функция square похожа на синус, но создает прямоугольный сигнал со значениями -1 и 1.

  • x = square(t, duty) — генерирует прямоугольный сигнал с заданным коэффициентом заполнения duty. Коэффициент заполнения — это процент от периода сигнала, в течение которого прямоугольный сигнал положителен.

Аргументы

Входные аргументы

  • t::AbstractArray{<:Real}: массив времени (вектор, матрица или N-мерный массив). Функция square работает с первым измерением массива t, размер которого больше 1. Типы данных: Float32, Float64.

  • duty::Real: коэффициент заполнения (по умолчанию 50). Вещественный скаляр от 0 до 100. Типы данных: Float32, Float64.

Выходные аргументы

  • x: прямоугольный сигнал, возвращаемый в виде вектора, матрицы или N-мерного массива.

engee.genie.start(app_path::String; devel::Bool=false, log_file::String="", open_url::Bool=false)

Запускает приложение Genie по указанному пути.

После запуска функция возвращает GenieApplicationStatus, в котором доступна ссылка на приложение (также выводится в консоль в виде ... at 'https://.../genie/<AppName>/'). Ссылку можно открыть в новой вкладке/окне или скопировать для открытия вручную.

Перед использованием команды engee.genie.start убедитесь, что если приложение представляет собой директорию, то в ней есть файл с кодом приложения и расширением .jl. Также удалите файлы config и *.toml (если они присутствуют).

Аргументы

  • app_path::String: путь до директории приложения. Может быть относительным или абсолютным.

  • devel::Bool=false: параметр для включения режима разработки, при котором изменения в коде применяются без перезапуска приложения.

  • log_file::String="": параметр для указания пути к файлу логов. Если не задан, то логи не сохраняются отдельно.

  • open_url::Bool=false: если true, то Engee автоматически откроет URL приложения в браузере (ссылка также доступна в возвращаемом статусе).

Примеры

# Запуск Genie через файл приложения app.jl, без режима разработки и сохранения логов
engee.genie.start("/user/app.jl")

# Запуск Genie через файл приложения app.jl, с режимом разработки и сохранением логов
engee.genie.start("/user/app.jl", devel=true, log_file="/user/logs.txt")

# Запуск и автоматическое открытие приложения в браузере
engee.genie.start("RadarCalculate", open_url=true)
engee.genie.stop(app_path::String)

Останавливает запущенное приложение Genie.

Аргументы

app_path::String: путь до директории приложения. Может быть относительным или абсолютным.

Примеры

# Остановка приложения по абсолютному пути
engee.genie.stop("/user/app.jl")

# Остановка приложения по относительному пути
engee.genie.stop("app.jl")
engee.genie.list()

Выводит список всех запущенных приложений Genie.

Примеры

engee.genie.list()
engee.genie.eval(code::AbstractString)

Выполняет указанный код в рабочем пространстве Engee вне контекста запущенного приложения Genie. Используется для запуска отдельных выражений, отладки или динамического выполнения кода без необходимости перезапуска приложения.

Аргументы

code::AbstractString: строка с кодом на Julia, который будет выполнен в рабочем пространстве Engee.

Примеры

engee.genie.eval("x = 5")
engee.genie.recv(wsVarName::AbstractString; context::Module=GenieAPI )

Возвращает значение переменной из указанного контекста (модуля) в рабочем пространстве Engee во время выполнения приложения Genie.

По умолчанию переменная ищется в модуле GenieAPI, но при необходимости можно явно указать другой модуль через параметр context. Так, если переменная определена в другом модуле, то используется параметр context, указывающий, в каком пространстве имен ее искать.

Аргументы

  • wsVarName::AbstractString: имя переменной, значение которой нужно получить.

  • context::Module=GenieAPI: модуль, в котором производится поиск переменной. Указывается явно, если переменная не принадлежит модулю GenieAPI.

Примеры

# Получение значения переменной x из модуля Main
engee.genie.recv("x", Main)

# Получение значения переменной a из модуля по умолчанию
engee.genie.recv("a")

# Получение значения переменной value из пользовательского модуля
engee.genie.recv("value"; context=MyModule)
engee.genie.send(wsVarName::AbstractString, value::Any)

Сохраняет значение value в переменную wsVarName в рабочем пространстве Engee во время выполнения приложения на Genie.

Если переменная с таким именем ранее не существовала, то она будет создана автоматически. Функция удобна для передачи промежуточных результатов или пользовательских данных из приложения Genie в сессию Engee.

Аргументы

  • wsVarName::AbstractString: имя переменной, которой присваивается значение.

  • value::Any: значение, которое будет сохранено в переменной. Может быть любого типа.

Примеры

# Присвоение переменной x значение 124
engee.genie.send("x", 124)

# Сохранение строки в переменной message
engee.genie.send("message", "Hello")