2. Частотний домен

Ця глава знайомить з частотною областю і охоплює ряди Фур’є, перетворення Фур’є, властивості Фур’є, ШПФ, вікна і спектрограми, використовуючи приклади з Python.

Одним з найцікавіших побічних ефектів вивчення DSP і бездротового зв’язку є те, що ви також навчитеся мислити в частотній області. Досвід більшості людей з “роботою” в частотній області обмежується регулюванням ручок низьких/середніх/високих частот в автомобільній аудіосистемі. Досвід більшості людей з “переглядом” чогось в частотній області обмежується переглядом звукового еквалайзера, як у цьому кліпі:

../_images/audio_equalizer.webp

Наприкінці цього розділу ви зрозумієте, що насправді означає частотна область, як перетворювати час і частоту (а також що при цьому відбувається), і деякі цікаві принципи, які ми будемо використовувати під час вивчення DSP і SDR. До кінця цього підручника ви станете майстром у роботі з частотною областю, гарантовано!

По-перше, чому нам подобається розглядати сигнали в частотній області? Ось два приклади сигналів, показаних як в часовій, так і в частотній області.

Два сигнали в часовій області можуть виглядати як шум, але в частотній області ми бачимо додаткові особливості

Як ви можете бачити, в часовій області обидва сигнали виглядають як шум, але в частотній області ми бачимо різні особливості. Все знаходиться в часовій області в своїй природній формі; коли ми робимо вибірки сигналів, ми будемо робити їх в часовій області, тому що ви не можете безпосередньо зробити вибірку сигналу в частотній області. Але найцікавіші речі зазвичай відбуваються саме в частотній області.

Ряди Фур’є

Основи частотної області починаються з розуміння того, що будь-який сигнал може бути представлений синусоїдальними хвилями, складеними разом. Коли ми розкладаємо сигнал на складові синусоїди, ми називаємо це рядом Фур’є. Ось приклад сигналу, який складається лише з двох синусоїд:

Простий приклад того, як сигнал може складатися з декількох синусоїд, демонструючи ряд Фур'є

Ось ще один приклад: червона крива нижче апроксимує пилкоподібну хвилю шляхом підсумовування 10 синусоїд. Ми бачимо, що це не ідеальна реконструкція - для відтворення цієї пилкоподібної хвилі знадобилася б нескінченна кількість синусоїд через різкі переходи:

Анімація розкладання у ряд Фур'є трикутної хвилі (так званої пилкоподібної)

Деякі сигнали вимагають більше синусоїд, ніж інші, а деякі вимагають нескінченної кількості, хоча їх завжди можна апроксимувати обмеженою кількістю. Ось ще один приклад розбиття сигналу на серію синусоїд:

Анімація розкладання в ряд Фур'є довільної функції, що складається з прямокутних імпульсів

Щоб зрозуміти, як можна розкласти сигнал на синусоїди, або синусоїди, нам потрібно спочатку розглянути три атрибути синусоїди:

  1. Амплітуда

  2. Частота

  3. Фаза

Амплітуда вказує на “силу” хвилі, тоді як частота - це кількість хвиль в секунду. Фаза використовується для представлення того, як синусоїда зсунута у часі, в межах від 0 до 360 градусів (або від 0 до 2\pi), але вона повинна бути відносно чогось, щоб мати якесь значення, наприклад, два сигнали з однаковою частотою можуть бути на 30 градусів у протифазі один з одним.

Еталонна діаграма амплітуди, фази та частоти синусоїди (так званої синусоїди)

На цьому етапі ви, можливо, зрозуміли, що “сигнал” - це, по суті, просто функція, зазвичай представлена “в часі” (тобто на осі х). Іншим атрибутом, який легко запам’ятати, є період, який є оберненою величиною до частоти. Період синусоїди - це кількість часу в секундах, за який хвиля завершує один цикл. Таким чином, одиницею частоти є 1/секунда, або Гц.

Коли ми розкладаємо сигнал на суму синусоїд, кожна з них матиме певну амплітуду, фазу і частоту. Амплітуда кожної синусоїди покаже нам, наскільки сильна частота існувала у вихідному сигналі. Не хвилюйтеся надто про фазу поки що, окрім усвідомлення того, що єдина різниця між sin() і cos() - це фазовий зсув (часовий зсув).

Важливіше зрозуміти концепцію, що лежить в основі, ніж самі рівняння, які потрібно розв’язати для ряду Фур’є, але для тих, хто цікавиться рівняннями, я відсилаю вас до стислого пояснення Вольфрама: https://mathworld.wolfram.com/FourierSeries.html.

Часово-частотні пари

Ми з’ясували, що сигнали можуть бути представлені у вигляді синусоїд, які мають декілька атрибутів. Тепер давайте навчимося будувати графіки сигналів у частотній області. У той час як часова область демонструє, як сигнал змінюється з часом, частотна область показує, яка частина сигналу лежить на яких частотах. Замість осі абсцис - час, ми будемо відкладати частоту. Ми можемо побудувати графік заданого сигналу як в часі, так і в частоті. Для початку розглянемо кілька простих прикладів.

