Математика на пальцях: давайте порахуємо хоча б один ряд Фур'є в розумі

чи Потрібно читати цей текст?
Давайте перевіримо. Прочитайте наступне:

Тригонометричним рядом Фур'є функції  називають функціональний ряд виду



де







Страшно, але все ж хочеться зрозуміти, що це значить?
Значить, вам під кат. Постараюся формул не використовувати.

Мотивація
На моє глибоке переконання, до математики можна підходити на двох рівнях: більшість людей її бачить (їм її саме так і викладають) як набір значків і правил операцій над значками, що призводить до широким масам людей, математикою травмованих. А можна спробувати передати зміст і ідеї, не особливо заостряясь на значках. Особисто я нездатний до синтаксичному підходу, я в ланцюзі з двох формул обов'язково втрачу який-небудь мінус, що не заважає мені досить успішно вважатися математиком. Просто у мене в голові графічний прискорювач.

Я вже наводив цитату Фейнмана про те, як саме він читав усі рівняння, що йому доводилося:

Actually, there was a certain amount of genuine quality to my guesses. I had a scheme, which I still use today when somebody is explaining
something that i'm trying to understand: I keep making up examples. For instance, the mathematicians would come in with a terrific theorem, and they're all excited. As they're telling me the conditions of the theorem, I construct something which fits all the conditions. You know, you have a set (one ball) — disjoint (two balls). Then the balls turn colors, grow hairs, or whatever, in my head as they put more conditions on. Finally they state the theorem, which is some dumb thing about the ball which isn't true for my hairy green ball thing, so I say, «False!»


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

Його доповідь названо «Du rôle de l intuition et de logique en mathématiques», французькою можна прочитати тут, англійський переклад доступний тут. Вкрай рекомендую цікавляться математикою, читається на одному диханні.

На жаль, передавати інтуїцію дуже складно, але я спробую, так як вигода від переданої інтуїції незрівнянно вище від вигоди передачі просто значків.

На що я спираюся в цьому тексті
Насамперед потрібно знати, що таке вектор, хоча б на рівні «стрілочка». Ну і уявляти, що стрілочки можна малювати в значно більшій кількості вимірів, ніж 2 або 3. Ну і що вектор можна зберігати в std::vector.

Потім центральним поняттям є скалярний твір.

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

Ліричний відступ
Це не просто лірика, це приклад, який на перший погляд не пов'язаний з темою розмови, але насправді є його суттю. Хочете розуміти далі — розумійте приклад. Що неясно, задавайте питання.

Давайте на хвилину розглянемо вкрай практичну задачу: у мене є неспішний робот, і він повинен знати, де він знаходиться. Система навігації повинна бути пасивною. Я люблю вкрай дубові рішення, тому я ставлю на мого робота два мікрофона (як вуха у людини). Потім у мене є маяк (насправді дещо, але давайте про один), який програє в циклі деякий (моно) звук. Наприклад, ось такий:



Це просто сухе клацання, припустимо для простоти один клацання в секунду.

«Вуха» робота знаходяться на різній відстані від маяка, а звук поширюється неспішно, тому кожен з двох мікрофонів запише плюс-мінус один і той же сигнал, але з невеликою затримкою один щодо іншого. Я не шукаю легких шляхів, тому у мене не лабораторні умови. Ось, наприклад, як виглядає запис протягом декількох секунд:



Два канали по кількості вух, високий рівень шуму (грає музика). На записі видно регулярні сплески сухих клацань, але безпосередньо шукати їх в сигналі вкрай непросто, іноді музика буває навіть голосніше клацань.
Як мені прибрати фоновий шум? Нагадую, робот у мене зовсім неспішний. Самий дубовий спосіб — це записати годину звуку, потім порізати його на 3600 шматків в одну секунду довжиною (у мене одне клацання в секунду), і взяти середнє між усіма цими шматочками запису.

Вийде щось ось таке:



Піки клацань припадають в кожному з 3600 шматків на одне і те ж місце, а інший шум розмазаний більш-менш рівномірно по всій довжині, в результаті шум йде. До слова сказати, маяків у мене кілька, ніякої синхронізації між ними немає, а вух тільки два. І саме так я і поділяю сигнали з маяків: один маяк клацає разів три рази в секунду, інший п'ять, третій сім. (Дуже важливо) Порізавши один і той же сигнал на шматочки у 1/3, 1/5 або в 1/7 секунди, я отримаю сигнал саме з потрібного маяка!

Отже, тепер мені потрібно зрозуміти, як один сигнал зрушений щодо іншого. Мені абсолютно все одно, в якому саме місці записи у мене пік, мені потрібен зсув одного каналу щодо іншого.

