diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml
index 3905aed5..51d9fa84 100644
--- a/.github/workflows/build-and-deploy.yml
+++ b/.github/workflows/build-and-deploy.yml
@@ -29,6 +29,8 @@ concurrency:
jobs:
# Single deploy job since we're just deploying
deploy:
+ env:
+ PYSDR_BASEURL: https://distribtech.github.io/PySDR/
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
diff --git a/.github/workflows/build-and-spell-check.yml b/.github/workflows/build-and-spell-check.yml
index 7cecf2d5..b1daf248 100644
--- a/.github/workflows/build-and-spell-check.yml
+++ b/.github/workflows/build-and-spell-check.yml
@@ -4,6 +4,8 @@ on: [pull_request]
jobs:
job1:
+ env:
+ PYSDR_BASEURL: https://distribtech.github.io/PySDR/
runs-on: ubuntu-latest
steps:
- name: Checkout Code
diff --git a/content-ukraine/cyclostationary.rst b/content-ukraine/cyclostationary.rst
index 258355c0..08fc08ce 100644
--- a/content-ukraine/cyclostationary.rst
+++ b/content-ukraine/cyclostationary.rst
@@ -1,24 +1,24 @@
.. _freq-domain-chapter:
##########################
-Циклостаціонарна обробка
+Циклічно-стаціонарна обробка
##########################
.. raw:: html
У співавторстві з Sam Brown
-У цьому розділі ми розкриваємо суть обробки циклостаціонарних сигналів (cyclostationary signal processing, або CSP) — відносно нішової галузі радіочастотної (RF) обробки сигналів, яка використовується для аналізу або виявлення (часто за дуже низького SNR!) сигналів із циклостаціонарними властивостями, зокрема більшості сучасних схем цифрової модуляції. Ми розглянемо циклічну автокореляційну функцію (CAF), спектральну кореляційну функцію (SCF), функцію спектральної когерентності (COH), їхні спряжені варіанти та способи застосування. Розділ містить кілька повних реалізацій на Python з прикладами, що охоплюють BPSK, QPSK, OFDM та кілька одночасних сигналів.
+У цьому розділі ми розкриваємо суть обробки циклічно-стаціонарних сигналів (cyclostationary signal processing, або CSP) це відносно нішовий розділ радіочастотної (RF) обробки сигналів, який використовується для аналізу або виявлення (часто за дуже низького SNR!) сигналів із циклічно-стаціонарними властивостями, а це зокрема цигнали більшості сучасних схем цифрової модуляції. Ми розглянемо циклічну автокореляційну функцію (CAF), спектральну кореляційну функцію (SCF), функцію спектральної когерентності (COH), їхні спряжені варіанти та способи застосування. Розділ містить кілька повних реалізацій на Python з прикладами, що охоплюють BPSK, QPSK, OFDM та комбінацію одночасних сигналів.
****************
Вступ
****************
-Циклостаціонарна обробка сигналів (CSP або просто циклостаціонарна обробка) — це набір технік, що дозволяє використовувати циклостаціонарну властивість, притаманну багатьом реальним комунікаційним сигналам. Це можуть бути модульовані сигнали, як-от трансляції AM/FM/ТБ, стільниковий та WiFi зв’язок, а також радари й інші сигнали, статистика яких має періодичність. Значна частина класичних методів обробки сигналів ґрунтується на припущенні, що сигнал стаціонарний, тобто його статистики, такі як середнє значення, дисперсія та моменти вищих порядків, не змінюються з часом. Однак більшість реальних RF-сигналів є циклостаціонарними, тобто їхня статистика змінюється *періодично* з часом. Техніки CSP використовують цю циклостаціонарну властивість і можуть застосовуватися для виявлення сигналів у шумі, розпізнавання модуляції та розділення сигналів, що перекриваються як у часі, так і в частоті.
+Циклічно-стаціонарна обробка сигналів (CSP або просто циклічно-стаціонарна обробка) — це набір технік, що дозволяє використовувати циклічно-стаціонарну властивість, притаманну багатьом реальним сигналам, що використовуються в зв'язку. Це можуть бути модульовані сигнали, такі як-от трансляції AM/FM/ТБ, стільниковий та WiFi зв’язок, а також радари й інші сигнали, статистичні характеристики, котрих мають періодичність. Значна частина класичних методів обробки сигналів ґрунтується на припущенні, що сигнал стаціонарний, тобто його статистичні характеристики, такі як середнє значення, дисперсія та моменти вищих порядків, не змінюються з часом. Однак більшість реальних RF-сигналів є циклічно-стаціонарними, тобто їхні статистичні характеристики змінюються *періодично* з часом. Техніки CSP використовують цю циклічно-стаціонарну властивість і можуть застосовуватися для виявлення сигналів у шумі, розпізнавання модуляції та розділення сигналів, які перетинаються як у часі, так і по частоті.
-Якщо після читання цього розділу та експериментів у Python ви захочете глибше зануритися в CSP, перегляньте підручник Вільяма Гарднера 1994 року `Cyclostationarity in Communications and Signal Processing `_, його підручник 1987 року `Statistical Spectral Analysis `_, або `збірку публікацій у блозі Чада Спунера `_.
+Якщо після прочитання цього розділу та експериментів з Python ви захочете глибше зануритися в CSP, перегляньте підручник Вільяма Гарднера 1994 року `Cyclostationarity in Communications and Signal Processing `_, його підручник 1987 року `Statistical Spectral Analysis `_, або `збірку публікацій у блозі Чада Спунера `_.
-Ресурс, який ви знайдете лише тут і ні в жодному підручнику: наприкінці розділу про SCF на вас чекає інтерактивний JavaScript-додаток, що дає змогу експериментувати зі SCF прикладного сигналу та спостерігати, як SCF змінюється за різних параметрів сигналу та самої SCF — усе це просто у вашому браузері! Хоча ці інтерактивні демонстрації безкоштовні для всіх, здебільшого вони стають можливими завдяки підтримці учасників `Patreon PySDR `_.
+А один ресурс, який ви знайдете лише тут і ні в жодному іншому підручнику це наприкінці розділу про SCF вас чекає інтерактивний JavaScript-додаток, що дає змогу експериментувати з SCF для сигналу-приклада та спостерігати, як SCF змінюється за різних параметрів сигналу та самої SCF. І усе це просто у вашому браузері! Хоча ці інтерактивні демонстрації безкоштовні для всіх, здебільшого вони стають можливими завдяки підтримці учасників `Patreon PySDR `_.
*************************
Огляд автокореляції
@@ -57,11 +57,11 @@
.. math::
R_x(\tau, \alpha) = \frac{1}{N} \sum_{n=-N/2}^{N/2} x\left[ n+\frac{\tau}{2} \right] x^*\left[ n-\frac{\tau}{2} \right] e^{-j2\pi \alpha n}
-Це дозволяє перевірити, наскільки сильною є частота :math:`\alpha`. Наведений вище вираз називається циклічною автокореляційною функцією (CAF). Інший спосіб інтерпретації CAF — це набір коефіцієнтів ряду Фур’є, які описують згадану періодичність. Іншими словами, CAF — це амплітуда та фаза гармонік, присутніх в автокореляції сигналу. Ми використовуємо термін «циклостаціонарний», щоб описати сигнали, автокореляція яких є періодичною або майже періодичною. CAF є розширенням традиційної автокореляційної функції для циклостаціонарних сигналів.
+Це дозволяє перевірити, наскільки сильною є частота :math:`\alpha`. Наведений вище вираз називається циклічною автокореляційною функцією (CAF). Інший спосіб інтерпретації CAF — це набір коефіцієнтів ряду Фур’є, які описують згадану періодичність. Іншими словами, CAF — це амплітуда та фаза гармонік, присутніх в автокореляції сигналу. Ми використовуємо термін «циклічно-стаціонарний», щоб описати сигнали, автокореляція яких є періодичною або майже періодичною. CAF є розширенням традиційної автокореляційної функції для циклічно-стаціонарних сигналів.
-Видно, що CAF залежить від двох змінних: затримки :math:`\tau` (tau) та циклічної частоти :math:`\alpha`. Циклічні частоти в CSP відображають швидкість зміни статистики сигналу, що у випадку CAF означає момент другого порядку або дисперсію. Тож циклічні частоти часто відповідають виразним періодичним явищам, таким як символи, що модулюються в комунікаційних сигналах. Побачимо, як символова швидкість сигналу BPSK та її цілі кратні (гармоніки) проявляються як циклічні частоти у CAF.
+Видно, що CAF залежить від двох змінних: затримки :math:`\tau` (tau) та циклічної частоти :math:`\alpha`. Циклічні частоти в CSP відображають швидкість зміни статистистичних характеристик сигналу, що у випадку CAF означає момент другого порядку або дисперсію. Тож циклічні частоти часто відповідають виразним періодичним явищам, такими як символи, що модулюються в сигналах зв'язку. Ми побачимо, як символьна швидкість сигналу BPSK та її цілі кратні (гармоніки) проявляються як циклічні частоти CAF.
-У Python CAF базового сигналу :code:`samples` для заданих :code:`alpha` та :code:`tau` можна обчислити за допомогою такого фрагмента (ми незабаром додамо обрамлювальний код):
+У Python CAF базового сигналу :code:`samples` для заданих :code:`alpha` та :code:`tau` можна обчислити за допомогою такого фрагмента (ми незабаром додамо і інший обрамлюваний код):
.. code-block:: python
@@ -71,9 +71,9 @@
Ми використовуємо :code:`np.roll()` для зсуву одного набору відліків на :code:`tau`, адже потрібно зміщувати на ціле число відліків. Якби ми зсували обидва набори у протилежних напрямках, ми пропускали б кожне друге зміщення. Також необхідно додати частотний зсув, щоб компенсувати те, що ми зміщуємо на 1 відлік за раз і лише з одного боку (замість половини відліку в обидва боки, як у базовому рівнянні CAF). Частота цього зсуву дорівнює :code:`alpha/2`.
-Щоб погратися з CAF у Python, спершу змоделюємо приклад сигналу. Поки що використаємо прямокутний сигнал BPSK (тобто BPSK без формування імпульсу) з 20 відліками на символ та додамо білий гаусів шум (AWGN). Ми навмисне внесемо частотний зсув у сигнал BPSK, аби пізніше продемонструвати, як циклостаціонарна обробка допомагає оцінювати і частотний зсув, і циклічну частоту. Цей зсув відповідає ситуації, коли приймач не ідеально налаштований на частоту сигналу: або трохи хибить, або суттєво, але не настільки, щоб сигнал виходив за межі смуги дискретизації.
+Щоб погратися з CAF у Python, спершу змоделюємо приклад сигналу. Поки що використаємо прямокутний сигнал BPSK (тобто BPSK без формування імпульсу) з 20 відліками на символ та додамо білий гаусів шум (AWGN). Ми навмисне внесемо частотний зсув у сигнал BPSK, аби пізніше продемонструвати, як циклічно-стаціонарна обробка допомагає оцінювати і частотний зсув, і циклічну частоту. Цей зсув відповідає ситуації, коли приймач не ідеально налаштований на частоту сигналу: або трохи хибить, або суттєво, але не настільки, щоб сигнал виходив за межі смуги дискретизації.
-Наведений нижче код генерує IQ-відліки, які ми використовуватимемо впродовж двох наступних розділів:
+Наведений нижче код генерує IQ-відліки, які ми будемо використовувати впродовж двох наступних розділів:
.. code-block:: python
@@ -88,7 +88,7 @@
noise = np.random.randn(N) + 1j*np.random.randn(N) # complex white Gaussian noise
samples = bpsk + 0.1*noise # add noise to the signal
-Оскільки абсолютні швидкість дискретизації та швидкість символів у цьому розділі не відіграють ролі, ми використовуємо нормалізовані частоти, що еквівалентно припущенню, що частота дискретизації = 1 Гц. Це означає, що сигнал мусить лежати в діапазоні від -0.5 до +0.5 Гц. Тому ви *не* побачите змінної :code:`sample_rate` у коді: ми працюємо через кількість відліків на символ (:code:`sps`).
+Оскільки абсолютні швидкість дискретизації та швидкість символів у цьому розділі не відіграють важливої ролі, ми використовуємо нормалізовані частоти, що еквівалентно припущенню, що частота дискретизації = 1 Гц. Це означає, що сигнал мусить лежати в діапазоні від -0.5 до +0.5 Гц. Тому ви *не* побачите змінної :code:`sample_rate` у коді: ми працюємо з кількістю відліків на символ (:code:`sps`).
Для розігріву погляньмо на щільність спектральної потужності (PSD, тобто FFT) сигналу до будь-якої обробки CSP:
@@ -151,7 +151,7 @@
Бачимо очікуваний пік на 0.05 Гц, а також на цілих кратних 0.05 Гц. Це тому, що CAF — це ряд Фур’є, і гармоніки основної частоти присутні в CAF, особливо для PSK/QAM без формування імпульсу. Енергія на :math:`\alpha = 0` відповідає загальній потужності у PSD сигналу, хоча зазвичай ми її занулюємо, адже 1) PSD часто будують окремо і 2) вона псує динамічний діапазон колірної карти, коли ми починаємо відображати 2D-дані.
-Хоч CAF цікавий, зазвичай нам хочеться побачити циклічну частоту *як функцію RF-частоти*, а не лише циклічну частоту, як у графіку вище. Це приводить нас до спектральної кореляційної функції (SCF), яку розглянемо далі.
+Хоч CAF цікавий, ми зазвичай хочемо побачити циклічну частоту *як функцію RF-частоти*, а не лише циклічну частоту, як у графіку вище. Це приводить нас до спектральної кореляційної функції (SCF), яку розглянемо далі.
************************************************
Спектральна кореляційна функція (SCF)
@@ -235,7 +235,7 @@ SCF можна отримати простим перетворенням Фур
Метод згладжування за частотою (FSM)
********************************
-Тепер, коли ми маємо гарне інтуїтивне уявлення про SCF, розгляньмо, як обчислити її ефективно. Спершу пригадаємо періодограму — квадрат модуля перетворення Фур’є сигналу:
+Тепер, коли ми маємо гарне інтуїтивне уявлення про SCF, розгляньмо, як обчислити її ефективно. Спершу пригадаємо періодограму — це просто квадрат модуля амплітуд перетворення Фур’є сигналу:
.. math::
@@ -292,7 +292,7 @@ SCF можна отримати простим перетворенням Фур
:target: ../_images/scf_freq_smoothing.svg
:alt: SCF, обчислена методом згладжування за частотою (FSM)
-Цей метод вимагає лише одного великого FFT, але потребує численних операцій згортки для згладжування. Зверніть увагу на проріджування після згортки :code:`[::Nw]`; воно не обов’язкове, але дуже бажане, щоб зменшити кількість пікселів для відображення, і завдяки способу обчислення SCF ми не «викидаємо» інформацію, проріджуючи на :code:`Nw`.
+Цей метод вимагає лише одного великого FFT, але потребує численних операцій згортки для згладжування. Зверніть увагу на проріджування після згортки :code:`[::Nw]`; воно не обов’язкове, але дуже бажане, щоб зменшити кількість пікселів для відображення, і завдяки способу обчислення SCF ми не «викидаємо» інформацію, проріджуючи по :code:`Nw`.
***************************
Метод згладжування за часом (TSM)
@@ -448,7 +448,7 @@ QPSK та модуляції вищих порядків
Отже, маємо два сигнали з однаковою циклічною частотою та два — з однаковою RF-частотою. Це дозволить дослідити різні ступені перекриття параметрів.
-До кожного сигналу додається фільтр дробової затримки з довільною (нецілою) затримкою, щоб уникнути артефактів, пов’язаних із синхронним розташуванням відліків (докладніше про це в розділі :ref:`sync-chapter`). Потужність прямокутного BPSK зменшено порівняно з двома іншими, оскільки сигнали з прямокутними імпульсами мають дуже виражені циклостаціонарні властивості й схильні домінувати в SCF.
+До кожного сигналу додається фільтр дробової затримки з довільною (нецілою) затримкою, щоб уникнути артефактів, пов’язаних із синхронним розташуванням відліків (докладніше про це в розділі :ref:`sync-chapter`). Потужність прямокутного BPSK зменшено порівняно з двома іншими, оскільки сигнали з прямокутними імпульсами мають дуже виражені циклічно-стаціонарні властивості й схильні домінувати в SCF.
.. raw:: html
@@ -526,13 +526,13 @@ QPSK та модуляції вищих порядків
:target: ../_images/scf_freq_smoothing_pulse_multiple_signals.svg
:alt: SCF трьох сигналів, обчислена методом згладжування за частотою (FSM)
-Зауважте, що сигнал 1, хоч і з прямокутними імпульсами, переважно маскується «конусом» над сигналом 3. На PSD сигнал 1 «ховався» за сигналом 3. Завдяки CSP ми можемо виявити присутність сигналу 1 та приблизно визначити його циклічну частоту, яку потім можна використати для синхронізації. Ось у чому сила циклостаціонарної обробки!
+Зауважте, що сигнал 1, хоч і з прямокутними імпульсами, переважно маскується «конусом» над сигналом 3. На PSD сигнал 1 «ховався» за сигналом 3. Завдяки CSP ми можемо виявити присутність сигналу 1 та приблизно визначити його циклічну частоту, яку потім можна використати для синхронізації. Ось у чому сила циклічно-стаціонарної обробки!
************************
Альтернативні ознаки CSP
************************
-SCF — не єдиний спосіб виявляти циклостаціонарність сигналу, особливо якщо вам не потрібно розглядати циклічну частоту як функцію RF-частоти. Проста (і концептуально, і обчислювально) техніка передбачає взяття **FFT від модуля** сигналу й пошук піків. У Python це виглядає так:
+SCF — не єдиний спосіб виявляти циклічно-стаціонарність сигналу, особливо якщо вам не потрібно розглядати циклічну частоту як функцію RF-частоти. Проста (і концептуально, і обчислювально) техніка передбачає взяття **FFT від модуля** сигналу й пошук піків. У Python це виглядає так:
.. code-block:: python
@@ -556,11 +556,11 @@ SCF — не єдиний спосіб виявляти циклостаціон
.. image:: ../_images/non_csp_metric.svg
:align: center
:target: ../_images/non_csp_metric.svg
- :alt: Метрика для виявлення циклостаціонарності без використання CAF чи SCF
+ :alt: Метрика для виявлення циклічно-стаціонарності без використання CAF чи SCF
Гармоніки прямокутного BPSK, на жаль, перекриваються з циклічними частотами інших сигналів — це демонструє недолік цього альтернативного підходу: він не дозволяє розглядати циклічну частоту як функцію RF-частоти, як це робить SCF.
-Хоч цей метод і використовує циклостаціонарність сигналів, його зазвичай не відносять до «технік CSP», можливо, через простоту...
+Хоч цей метод і використовує циклічно-стаціонарність сигналів, його зазвичай не відносять до «технік CSP», можливо, через простоту...
Для пошуку RF-частоти сигналу, тобто зсуву несучої, існує схожий прийом. Для сигналів BPSK достатньо взяти FFT від сигналу у квадраті (вхід FFT буде комплексним). Це дасть пік на частоті, що дорівнює подвоєному зсуву несучої. Для QPSK можна взяти FFT від сигналу в четвертій степені й отримати пік на частоті, що дорівнює зсуву несучої, помноженому на 4.
@@ -582,7 +582,7 @@ SCF — не єдиний спосіб виявляти циклостаціон
*Коротко: функція спектральної когерентності — це нормалізована версія SCF, яка в деяких випадках є кориснішою за звичайну SCF.*
-Ще одна міра циклостаціонарності, що в багатьох випадках може дати більше інформації, ніж «сире» SCF, — це функція спектральної когерентності (COH). COH нормалізує SCF так, що результат лежить у діапазоні від -1 до 1 (ми розглядатимемо модуль, тобто 0–1). Це корисно, адже із результату вилучається інформація про спектр потужності сигналу, яку містить «сире» SCF. Нормалізація залишає лише впливи циклічної кореляції.
+Ще одна міра циклічно-стаціонарності, що в багатьох випадках може дати більше інформації, ніж «сире» SCF, — це функція спектральної когерентності (COH). COH нормалізує SCF так, що результат лежить у діапазоні від -1 до 1 (ми розглядатимемо модуль, тобто 0–1). Це корисно, адже із результату вилучається інформація про спектр потужності сигналу, яку містить «сире» SCF. Нормалізація залишає лише впливи циклічної кореляції.
Щоб краще зрозуміти COH, згадаємо `коефіцієнт кореляції `_ зі статистики. Коефіцієнт кореляції :math:`\rho_{X,Y}` вимірює зв’язок між двома випадковими величинами :math:`X` і :math:`Y` у діапазоні -1…1. Він визначається як ковариація, поділена на добуток стандартних відхилень:
@@ -902,7 +902,7 @@ COH розширює цю концепцію на спектральну кор
OFDM
********************************
-Циклостаціонарність особливо виражена в OFDM-сигналах через використання циклічного префікса (CP), коли кілька останніх відліків кожного OFDM-символу копіюються на його початок. Це створює сильну циклічну частоту, що відповідає довжині OFDM-символу (яка дорівнює оберненій величині міжсубдіапазонного інтервалу плюс тривалість CP).
+Циклічно-стаціонарність особливо виражена в OFDM-сигналах через використання циклічного префікса (CP), коли кілька останніх відліків кожного OFDM-символу копіюються на його початок. Це створює сильну циклічну частоту, що відповідає довжині OFDM-символу (яка дорівнює оберненій величині міжсубдіапазонного інтервалу плюс тривалість CP).
Змоделюймо OFDM-сигнал. Нижче наведено код, який генерує OFDM із CP, використовуючи 64 піднесучі, 25% CP і QPSK на кожній піднесучій. Ми інтерполюємо сигнал удвічі, щоб змоделювати приймання з достатньо високою швидкістю дискретизації, тому довжина OFDM-символу в відліках становитиме (64 + (64*0.25)) * 2 = 160. Це означає, що очікуємо піки на :math:`\alpha`, кратних 1/160 (0.00625, 0.0125, 0.01875 тощо). Симулюємо 100 тис. відліків, що відповідає 625 OFDM-символам (кожен символ доволі довгий).
diff --git a/content-ukraine/frequency_domain.rst b/content-ukraine/frequency_domain.rst
index 28232311..8899325f 100644
--- a/content-ukraine/frequency_domain.rst
+++ b/content-ukraine/frequency_domain.rst
@@ -4,29 +4,29 @@
Частотна область
################
-Ця глава знайомить з частотною областю і охоплює ряди Фур'є, перетворення Фур'є, властивості Фур'є, ШПФ, вікна і спектрограми, використовуючи приклади з Python.
+Ця глава знайомить з частотною областю і охоплює ряди Фур'є, перетворення Фур'є, властивості Фур'є, ШПФ, вікна і спектрограми, для цього використовуються приклади на Python.
-Одним з найцікавіших побічних ефектів вивчення DSP і бездротового зв'язку є те, що ви також навчитеся мислити в частотній області. Досвід більшості людей з "роботою" в частотній області обмежується регулюванням ручок низьких/середніх/високих частот в автомобільній аудіосистемі. Досвід більшості людей з "переглядом" чогось в частотній області обмежується переглядом звукового еквалайзера, як у цьому кліпі:
+Одним з найцікавіших побічних ефектів вивчення цифрової обробки сигналів (DSP) і бездротового зв'язку є те, що ви також навчитеся мислити в частотній області. Досвід більшості людей "роботи" в частотній області обмежується регулюванням баса/середніх/високих частот в автомобільній аудіосистемі. А "перегляд" чогось в частотній області обмежується для більшості людей переглядом звукового звукового спектра, як у анімації нижче:
.. image:: ../_images/audio_equalizer.webp
:align: center
-Наприкінці цього розділу ви зрозумієте, що насправді означає частотна область, як перетворювати час і частоту (а також що при цьому відбувається), і деякі цікаві принципи, які ми будемо використовувати під час вивчення DSP і SDR. До кінця цього підручника ви станете майстром у роботі з частотною областю, гарантовано!
+Наприкінці цього розділу ви зрозумієте, що насправді означає термін частотна область, як перетворювати з часової області в частотну (а також що при цьому відбувається), і дізнаєтесь про деякі цікаві принципи, які ми будемо використовувати під час вивчення DSP і програмно-керованого радіо (SDR). До кінця цього підручника ви гарантовано станете майстром у роботі з частотною областю!
-По-перше, чому нам подобається розглядати сигнали в частотній області? Ось два приклади сигналів, показаних як в часовій, так і в частотній області.
+Перше питання, чому нам подобається розглядати сигнали в частотній області? Ось два приклади сигналів, показаних як в часовій, так і в частотній області.
.. image:: ../_images/time_and_freq_domain_example_signals.png
:scale: 40 %
:align: center
:alt: Два сигнали в часовій області можуть виглядати як шум, але в частотній області ми бачимо додаткові особливості
-Як ви можете бачити, в часовій області обидва сигнали виглядають як шум, але в частотній області ми бачимо різні особливості. Все знаходиться в часовій області в своїй природній формі; коли ми робимо вибірки сигналів, ми будемо робити їх в часовій області, тому що ви не можете *безпосередньо* зробити вибірку сигналу в частотній області. Але найцікавіші речі зазвичай відбуваються саме в частотній області.
+Як ви можете бачити, в часовій області обидва сигнали виглядають як шум, але в частотній області ми бачимо різні особливості. В природі все знаходиться в часовій області; коли ми робимо оцифровку сигналів, ми робимо їх в часовій області, тому що ми не можемо *безпосередньо* зробити оцифровку сигналу в частотній області. Але найцікавіші речі зазвичай відбуваються саме в частотній області.
***************
Ряди Фур'є
***************
-Основи частотної області починаються з розуміння того, що будь-який сигнал може бути представлений синусоїдальними хвилями, складеними разом. Коли ми розкладаємо сигнал на складові синусоїди, ми називаємо це рядом Фур'є. Ось приклад сигналу, який складається лише з двох синусоїд:
+Основи для розуміння частотної області починається з того, що будь-який сигнал може бути представлений, як сума синусоїдальних хвиль. Коли ми розкладаємо сигнал на складові синусоїди, ми називаємо це рядом Фур'є. Ось приклад сигналу, який складається лише з двох синусоїд:
.. image:: ../_images/summing_sinusoids.svg
:align: center
@@ -53,7 +53,7 @@
#. Частота
#. Фаза
-**Амплітуда** вказує на "силу" хвилі, тоді як **частота** - це кількість хвиль в секунду. **Фаза** використовується для представлення того, як синусоїда зсунута у часі, в межах від 0 до 360 градусів (або від 0 до :math:`2\pi`), але вона повинна бути відносно чогось, щоб мати якесь значення, наприклад, два сигнали з однаковою частотою можуть бути на 30 градусів у протифазі один з одним.
+**Амплітуда** вказує на "силу" хвилі, тоді як **частота** - це кількість хвиль в секунду. **Фаза** використовується для представлення того, як синусоїда зсунута у часі, в межах від 0 до 360 градусів (або від 0 до :math:`2\pi`), але вона повинна бути виміряна відносно чогось, щоб мати якесь значення, наприклад, два сигнали з однаковою частотою можуть бути на 30 градусів зсунуті одна відносно іншої.
.. image:: ../_images/amplitude_phase_period.svg
:align: center
@@ -62,15 +62,15 @@
На цьому етапі ви, можливо, зрозуміли, що "сигнал" - це, по суті, просто функція, зазвичай представлена "в часі" (тобто на осі х). Іншим атрибутом, який легко запам'ятати, є **період**, який є оберненою величиною до **частоти**. Період синусоїди - це кількість часу в секундах, за який хвиля завершує один цикл. Таким чином, одиницею частоти є 1/секунда, або Гц.
-Коли ми розкладаємо сигнал на суму синусоїд, кожна з них матиме певну **амплітуду**, **фазу** і **частоту**. Амплітуда кожної синусоїди покаже нам, наскільки сильна **частота** існувала у вихідному сигналі. Не хвилюйтеся надто про **фазу** поки що, окрім усвідомлення того, що єдина різниця між sin() і cos() - це фазовий зсув (часовий зсув).
+Коли ми розкладаємо сигнал на суму синусоїд, кожна з них матиме певну **амплітуду**, **фазу** і **частоту**. Амплітуда кожної синусоїди покаже нам, наскільки сильна **частота** існувала у вихідному сигналі. Не хвилюйтеся надто про **фазу** поки що, окрім усвідомлення того, що єдина різниця між sin() і cos() - це фазовий зсув (зсув у часі).
-Важливіше зрозуміти концепцію, що лежить в основі, ніж самі рівняння, які потрібно розв'язати для ряду Фур'є, але для тих, хто цікавиться рівняннями, я відсилаю вас до стислого пояснення Вольфрама: https://mathworld.wolfram.com/FourierSeries.html.
+Важливіше зрозуміти концепцію, що лежить в основі, ніж самі рівняння, які потрібно розв'язати для отримання ряду Фур'є, але для тих, хто цікавиться рівняннями, я відсилаю вас до стислого пояснення Вольфрама: https://mathworld.wolfram.com/FourierSeries.html.
********************
Часово-частотні пари
********************
-Ми з'ясували, що сигнали можуть бути представлені у вигляді синусоїд, які мають декілька атрибутів. Тепер давайте навчимося будувати графіки сигналів у частотній області. У той час як часова область демонструє, як сигнал змінюється з часом, частотна область показує, яка частина сигналу лежить на яких частотах. Замість осі абсцис - час, ми будемо відкладати частоту. Ми можемо побудувати графік заданого сигналу як в часі, так і в частоті. Для початку розглянемо кілька простих прикладів.
+Ми з'ясували, що сигнали можуть бути представлені у вигляді синусоїд, які мають декілька атрибутів. Тепер давайте навчимося будувати графіки сигналів у частотній області. У той час як часова область демонструє, як сигнал змінюється з часом, частотна область показує, які частини сигналу припадають на які частоти. Замість осі абсцис по який ми відкаладали час, ми будемо відкладати частоту. Ми можемо побудувати графік заданого сигналу як від часу, так і від частоти. Для початку розглянемо кілька простих прикладів.
Ось як виглядає синусоїда з частотою f в часовій і частотній області:
@@ -79,9 +79,9 @@
:align: center
:alt: Часо-частотна пара Фур'є синусоїди, яка є імпульсом у частотній області
-Часова область має виглядати дуже знайомо. Це коливальна функція. Не турбуйтеся про те, в якій точці циклу вона починається або як довго триває. Суть в тому, що сигнал має **єдину частоту**, тому ми бачимо один пік в частотній області. На якій би частоті не коливалася ця синусоїда, ми побачимо пік у частотній області. Математична назва такого піку називається "імпульс".
+Часова область має виглядати дуже знайомо. Це коливальна функція. Не турбуйтеся про те, в якій точці циклу вона починається або як довго триває. Суть в тому, що сигнал має **єдину частоту**, тому ми бачимо один пік в частотній області. На якій би частоті не коливалася ця синусоїда, ми побачимо пік у частотній області. Математична назва такого піку - "імпульс".
-А що, якби ми мали імпульс у часовій області? Уявіть собі звукозапис того, як хтось плескає в долоні або б'є молотком по цвяху. Ця пара час-частота трохи менш інтуїтивно зрозуміла.
+А що, якби ми мали імпульс у часовій області? Уявіть собі звукозапис того, як хтось плескає в долоні або б'є молотком по цвяху. Ця часова-частотна пара трохи менш інтуїтивно зрозуміла.
.. image:: ../_images/impulse.png
:scale: 70 %
@@ -97,7 +97,7 @@
:target: ../_images/square-wave.svg
:alt: Часово-частотна пара Фур'є квадратної хвилі, яка є синусоїдою (функцією sin(x)/x) у частотній області
-Цей графік також менш інтуїтивно зрозумілий, але ми бачимо, що в частотній області є сильний пік, який знаходиться на частоті прямокутної хвилі, але з підвищенням частоти піків стає більше. Це пов'язано зі швидкою зміною часової області, як і в попередньому прикладі. Але частота не рівномірна. Вона має піки через певні проміжки часу, і рівень повільно спадає (хоча це буде тривати вічно). Прямокутна хвиля в часовій області має вигляд sin(x)/x в частотній області (так звана синусоїдальна функція).
+Цей графік також менш інтуїтивно зрозумілий, але ми бачимо, що в частотній області є сильний пік, який знаходиться на частоті прямокутної хвилі, але з підвищенням частоти прямокутного сигналу піків стає більше. Це пов'язано зі швидкою зміною у часової області, як і в попередньому прикладі. Але амплітуда частот не рівномірна. Вона має піки через певні проміжки часу, і їх рівень повільно спадає (хоча і до нескінченості). Прямокутна хвиля в часовій області в частотній області має вигляд sin(x)/x (так звана sinc функція).
А що, якщо у нас є постійний сигнал у часовій області? Постійний сигнал не має "частоти". Давайте подивимося:
@@ -106,7 +106,7 @@
:align: center
:alt: Часово-частотна пара Фур'є сигналу постійного струму, який є імпульсом з частотою 0 Гц у частотній області
-Оскільки частота відсутня, у частотній області ми маємо стрибок на частоті 0 Гц. Це має сенс, якщо ви подумаєте про це. Частотна область не буде "порожньою", тому що це трапляється лише тоді, коли немає сигналу (тобто, часової області 0). Ми називаємо 0 Гц у частотній області "постійним струмом", тому що він викликаний сигналом постійного струму в часі (постійним сигналом, який не змінюється). Зауважте, що якщо ми збільшимо амплітуду нашого постійного сигналу в часовій області, стрибок на 0 Гц в частотній області також збільшиться.
+Оскільки частота відсутня, у частотній області ми маємо стрибок на частоті 0 Гц. Якщо ви подумаєте це має сенс. Частотна область не буде "порожньою", тому що це може бути лише тоді, коли немає сигналу (тобто, в часової області 0). 0 Гц у частотній області називається "постійним струмом", тому що він викликаний сигналом постійного струму в часі (постійним сигналом, який не змінюється). Зауважте, що якщо ми збільшимо амплітуду нашого постійного сигналу в часовій області, стрибок на 0 Гц в частотній області також збільшиться.
Пізніше ми дізнаємося, що саме означає вісь y на графіку в частотній області, але поки що ви можете думати про неї як про своєрідну амплітуду, яка показує, яка частина цієї частоти була присутня в сигналі в часовій області.
@@ -121,7 +121,7 @@
Для сигналу x(t) ми можемо отримати частотну версію X(f), використовуючи цю формулу. Ми будемо позначати часову версію функції через x(t) або y(t), а відповідну частотну версію через X(f) та Y(f). Зверніть увагу, що "t" означає час, а "f" - частоту. "j" - це просто уявна одиниця. Ви могли бачити її як "i" на уроках математики в середній школі. Ми використовуємо "j" в інженерії та комп'ютерних науках, тому що "i" часто позначає струм, а в програмуванні часто використовується як ітератор.
-Повернення до часової області з частоти відбувається майже так само, за винятком масштабного коефіцієнта та від'ємного знаку:
+Зворотнє перетворенння з частотної в часову область відбувається майже так само, за винятком масштабного коефіцієнта та зміни знаку степені:
.. math::
x(t) = \frac{1}{2 \pi} \int X(f) e^{j2\pi ft} df
@@ -131,9 +131,9 @@
.. math::
\omega = 2 \pi f
-Хоча це додає член :math:`2 \pi` до багатьох рівнянь, простіше дотримуватися частоти у Гц. Зрештою, ви будете працювати з Гц у вашій SDR програмі.
+Хоча це додає член :math:`2 \pi` до багатьох рівнянь, простіше дотримуватися частоти у Гц. Зрештою, ви будете працювати з Гц у вашіх SDR та RF програмних застосунках.
-Наведене вище рівняння для перетворення Фур'є є неперервною формою, яку ви побачите лише у математичних задачах. Дискретна форма набагато ближча до того, що реалізовано у коді:
+Наведене вище рівняння для перетворення Фур'є є у неперервній формі, яку ви побачите лише у математичних задачах. Дискретна форма цієї формули набагато ближча до того, що реалізується у коді:
.. math::
X_k = \sum_{n=0}^{N-1} x_n e^{-\frac{j2\pi}{N}kn}
@@ -146,7 +146,7 @@
Часо-частотні властивості
*************************
-Раніше ми розглянули приклади того, як сигнали з'являються в часовій і частотній областях. Зараз ми розглянемо п'ять важливих "властивостей Фур'є". Це властивості, які говорять нам, що якщо ми зробимо ____ з нашим сигналом у часовій області, то ____ станеться з нашим сигналом у частотній області. Це дасть нам важливе розуміння типу цифрової обробки сигналів (ЦОС), яку ми будемо виконувати з часовими сигналами на практиці.
+Вище ми розглянули приклади того, як сигнали представляються в часовій і частотній областях. Зараз ми розглянемо п'ять важливих "властивостей Фур'є". Це властивості вказують нам, що якщо ми зробимо ____ з нашим сигналом у часовій області, то ____ станеться з цим сигналом у частотній області. Це дасть нам важливе розуміння типів цифрової обробки сигналів (ЦОС), які ми будемо виконувати з сигналами у часовій області на практиці.
1. Властивість лінійності:
@@ -190,12 +190,12 @@
Ті, хто вже знайомий з цією властивістю, можуть помітити відсутність масштабного коефіцієнта; він не враховується заради простоти. Для практичних цілей це не має значення.
-4. Згортання у властивості часу:
+4. Згортка по часу:
.. math::
\int x(\tau) y(t-\tau) d\tau \leftrightarrow X(f)Y(f)
-Вона називається властивістю згортки, тому що у часовій області ми згортуємо x(t) та y(t). Можливо, ви ще не знаєте про операцію згортки, тому поки що уявіть її як крос-кореляцію, хоча ми зануримося у згортки глибше у :ref:`цьому розділі `. Коли ми згортуємо часові сигнали, це еквівалентно перемноженню частотних версій цих двох сигналів. Це дуже відрізняється від додавання двох сигналів. Коли ви додаєте два сигнали, як ми бачили, нічого насправді не відбувається, ви просто додаєте частотні версії. Але коли ви згортаєте два сигнали, ви ніби створюєте з них новий третій сигнал. Згортання - це найважливіша техніка в DSP, хоча для того, щоб повністю її зрозуміти, ми повинні спочатку зрозуміти, як працюють фільтри.
+Вона називається згорткою по часу, тому що у часовій області ми згортаємо x(t) та y(t). Можливо, ви ще не знаєте про операцію згортки, тому поки уявіть її як крос-кореляцію, адже ми зануримося у згортки глибше у :ref:`цьому розділі `. Коли ми згортаємо часові сигнали, це еквівалентно перемноженню частотних версій цих двох сигналів. Це дуже відрізняється від додавання двох сигналів. Коли ви додаєте два сигнали, як ми бачили, нічого насправді не відбувається, ви просто додаєте частотні версії. Але коли ви згортаєте два сигнали, ви ніби створюєте з них новий третій сигнал. Згортка - це найважливіша техніка в ЦОС, але для того, щоб повністю її зрозуміти, ми повинні спочатку зрозуміти, як працюють фільтри.
Перш ніж ми продовжимо, щоб коротко пояснити, чому ця властивість настільки важлива, розглянемо таку ситуацію: у вас є один сигнал, який ви хочете отримати, і поруч з ним є сигнал, що заважає.
@@ -203,13 +203,13 @@
:align: center
:target: ../_images/two-signals.svg
-Концепція маскування широко використовується у програмуванні, тому давайте використаємо її тут. Що, якби ми могли створити маску нижче і помножити її на сигнал вище, щоб замаскувати той, який нам не потрібен?
+Концепція маскування широко використовується у програмуванні, тому давайте використаємо її тут. Що, якби ми могли створити маску наведену на рисунку нижче і помножити її на сигнал наведений вище, щоб замаскувати той, який нам не потрібен?
.. image:: ../_images/masking.svg
:align: center
:target: ../_images/masking.svg
-Зазвичай ми виконуємо операції DSP у часовій області, тому давайте скористаємося властивістю згортки, щоб побачити, як ми можемо зробити це маскування у часовій області. Скажімо, що x(t) - це отриманий сигнал. Нехай Y(f) - це маска, яку ми хочемо застосувати у частотній області. Це означає, що y(t) є часовим представленням нашої маски, і якщо ми згорнемо її з x(t), ми зможемо "відфільтрувати" небажаний сигнал.
+Зазвичай ми виконуємо операції ЦОС у часовій області, тому давайте скористаємося властивістю згортки, щоб побачити, як ми можемо зробити це маскування у часовій області. Скажімо, що x(t) - це отриманий сигнал. Нехай Y(f) - це маска, яку ми хочемо застосувати у частотній області. Це означає, що y(t) є часовим представленням нашої маски, і якщо ми згорнемо її з x(t), ми зможемо "відфільтрувати" небажаний сигнал.
.. tikz:: [font=\Large\bfseries\sffamily]
\definecolor{babyblueeyes}{rgb}{0.36, 0.61, 0.83}
@@ -222,22 +222,22 @@
\draw[->,babyblueeyes,thick] (3,-4) -- (5.2,-2.8);
:xscale: 70
-Коли ми будемо обговорювати фільтрацію, властивість згортки матиме більше сенсу.
+Коли ми будемо обговорювати фільтрацію, згортки матимуть більше сенсу.
-5. Властивість згортки за частотою:
+5. Згортка по частоті:
-Насамкінець, я хочу зазначити, що властивість згортки працює у зворотному напрямку, хоча ми не будемо використовувати її так часто, як властивість згортки у часовій області:
+Насамкінець, я хочу зазначити, що властивість згортки працює і у зворотному напрямку, хоча ми не будемо використовувати її так часто, як властивість згортки у часовій області:
.. math::
x(t)y(t) \leftrightarrow \int X(g) Y(f-g) dg
-Існують і інші властивості, але наведені вище п'ять, на мою думку, є найбільш важливими для розуміння. Навіть якщо ми не довели кожну з них, суть в тому, що ми використовуємо математичні властивості, щоб зрозуміти, що відбувається з реальними сигналами при аналізі та обробці. Не зациклюйтеся на рівняннях. Переконайтеся, що ви розумієте опис кожної властивості.
+Існують і інші властивості, але наведені вище п'ять, на мою думку, є найбільш важливими для розуміння. Навіть якщо ми не довели кожну з них, суть в тому, що ми використовуємо математичні властивості, щоб розуміти, що відбувається з реальними сигналами при аналізі та обробці. Не зациклюйтеся на рівняннях. Переконайтеся, що ви розумієте опис кожної властивості.
*********************************
Швидке перетворення Фур'є (ШПФ)
*********************************
-Тепер повернемося до перетворення Фур'є. Я показав вам рівняння для дискретного перетворення Фур'є, але 99.9% часу ви будете використовувати під час кодування функцію ШПФ, fft(). Швидке перетворення Фур'є (ШПФ) - це просто алгоритм для обчислення дискретного перетворення Фур'є. Його було розроблено десятки років тому, і хоча існують різні варіанти реалізації, він все ще залишається лідером з обчислення дискретного перетворення Фур'є. Пощастило, враховуючи, що в його назві використано слово "Fast".
+Тепер повернемося до перетворення Фур'є. Я показав вам рівняння для дискретного перетворення Фур'є, але 99.9% часу ви будете використовувати під час кодування функцію ШПФ, fft(). Швидке перетворення Фур'є (ШПФ) - це просто алгоритм для обчислення дискретного перетворення Фур'є. Його було розроблено десятки років тому, і хоча існують різні варіанти реалізації, він все ще залишається лідером з обчислення дискретного перетворення Фур'є. Нам пощастило, що вони назвали його “швидким”.
ШПФ - це функція з одним входом і одним виходом. Вона перетворює сигнал з часу в частоту:
@@ -253,50 +253,74 @@
:target: ../_images/fft-io.svg
:alt: Еталонна діаграма для вхідного (секунди) та вихідного (смуга пропускання) формату функції ШПФ, що показує частотні біни та дельта-t і дельта-f
-Оскільки вихідні дані знаходяться в частотній області, діапазон осі х базується на частоті дискретизації, яку ми розглянемо в наступній главі. Коли ми використовуємо більше відліків для вхідного вектора, ми отримуємо кращу роздільну здатність у частотній області (на додаток до обробки більшої кількості відліків за один раз). Насправді ми не "бачимо" більше частот, маючи більший вхідний сигнал. Єдиний спосіб - збільшити частоту дискретизації (зменшити період дискретизації :math:`\Delta t`).
+Оскільки вихідні дані знаходяться в частотній області, значення діапазону по осі х залежить від частоти дискретизації, яку ми розглянемо в наступній главі. Коли ми використовуємо більше відліків для вхідного вектора, ми отримуємо кращу роздільну здатність у частотній області (як додаток до обробки більшої кількості відліків за один раз). Насправді ми не "бачимо" більше частот, маючи довший вхідний сигнал. Єдиний спосіб збільшити кількість частот - збільшити частоту дискретизації (зменшити період дискретизації :math:`\Delta t`).
-Як нам насправді побудувати цей вихід? Для прикладу припустимо, що наша частота дискретизації становить 1 мільйон відліків за секунду (1 МГц). Як ми дізнаємося з наступного розділу, це означає, що ми можемо бачити тільки сигнали з частотою до 0,5 МГц, незалежно від того, скільки відліків ми подаємо на ШПФ. Вихідні дані ШПФ можна представити наступним чином:
+Як нам насправді відобразити цей вихідний результат ШПФ? Для прикладу припустимо, що наша частота дискретизації становить 1 мільйон відліків за секунду (1 МГц). Як ми дізнаємося з наступного розділу, це означає, що ми можемо бачити тільки сигнали з частотою до 0,5 МГц, незалежно від того, скільки відліків ми подаємо на ШПФ. Вихідні дані ШПФ можна представити наступним чином:
.. image:: ../_images/negative-frequencies.svg
:align: center
:target: ../_images/negative-frequencies.svg
:alt: Введення від'ємних частот
-Це завжди так; на виході ШПФ завжди буде показано :math:`\text{-} f_s/2` до :math:`f_s/2`, де :math:`f_s` - частота дискретизації. Тобто на виході завжди буде від'ємна частина і додатна частина. Якщо вхідний сигнал комплексний, то від'ємна і додатна частини будуть відрізнятися, але якщо він дійсний, то вони будуть ідентичні.
+Це завжди так; на виході ШПФ завжди будуть значення від :math:`\text{-} f_s/2` до :math:`f_s/2`, де :math:`f_s` - частота дискретизації. Тобто на виході завжди буде від'ємна частина і додатна частина. Якщо вхідний сигнал комплексний, то від'ємна і додатна частини будуть відрізнятися, але якщо він дійсний, то вони будуть ідентичні.
-Щодо частотного інтервалу, то кожен бін відповідає :math:`f_s/N` Гц, тобто подача більшої кількості відліків на кожне ШПФ призведе до більш деталізованої роздільної здатності на виході. Дуже незначна деталь, яку можна проігнорувати, якщо ви новачок: математично останній індекс не відповідає *точно* :math:`f_s/2`, скоріше це :math:`f_s/2 - f_s/N`, що для великого :math:`N` буде приблизно дорівнювати :math:`f_s/2`.
+Щодо частотного інтервалу, то кожен відлік відповідає :math:`f_s/N` Гц, тобто подача більшої кількості відліків на кожне ШПФ призведе до більш деталізованої роздільної здатності на виході. Дуже незначна деталь, яку можна проігнорувати, якщо ви новачок: математично останній індекс не відповідає *точно* :math:`f_s/2`, скоріше це :math:`f_s/2 - f_s/N`, що для великого :math:`N` буде приблизно дорівнювати :math:`f_s/2`.
********************
Від'ємні частоти
********************
-Що таке від'ємна частота? Наразі просто знайте, що це пов'язано з використанням комплексних чисел (уявних чисел) - насправді не існує такого поняття, як "від'ємна частота", коли мова йде про передачу/прийом радіосигналів, це просто уявлення, яке ми використовуємо. Ось інтуїтивний спосіб подумати про це. Уявімо, що ми говоримо нашому SDR налаштуватися на 100 МГц (FM-діапазон) і робити вибірку на частоті 10 МГц. Іншими словами, ми будемо переглядати спектр від 95 МГц до 105 МГц. Можливо, там присутні три сигнали:
+Що таке від'ємна частота? Наразі просто вважайте, що це пов'язано з використанням комплексних чисел (уявних чисел) - насправді не існує такого поняття, як "від'ємна частота", коли мова йде про передачу/прийом радіосигналів, це просто представлення, яке ми використовуємо. Можно думати про це наступним чином. Уявімо, що ми говоримо нашому SDR налаштуватися на частоту 100 МГц (FM-діапазон) і робити оцифровку з частотою дискритизації 10 МГц. Іншими словами, ми будемо бачити спектр від 95 МГц до 105 МГц. Незхай в цьому діапазоні присутні три сигнали:
.. image:: ../_images/negative-frequencies2.svg
:align: center
:target: ../_images/negative-frequencies2.svg
-Тепер, коли SDR видає нам зразки, це буде виглядати так:
+І, коли SDR зробить ШПФ ми отримаємо на виході:
.. image:: ../_images/negative-frequencies3.svg
:align: center
:target: ../_images/negative-frequencies3.svg
:alt: Негативні частоти - це просто частоти нижче центральної (так званої несучої) частоти, на яку налаштовано радіоприймач
-Пам'ятайте, що ми налаштували SDR на 100 МГц. Отже, сигнал, який був на частоті близько 97,5 МГц, у цифровому вираженні виглядає як -2,5 МГц, що технічно є від'ємною частотою. Насправді це просто частота, нижча за центральну частоту. Це матиме більше сенсу, коли ми дізнаємося більше про дискретизацію і отримаємо досвід використання наших СПЗ.
+Пам'ятайте, що ми налаштували SDR на 100 МГц. Отже, сигнал, який був на частоті близько 97,5 МГц, у цифровому вираженні виглядає як -2,5 МГц, що технічно є від'ємною частотою. Насправді це просто частота, нижча за центральну частоту. Це матиме більше сенсу, коли ми дізнаємося більше про дискретизацію і отримаємо досвід використання наших SDR.
+
+З математичної точки зору, негативні частоти можна уявити наступним чином, розглянемо комплексну експоненціальну функцію :math:`e^{2j \pi f t}`. Якщо у нас від'ємна частота, то це еквівалентно тому, що в полярних координатах ця комплексна синусоїда обертається у протилежному напрямку.
+
+.. math::
+ e^{2j \pi f t} = \cos(2 \pi f t) + j \sin(2 \pi f t) \quad \mathrm{\textcolor{blue}{blue}}
+
+.. math::
+ e^{2j \pi (-f) t} = \cos(2 \pi f t) - j \sin(2 \pi f t) \quad \mathrm{\textcolor{red}{red}}
+
+.. image:: ../_images/negative_freq_animation.gif
+ :align: center
+ :scale: 75 %
+ :target: ../_images/negative_freq_animation.gif
+ :alt: Animation of a positive and negative frequency sinusoid on the complex plane
+
+Ми використали комплексну експоненту вище тому, що :math:`cos()` або :math:`sin()` містить як додатні, так і від'ємні частоти, як видно з формули Ейлера, застосованої до синусоїди на частоті :math:`f` з часом :math:`t`:
+
+.. math::
+ \cos(2 \pi f t) = \underbrace{\frac{1}{2} e^{2j \pi f t}}_\text{positive} + \underbrace{\frac{1}{2} e^{-2j \pi f t}}_\text{negative}
+
+.. math::
+ \sin(2 \pi f t) = \underbrace{\frac{1}{2j} e^{2j \pi f t}}_\text{positive} - \underbrace{\frac{1}{2j} e^{-2j \pi f t}}_\text{negative}
+
+Отже, в обробці радіочастотних сигналів ми зазвичай використовуємо комплексні експоненти замість косинусів і синусів.
*******************************
Порядок в часі не має значення
*******************************
-Остання властивість перед тим, як ми перейдемо до ШПФ. Функція ШПФ ніби "перемішує" вхідний сигнал, щоб сформувати вихідний, який має інший масштаб і одиниці виміру. Зрештою, ми більше не перебуваємо в часовій області. Хороший спосіб зрозуміти цю різницю між областями - усвідомити, що зміна порядку, в якому все відбувається в часовій області, не змінює частотні компоненти в сигналі. Тобто, ШПФ наступних двох сигналів матиме ті самі два піки, тому що сигнал - це просто дві синусоїди на різних частотах. Зміна порядку появи синусоїд не змінює того факту, що це дві синусоїди на різних частотах.
+Остання властивість перед тим, як ми перейдемо до ШПФ. Функція ШПФ ніби "перемішує" вхідний сигнал так, щоб сформувати вихідний сигнал, який має інший масштаб і одиниці виміру. Після чого, ми більше не перебуваємо в часовій області. Гарний спосіб усвідомити цю різницю між областями - це усвідомити, що зміна порядку подій у часовій області не змінює частотні компоненти сигналу. Тобто, виконання одного ШПФ для приведених нижче на рисунку двох сигналів матиме однакові два піки, оскільки сигнал - це просто дві синусоїди на різних частотах. Зміна порядку виникнення синусоїд не змінює того факту, що це дві синусоїди на різних частотах. Це передбачає, що обидві синусоїди виникають в один і той самий проміжок часу, що подається на ШПФ; якщо скоротити розмір ШПФ та виконати кілька ШПФ (як ми зробимо в розділі "Спектрограма"), то можна розрізнити ці дві синусоїди.
.. image:: ../_images/fft_signal_order.png
:scale: 50 %
:align: center
:alt: При виконанні ШПФ на наборі відліків порядок у часі, у якому різні частоти зустрічаються у цих відліках, не змінює результуючий результат ШПФ
-Технічно, фаза значень ШПФ зміниться через часовий зсув синусоїд. Однак у перших кількох розділах цього підручника нас цікавитиме здебільшого величина ШПФ.
+Технічно, фаза значень ШПФ зміниться через часовий зсув синусоїд. Однак у перших кількох розділах цього підручника нас цікавитиме здебільшого амплітудти ШПФ.
*******************
ШПФ у Python
@@ -304,7 +328,7 @@
Тепер, коли ми дізналися про те, що таке ШПФ і як представляється результат, давайте розглянемо код на Python і скористаємося функцією ШПФ Numpy, np.fft.fft(). Рекомендується використовувати повноцінну консоль/IDE Python на вашому комп'ютері, але в крайньому випадку ви можете скористатися веб-консоллю Python, посилання на яку знаходиться внизу навігаційної панелі зліва.
-Спочатку нам потрібно створити сигнал у часовій області. Не соромтеся скористатися власною консоллю Python. Для спрощення ми створимо просту синусоїду з частотою 0,15 Гц. Ми також будемо використовувати частоту дискретизації 1 Гц, тобто в часі ми будемо робити відліки через 0, 1, 2, 3 секунди і т.д.
+Спочатку нам потрібно створити сигнал у часовій області. Ви можете скористатися власною консоллю Python для відтворення прикладів. Для спрощення ми створимо просту синусоїду з частотою 0,15 Гц. Ми також будемо використовувати частоту дискретизації 1 Гц, тобто в часі ми будемо робити відліки через 0, 1, 2, 3 секунди і т.д.
.. code-block:: python
@@ -330,7 +354,7 @@
S = array([-0.01865008 +0.00000000e+00j, -0.01171553 -2.79073782e-01j,0.02526446 -8.82681208e-01j, 3.50536075 -4.71354150e+01j, -0.15045671 +1.31884375e+00j, -0.10769903 +7.10452463e-01j, -0. 09435855 +5.01303240e-01j, -0.08808671 +3.92187956e-01j, -0.08454414 +3.23828386e-01j, -0.08231753 +2.76337148e-01j, -0.08081535 +2.41078885e-01j, -0.07974909 +2.13663710e-01j,.
-Порада: незалежно від того, що ви робите, якщо ви коли-небудь зіткнетеся з комплексними числами, спробуйте обчислити амплітуду і фазу і подивіться, чи вони мають більше сенсу. Давайте так і зробимо, і побудуємо графік амплітуди і фази. У більшості мов для знаходження амплітуди комплексного числа є функція abs(). Функція для фази може бути різною, але у Python це :code:`np.angle()`.
+Порада: незалежно від того, що ви робите, якщо ви зіткнулись з комплексними числами, спробуйте обчислити амплітуду і фазу і подивіться, може це додасть більше розуміння. Давайте так і зробимо, і побудуємо графік амплітуди і фази. У більшості мов для знаходження амплітуди комплексного числа є функція abs(). Функція для фази може бути різною, але у Python це :code:`np.angle()`.
.. code block:: python
@@ -344,27 +368,27 @@
:scale: 80 %
:align: center
-Наразі ми не додаємо вісь x до графіків, а лише індекс масиву (рахуючи від 0). З математичних міркувань, вихідні дані ШПФ мають наступний формат:
+Наразі ми не додаємо розмірності до вісі x для графіків, це лише індекс масиву (що рахується від 0). З математичних міркувань, вихідні дані після ШПФ мають наступний формат:
.. image:: ../_images/fft-python3.svg
:align: center
:target: ../_images/fft-python3.svg
:alt: Організація виводу ШПФ перед виконанням зсуву ШПФ
-Але ми хочемо мати 0 Гц (постійний струм) в центрі і від'ємні частоти зліва (це просто те, як ми любимо візуалізувати речі). Отже, кожного разу, коли ми робимо ШПФ, нам потрібно виконати "зсув ШПФ", який є простою операцією перегрупування масиву, на кшталт кругового зсуву, але більше схожого на "покладіть це сюди, а це туди". На наведеній нижче схемі повністю описано, що робить операція зсуву ШПФ:
+Але ми хотіли б мати 0 Гц (постійний струм) в центрі і від'ємні частоти зліва (це те як зазвичай ми представляємо графіки). Отже, кожного разу, коли ми робимо ШПФ, нам потрібно виконати "зсув ШПФ", який є простою операцією перегрупування масиву, на кшталт кільцевого зсуву, але більше схожого на "покладіть це сюди, а це туди". На наведеній нижче схемі повністю описано, що робить операція зсуву ШПФ:
.. image:: ../_images/fft-python4.svg
:align: center
:target: ../_images/fft-python4.svg
:alt: Еталонна діаграма функції зсуву ШПФ, що показує додатні та від'ємні частоти та постійний струм
-Для нашої зручності у Numpy є функція зсуву ШПФ, :code:`np.fft.fftshift()`. Замініть рядок np.fft.fft() на:
+Для зручності у Numpy є функція зсуву ШПФ, :code:`np.fft.fftshift()`. Замініть рядок np.fft.fft() на:
.. code-block:: python
S = np.fft.fftshift(np.fft.fft(s))
-Нам також потрібно розібратися зі значеннями/мітками по осі x. Пам'ятайте, що ми використовували частоту дискретизації 1 Гц для спрощення. Це означає, що лівий край графіка частотної області буде -0,5 Гц, а правий - 0,5 Гц. Якщо це незрозуміло, то стане зрозуміло після того, як ви прочитаєте розділ :ref:`sampling-chapter`. Давайте дотримуватися цього припущення, що наша частота дискретизації становить 1 Гц, і побудуємо графік амплітуди і фази вихідного сигналу ШПФ з відповідною міткою на осі абсцис. Ось остаточна версія цього прикладу на Python і результат:
+Нам також потрібно розібратися зі значеннями/мітками по осі x. Пам'ятайте, що ми використовували частоту дискретизації 1 Гц для спрощення. Це означає, що лівий край графіка частотної області буде -0,5 Гц, а правий - 0,5 Гц. Якщо що це поки незрозуміло, то стане зрозуміло після того, як ви прочитаєте розділ :ref:`sampling-chapter`. Давайте дотримуватися цього припущення, що наша частота дискретизації становить 1 Гц, і побудуємо графік амплітуди і фази вихідного сигналу ШПФ з відповідною міткою на осі абсцис. Ось остаточна версія цього прикладу на Python і результат:
.. code-block:: python
diff --git a/content-ukraine/intro.rst b/content-ukraine/intro.rst
index 42cb67b7..b5a2a593 100644
--- a/content-ukraine/intro.rst
+++ b/content-ukraine/intro.rst
@@ -88,5 +88,6 @@ textbook `_ за `переклад PySDR українською `_
- `Yimin Zhao `_ за `переклад PySDR спрощеною китайською `_
- `Eduardo Chancay `_ за `переклад PySDR іспанською `_
+- John Marcovici
А також усім прихильникам `PySDR Patreon `_!
diff --git a/content-ukraine/phaser.rst b/content-ukraine/phaser.rst
index 9ca03251..dda0ac07 100644
--- a/content-ukraine/phaser.rst
+++ b/content-ukraine/phaser.rst
@@ -23,9 +23,9 @@
Phaser - це одна плата, що містить фазовану антенну решітку та низку інших компонентів, до якої з одного боку підключено Raspberry Pi, а з іншого боку - Pluto. Високорівнева блок-схема показана нижче. Деякі моменти, на які слід звернути увагу:
1. Хоча це виглядає як 32-елементний двовимірний масив, насправді це 8-елементний одновимірний масив
-2. Використовуються обидва канали прийому на Плутоні (другий канал використовує роз'єм u.FL)
-3. LO на борту використовується для перетворення прийнятого сигналу з частоти близько 10,25 ГГц до частоти близько 2 ГГц, щоб Плутон міг його прийняти
-4. Кожен ADAR1000 має чотири фазообертачі з регульованим коефіцієнтом підсилення, і всі чотири канали підсумовуються перед відправкою на Плутон
+2. Використовуються обидва канали прийому на Pluto (другий канал використовує роз'єм u.FL)
+3. LO на борту використовується для перетворення прийнятого сигналу з частоти близько 10,25 ГГц до частоти близько 2 ГГц, щоб Pluto міг його прийняти
+4. Кожен ADAR1000 має чотири фазообертачі з регульованим коефіцієнтом підсилення, і всі чотири канали підсумовуються перед відправкою на Pluto
5. Фазообертач по суті містить два "підмасиви", кожен з яких містить чотири канали
6. Нижче не показані GPIO і послідовні сигнали від Raspberry Pi, які використовуються для керування різними компонентами фазообертача
@@ -35,7 +35,7 @@ Phaser - це одна плата, що містить фазовану анте
:align: center
:alt: Компоненти фазера (CN0566), включаючи ADF4159, LTC5548, ADAR1000
-Наразі проігноруємо передавальну частину фазоінвертора, оскільки в цій главі ми використовуватимемо пристрій HB100 лише як тестовий передавач. ADF4159 - це синтезатор частоти, який виробляє тон з частотою до 13 ГГц, який ми називаємо локальним генератором або LO. Цей ЛО подається на мікшер LTC5548, який може здійснювати як висхідне, так і низхідне перетворення, хоча ми використовуватимемо його для низхідного перетворення. Для низхідного перетворення він приймає сигнал LO, а також сигнал в діапазоні від 2 до 14 ГГц, і перемножує їх разом, що призводить до зсуву частоти. Результуючий сигнал може бути в діапазоні від постійного струму до 6 ГГц, хоча ми націлені на частоту близько 2 ГГц. ADAR1000 - це 4-канальний аналоговий формувач променя, тому Фазер використовує два з них. Аналоговий формувач променя має незалежно регульовані фазові перемикачі і коефіцієнт підсилення для кожного каналу, що дозволяє затримувати в часі і послаблювати кожен канал перед підсумовуванням в аналоговому діапазоні (в результаті чого виходить один канал). На фазообертачі кожен ADAR1000 виводить сигнал, який перетворюється вниз, а потім приймається Плутоном. Використовуючи Raspberry Pi, ми можемо контролювати фазу і посилення всіх восьми каналів в реальному часі, щоб виконувати формування променя. У нас також є можливість виконувати двоканальне цифрове формування променя/обробку масивів, що обговорюється в наступному розділі.
+Наразі проігноруємо передавальну частину фазоінвертора, оскільки в цій главі ми використовуватимемо пристрій HB100 лише як тестовий передавач. ADF4159 - це синтезатор частоти, який виробляє тон з частотою до 13 ГГц, який ми називаємо локальним генератором або LO. Цей ЛО подається на мікшер LTC5548, який може здійснювати як висхідне, так і низхідне перетворення, хоча ми використовуватимемо його для низхідного перетворення. Для низхідного перетворення він приймає сигнал LO, а також сигнал в діапазоні від 2 до 14 ГГц, і перемножує їх разом, що призводить до зсуву частоти. Результуючий сигнал може бути в діапазоні від постійного струму до 6 ГГц, хоча ми націлені на частоту близько 2 ГГц. ADAR1000 - це 4-канальний аналоговий формувач променя, тому Фазер використовує два з них. Аналоговий формувач променя має незалежно регульовані фазові перемикачі і коефіцієнт підсилення для кожного каналу, що дозволяє затримувати в часі і послаблювати кожен канал перед підсумовуванням в аналоговому діапазоні (в результаті чого виходить один канал). На фазообертачі кожен ADAR1000 виводить сигнал, який перетворюється вниз, а потім приймається Pluto. Використовуючи Raspberry Pi, ми можемо контролювати фазу і посилення всіх восьми каналів в реальному часі, щоб виконувати формування променя. У нас також є можливість виконувати двоканальне цифрове формування променя/обробку масивів, що описано в наступному розділі.
Для тих, хто цікавиться, нижче наведено дещо детальнішу блок-схему.
@@ -62,7 +62,7 @@ Phaser - це одна плата, що містить фазовану анте
Встановлення програмного забезпечення
***************************************
-Після завантаження в Raspberry Pi за допомогою образу попередньої збірки, використовуючи стандартний користувач/пароль аналог/аналог, рекомендується виконати наступні кроки:
+Після завантаження в Raspberry Pi за допомогою образу попередньої збірки, використовуючи стандартний користувач/пароль analog/analog, рекомендується виконати наступні кроки:
.. code-block:: bash
@@ -86,14 +86,14 @@ Phaser - це одна плата, що містить фазовану анте
HB100, що постачається з Phaser, - це недорогий доплерівський радарний модуль, який ми будемо використовувати як тестовий передавач, оскільки він передає безперервний тон на частоті близько 10 ГГц. Він працює від 2 батарейок типу АА або від настільного джерела живлення 3 В, і коли він увімкнений, на ньому світиться яскравий червоний світлодіод.
-Оскільки HB100 є недорогим і використовує дешеві радіочастотні компоненти, його частота передачі варіюється від одиниці до одиниці, понад сотні МГц, що є діапазоном, який перевищує найвищу пропускну здатність, яку ми можемо отримати, використовуючи Плутон (56 МГц). Тому, щоб переконатися, що ми налаштували наш Pluto і понижуючий перетворювач таким чином, щоб завжди отримувати сигнал HB100, ми повинні визначити частоту передачі HB100. Це робиться за допомогою прикладної програми від Analog Devices, яка виконує розгортку частоти і обчислює ШПФ, шукаючи пік. Переконайтеся, що ваш HB100 увімкнений і знаходиться в безпосередній близькості від Phaser, а потім запустіть утиліту з..:
+Оскільки HB100 є недорогим і використовує дешеві радіочастотні компоненти, його частота передачі варіюється від зразка до зразка, на понад сотні МГц, такий розкид по частоті перевищує діапазон найвищої пропускну здатність, яку можно отримати від Pluto (56 МГц). Тому, щоб переконатися, що ми налаштували наш Pluto і понижуючий перетворювач таким чином, щоб завжди отримувати сигнал HB100, ми повинні визначити частоту передачі HB100. Це робиться за допомогою прикладної програми від Analog Devices, яка виконує розгортку частоти і обчислює ШПФ, шукаючи пік. Переконайтеся, що ваш HB100 увімкнений і знаходиться в безпосередній близькості від Phaser, а потім запустіть утиліту з..:
.. code-block:: bash
cd ~/pyadi-iio/examples/phaser
python phaser_find_hb100.py
-Він повинен створити файл з назвою hb100_freq_val.pkl у тій самій директорії. Цей файл містить частоту передачі HB100 в Гц (мариновану, тому її не можна переглянути у відкритому вигляді), яку ми будемо використовувати на наступному кроці.
+Він повинен створити файл з назвою hb100_freq_val.pkl у тій самій директорії. Цей файл містить частоту передачі HB100 в Гц (у двійковому формфті, тому її не можна переглянути у відкритому вигляді). Цю частоту ми будемо використовувати на наступному кроці.
************************
Калібрування
@@ -190,16 +190,16 @@ Phaser на Python
sdr.rx_hardwaregain_chan0 = 10 # дБ, 0 - найнижчий коефіцієнт підсилення. HB100 досить гучний
sdr.rx_hardwaregain_chan1 = 10 # dB
- sdr.rx_lo = int(2.2e9) # Плутон налаштується на цю частоту
+ sdr.rx_lo = int(2.2e9) # Pluto налаштується на цю частоту
# Налаштуйте PLL фазоінвертора (ADF4159 на борту) на пониження частоти HB100 до 2.2 ГГц плюс невеликий зсув
offset = 1000000 # додаємо невелике довільне зміщення, щоб ми не були прямо на 0 Гц, де є стрибок постійного струму
phaser.lo = int(signal_freq + sdr.rx_lo - offset)
-Отримання семплів з Плутона
+Отримання семплів з Plutoа
################################
-На цьому етапі фазер і Плутон налаштовані і готові до роботи. Тепер ми можемо почати отримувати дані з Плутона. Давайте візьмемо один пакет з 1024 відліків, а потім зробимо ШПФ кожного з двох каналів.
+На цьому етапі фазер і Pluto налаштовані і готові до роботи. Тепер ми можемо почати отримувати дані з Plutoа. Давайте візьмемо один пакет з 1024 відліків, а потім зробимо ШПФ кожного з двох каналів.
.. code-block:: python