Ось як виглядає синусоїда з частотою f в часовій і частотній області:

Часо-частотна пара Фур'є синусоїди, яка є імпульсом у частотній області

Часова область має виглядати дуже знайомо. Це коливальна функція. Не турбуйтеся про те, в якій точці циклу вона починається або як довго триває. Суть в тому, що сигнал має єдину частоту, тому ми бачимо один пік в частотній області. На якій би частоті не коливалася ця синусоїда, ми побачимо пік у частотній області. Математична назва такого піку називається “імпульс”.

А що, якби ми мали імпульс у часовій області? Уявіть собі звукозапис того, як хтось плескає в долоні або б’є молотком по цвяху. Ця пара час-частота трохи менш інтуїтивно зрозуміла.

Часово-частотна Фур'є-пара імпульсу в часовій області, яка є горизонтальною лінією (всі частоти) в частотній області

Як ми бачимо, пік/імпульс у часовій області є пласким у частотній області, і теоретично він містить кожну частоту. Теоретично ідеального імпульсу не існує, оскільки він мав би бути нескінченно коротким у часовій області. Як і у випадку з синусоїдою, не має значення, де в часовій області відбувається імпульс. Важливим висновком тут є те, що швидкі зміни в часовій області призводять до виникнення багатьох частот.

Далі давайте подивимося на часові та частотні діаграми прямокутної хвилі:

Часово-частотна пара Фур'є квадратної хвилі, яка є синусоїдою (функцією sin(x)/x) у частотній області

Цей графік також менш інтуїтивно зрозумілий, але ми бачимо, що в частотній області є сильний пік, який знаходиться на частоті прямокутної хвилі, але з підвищенням частоти піків стає більше. Це пов’язано зі швидкою зміною часової області, як і в попередньому прикладі. Але частота не рівномірна. Вона має піки через певні проміжки часу, і рівень повільно спадає (хоча це буде тривати вічно). Прямокутна хвиля в часовій області має вигляд sin(x)/x в частотній області (так звана синусоїдальна функція).

А що, якщо у нас є постійний сигнал у часовій області? Постійний сигнал не має “частоти”. Давайте подивимося:

Часово-частотна пара Фур'є сигналу постійного струму, який є імпульсом з частотою 0 Гц у частотній області

Оскільки частота відсутня, у частотній області ми маємо стрибок на частоті 0 Гц. Це має сенс, якщо ви подумаєте про це. Частотна область не буде “порожньою”, тому що це трапляється лише тоді, коли немає сигналу (тобто, часової області 0). Ми називаємо 0 Гц у частотній області “постійним струмом”, тому що він викликаний сигналом постійного струму в часі (постійним сигналом, який не змінюється). Зауважте, що якщо ми збільшимо амплітуду нашого постійного сигналу в часовій області, стрибок на 0 Гц в частотній області також збільшиться.

Пізніше ми дізнаємося, що саме означає вісь y на графіку в частотній області, але поки що ви можете думати про неї як про своєрідну амплітуду, яка показує, яка частина цієї частоти була присутня в сигналі в часовій області.

Перетворення Фур’є

Математично “перетворення”, яке ми використовуємо для переходу з часової області в частотну і назад, називається перетворенням Фур’є. Воно визначається наступним чином:

X(f) = \int x(t) e^{-j2\pi ft} dt

Для сигналу x(t) ми можемо отримати частотну версію X(f), використовуючи цю формулу. Ми будемо позначати часову версію функції через x(t) або y(t), а відповідну частотну версію через X(f) та Y(f). Зверніть увагу, що “t” означає час, а “f” - частоту. “j” - це просто уявна одиниця. Ви могли бачити її як “i” на уроках математики в середній школі. Ми використовуємо “j” в інженерії та комп’ютерних науках, тому що “i” часто позначає струм, а в програмуванні часто використовується як ітератор.

Повернення до часової області з частоти відбувається майже так само, за винятком масштабного коефіцієнта та від’ємного знаку:

x(t) = \frac{1}{2 \pi} \int X(f) e^{j2\pi ft} df

Зверніть увагу, що у багатьох підручниках та інших джерелах замість w використовується 2\pi f. w - кутова частота у радіанах за секунду, тоді як f - у Гц. Все, що вам потрібно знати, це те, що

\omega = 2 \pi f

Хоча це додає член 2 \pi до багатьох рівнянь, простіше дотримуватися частоти у Гц. Зрештою, ви будете працювати з Гц у вашій SDR програмі.

Наведене вище рівняння для перетворення Фур’є є неперервною формою, яку ви побачите лише у математичних задачах. Дискретна форма набагато ближча до того, що реалізовано у коді:

X_k = \sum_{n=0}^{N-1} x_n e^{-\frac{j2\pi}{N}kn}

Зауважте, що основна відмінність полягає у тому, що ми замінили інтеграл на суму. Індекс k змінюється від 0 до N-1.

Нічого страшного, якщо жодне з цих рівнянь не має для вас особливого значення. Насправді нам не потрібно використовувати їх безпосередньо, щоб робити круті речі з DSP і SDR!

Часо-частотні властивості