Для початку давайте зрозуміємо, як я взагалі уявляю цей сигнал в пам'яті машини. Я пишу звичайний wav з частотою дискретизації 44100Гц. Довжина запису одна секунда, таким чином, у мене є просто два масиви (вектори!) речовинних чисел зі 44100 елементами.
Фіксуємо один вектор, а другий 44100 разів циклічно зрушимо вправо. (Дуже важливо) Порахуємо 44100 скалярних твори і візьмемо той зсув, при якому це скалярний произвдение максимально. Тобто, саме цей зсув максимізує схожість двох сигналів. Вітаю вас, ви тільки що порахували взаимнокорреляционную функцію!

А тепер давайте рахувати ряд Фур'є в розумі
Попередня секція дуже важлива, але поки давайте відкладемо її і спробуємо порахувати на пальцях простий ряд Фур'є.

В якості прикладу давайте візьмемо простий квадратний сигнал, так улюблений в електроніці. Графіки я малюю sage.

def square_wave(t): return (sgn(sin(t))+1)/2
t = var('t')
plot(square_wave(t), (t, -10*pi, 10*pi),figsize=(10,2))




Це простий періодичний сигнал з періодом 2 pi. Половину часу він дорівнює нулю, половину часу дорівнює одиниці. Давайте вважати коефіцієнти ряду Фур'є (див. початок статті).

Нульова частота
Коефіцієнт a0 — це просто середнє сигналу, очевидно, що він дорівнює половині. Як рахувати a1 і b1?

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

parametric_plot((cos(t)*square_wave(t), sin(t)*square_wave(t)), (t, 0, 2*pi))




Чому в полярній системі? Дуже просто. Як перетворюються полярні координати точки (r,alpha) в декартові?
x = r cos(alpha),
y = r sin(alpha).
А що у нас стоїть під знаком інтегралу у формулах для a1 і b1? Правильно, f sin(t) і f cos(t). Залишилося проінтегрувати. Як це зробити в розумі? Уявіть, що у вас це не математичний графік, а відрізок дроту. Давайте знайдемо його центр ваги. Очевидно, що він буде лежати на осі ординат приблизно в центрі нашої дуги (насправді, на відстані 2/pi від центру, ну та це не суть, давайте назвемо це відстань A):



Координати червоної точки (центра ваги графіка) і є потрібні нам інтеграли (з точністю до множення на константу, ну та це не суть). До речі, а можете сказати, чому саме так?

Разом a1 = 0, b1 = A.

Друга частота
Що до a2 і b2? Давайте знову робити полярний графік, «намотуючи» наш звичайний графік навколо нуля. Єдине, що тепер ми будемо намотувати, роблячи два обороту.

Перший оборот:
parametric_plot((cos(2*t)*square_wave(t), sin(2*t)*square_wave(t)), (t, 0, pi))




parametric_plot((cos(2*t)*square_wave(t), sin(2*t)*square_wave(t)), (t, pi, 2*pi))


Другий оборот очевидно буде порожнім, наш квадратний сигнал в цей момент дорівнює нулю:


Центр мас першого + другого графіків лежить, очевидно, в нулі. Таким чином, a2=0, b2=0.

Третя частота
Тепер намотати навколо нуля один період нашої функції три рази, для наочності я показую три витка на роздільних графіках:



Перший виток повністю заповнює нашу окружність, другий наполовину, а третій порожній. Якщо один повний оберт важить один кілограм, то ми маємо один кілограм на нулі і півкіло на відстані A від нуля. Отже, центр ваги буде на відстані A/3 від нуля.

a3 = 0
b3 = A/3

Більш високі частоти
Що буде з четвертої частотою? Два заповнених витка і два порожніх, центр в нулі. І так для всіх парних.
Що буде з п'ятої частотою? Два заповнених, два порожніх і один полувиток. Разом центр ваги на осі ординат на відстані A/5 від нуля.

Підводимо підсумок
Якщо подивитися ще раз, як ми вважаємо інтеграли, то стане зрозуміло, що між нашим сигналом (квадратної хвилею) і функціями cos(nx), sin(nx) ми шукаємо скалярні твори. Тобто, ми дивимося, наскільки наш сигнал схожий на cos(nx) і наскільки він схожий на sin(nx). Намотуючи певну кількість разів графік (періодичної!) функції навколо нуля, ми гасимо всі частоти, крім поточної.

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

Разом наш ряд дорівнює f(x) = 1/2 + 2/pi sin(x) + 2/(3 pi) sin(3x) + 2/(5 pi) sin(5x) +…

Домашнє завдання
1) Ви зрозуміли зв'язок між прикладом з роботом і квадратної хвилею?

2) А як пов'язаний ряд Фур'є з перетворенням Фур'є?
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.