Раніше ми розглянули приклади того, як сигнали з’являються в часовій і частотній областях. Зараз ми розглянемо п’ять важливих “властивостей Фур’є”. Це властивості, які говорять нам, що якщо ми зробимо ____ з нашим сигналом у часовій області, то ____ станеться з нашим сигналом у частотній області. Це дасть нам важливе розуміння типу цифрової обробки сигналів (ЦОС), яку ми будемо виконувати з часовими сигналами на практиці.

  1. Властивість лінійності:

a x(t) + b y(t) \leftrightarrow a X(f) + b Y(f)

Ця властивість, мабуть, найпростіша для розуміння. Якщо ми додаємо два сигнали в часі, то частотна версія також буде двома частотними сигналами, доданими разом. Вона також говорить нам, що якщо ми помножимо будь-який з них на коефіцієнт масштабування, частотна область також масштабуватиметься на ту саму величину. Корисність цієї властивості стане більш очевидною, коли ми додамо разом кілька сигналів.

  1. Властивість зсуву частоти:

e^{2 \pi j f_0 t}x(t) \leftrightarrow X(f-f_0)

Член зліва від x(t) - це те, що ми називаємо “комплексною синусоїдою” або “комплексною експонентою”. Наразі, все, що нам потрібно знати, це те, що по суті це просто синусоїда з частотою f_0. Ця властивість говорить нам, що якщо ми візьмемо сигнал x(t) і помножимо його на синусоїду, то у частотній області ми отримаємо X(f), тільки зсунутий на певну частоту, f_0. Цей зсув частоти може бути легше візуалізувати:

Зображення частотного зсуву сигналу у частотній області

Зсув частоти є невід’ємною властивістю ЦОС, оскільки з багатьох причин нам може знадобитися зсув сигналів вгору або вниз по частоті. Ця властивість показує нам, як це зробити (помножити на синусоїду). Ось ще один спосіб візуалізувати цю властивість:

Візуалізація зсуву частоти шляхом множення на синусоїду або синусоїду
  1. Масштабування у властивості Time:

x(at) \leftrightarrow X\left(\frac{f}{a}\right)

У лівій частині рівняння ми бачимо, що ми масштабуємо наш сигнал x(t) у часовій області. Ось приклад масштабування сигналу в часі, а потім те, що відбувається з частотними версіями кожного з них.

Зображення властивості часового масштабування перетворення Фур'є як у часовій, так і у частотній області

Масштабування в часі, по суті, стискає або розширює сигнал по осі x. Ця властивість говорить нам про те, що масштабування в часовій області спричиняє зворотне масштабування в частотній області. Наприклад, коли ми передаємо біти швидше, ми повинні використовувати більшу пропускну здатність. Ця властивість допомагає пояснити, чому сигнали з вищою швидкістю передачі даних займають більшу смугу пропускання/спектр. Якби масштабування час-частота було пропорційним, а не обернено пропорційним, оператори стільникового зв’язку могли б передавати стільки біт в секунду, скільки вони хочуть, не платячи мільярди за спектр! На жаль, це не так.

Ті, хто вже знайомий з цією властивістю, можуть помітити відсутність масштабного коефіцієнта; він не враховується заради простоти. Для практичних цілей це не має значення.

  1. Згортання у властивості часу:

\int x(\tau) y(t-\tau) d\tau \leftrightarrow X(f)Y(f)

Вона називається властивістю згортки, тому що у часовій області ми згортуємо x(t) та y(t). Можливо, ви ще не знаєте про операцію згортки, тому поки що уявіть її як крос-кореляцію, хоча ми зануримося у згортки глибше у цьому розділі. Коли ми згортуємо часові сигнали, це еквівалентно перемноженню частотних версій цих двох сигналів. Це дуже відрізняється від додавання двох сигналів. Коли ви додаєте два сигнали, як ми бачили, нічого насправді не відбувається, ви просто додаєте частотні версії. Але коли ви згортаєте два сигнали, ви ніби створюєте з них новий третій сигнал. Згортання - це найважливіша техніка в DSP, хоча для того, щоб повністю її зрозуміти, ми повинні спочатку зрозуміти, як працюють фільтри.

Перш ніж ми продовжимо, щоб коротко пояснити, чому ця властивість настільки важлива, розглянемо таку ситуацію: у вас є один сигнал, який ви хочете отримати, і поруч з ним є сигнал, що заважає.

../_images/two-signals.svg

Концепція маскування широко використовується у програмуванні, тому давайте використаємо її тут. Що, якби ми могли створити маску нижче і помножити її на сигнал вище, щоб замаскувати той, який нам не потрібен?

../_images/masking.svg

Зазвичай ми виконуємо операції DSP у часовій області, тому давайте скористаємося властивістю згортки, щоб побачити, як ми можемо зробити це маскування у часовій області. Скажімо, що x(t) - це отриманий сигнал. Нехай Y(f) - це маска, яку ми хочемо застосувати у частотній області. Це означає, що y(t) є часовим представленням нашої маски, і якщо ми згорнемо її з x(t), ми зможемо “відфільтрувати” небажаний сигнал.