Интерактивно Въведение в Преобразуванията на Фурие

Jez Swanson

Преведено от Борислав Дочев

Преобразованията на Фурие са инструмент, използван в много различни неща. Това е обяснение за какво прави преобразованието на Фурие и няколко начина, по които е полезно. И за как можеш да правиш красиви неща с него като например това:

Ще обясня как работи анимацията, а по пътя и преобразованията на Фурие!

До края ще имаш добра представа за:

Засега ще оставим уравненията и математиката извън обяснението. Има купчина интересна математика зад него, но е по-добре да започнем с какво е и какво наистина прави, и защо ще желаеш да го използваш на първо място. Има няколко предложения за допълнително четене, ако желаеш да разбереш повече относно как работи!

Какво е това нещо?

Казано просто, преобразованието на Фурие е начин да разбиеш нещо на много синусови вълни. Както винаги, името идва от човек, живял преди много години, на име Фурие.

Нека започнем с няколко прости примера и постепенно ще надградим. Първо ще разгледаме вълните - модели, които се повтарят с времето.

Ето примерна вълна:

Този вълнообразен модел може да бъде разделен на синусоиди. Това означава, че когато съберем двете синусови вълни, ще получим оригиналната вълна.

Преобразованието на Фурие е начин за нас да вземем комбинирана вълна и да си върнем обратно съставляващите я синусови вълни. В този пример почти можеш да го направиш наум, само като гледаш оригиналната вълна.

Защо? Оказва се, че много неща в истинския живот си взаимодействат на база тези синусови вълни. Обикновено ги наричаме честотите на вълната.

Най-очевидния пример е звукът – когато чуем звук, ние не чуваме драскулчестата вълна, а чуваме различните честоти на синусите, които изграждат звука.

Възможността да можеш да ги разделяш на компютър може да ни даде представа за какво всъщност чува човек. Можем да разберем колко висок или нисък даден звук е или да разберем коя нота е.

Можем да извършим този процес и на вълни, които не изглеждат като да са направени от синусоиди.

Разгледай тази. Нарича се квадратна вълна.

Може да не изглежда като да е възможно, но и тя може да бъде разделена на синусови вълни.

Този път ни трябват много от тях - технически безкраен брой, за да я представим перфектно. С добавянето на повече и повече синусови вълни, моделът изглежда все по-близък до квадратната вълна с която започнахме.

Плъзни слайдерът отгоре, за да си поиграеш с колко синусови вълни има.

Визуално ще забележиш, че всъщност само първите няколко синусови вълни са тези, които правят най-голямата разлика. Дори със слайдера наполовина, имаме общата форма на вълната, но е леко раздвижена. Просто ни трябват и останалите от малките вълни, за да я изгладим.

Когато слушаш вълната, ще чуеш как звукът се снижава, защото премахваме по-високите честоти.

Този процес работи за всяка повтаряща се вълна. Давай, нарисувай своя!

Рисувай тук!

Мести слайдера, за да видиш как с добавянето на повече синусоиди, толкова повече се приближава до оригиналната ти рисунка

Отново, освен допълнителната раздвиженост, вълната изглежда доста сходно само с половината синусови вълни.

Всъщност можем да използваме факта, че вълната е доста сходна за наша ползва. Когато използваме преобразованието на Фурие, можем да извадим важните части на даден звук и само тях да запазим. Така ще получим нещо, което е доста сходно на оригиналния звук.

Обикновено на компютър пазим вълните като последователност от точки.

Вместо това, можем да я запазим като купчина синусови вълни. След това компресираме звука, като игнорираме по-малките честоти. Крайният резултат няма да бъде същия, но ще звучи доста сходно на човек.

По същество MP3-те правят това, само че те са по-хитри относно кои честоти запазват и кои премахват.

В този случай използваме преобразования на Фурие, за да добием представа за основните характеристики на дадена вълна и после можем да правим неща като компресия.

Нека задълбаем повече в преобразованието на Фурие. Следващата част ще изглежда готино, но също ще ти помогне да разбереш какво прави преобразованието. Но предимно изглежда готино.

Епицикли

В началото казах, че разделя неща на синусови вълни. Работата е там, че синусовите вълни, които създава не са обикновени синусови вълни, а 3Д. Можеш да ги наречеш "комплексни синусодии". Или просто "спирали".

Ако ги погледнем от тази страна, приличат на синусови вълни. А отпред като кръгове.

Досега всичко, което правихме изискваше само обикновените 2Д синусови вълни. Когато правим преобразование на Фурие на 2Д вълни, комплексните части се анулират, така че да ни останат синусовите вълни.

Но можем да използваме 3Д синусовите вълни, за да направим нещо забавно, което изглежда така:

Какво се случва тук?

Еми, можем да си мислим за тази рисунка като 3Д фигура поради начинa по който се движи във времето. Ако си представиш ръката като да бъде рисувана от човек, трите измерения представлявят къде е върхът на молива в даден момент. Х и Y измеренията ни казват позицията и времевото измерение е времето в този момент.

Сега, когато имаме 3Д модел не можем да използваме нормалните 2Д синусови вълни, за да го представим. Колкото и 2Д синусови вълни да събираме, никога няма да стигнем нещо 3Д. Затова ни трябва нещо друго.

Това, което можем да използваме е 3Д спиралата на синусовите вълни от преди. Ако съберем много от тях, можем да получим нещо, което изглежда на нашия 3Д модел.

Спомни си, че тези вълни изглеждат като кръгове, когато ги погледнем от отпред. Този модел на кръг, движещ се около друг кръг, се нарича епицикъл.

Използвай слайдера по-горе, за да контролираш колко кръгове има.

Както преди, получаваме доста добро приближение на нашия модел само с няколко кръга. Тъй като това е доста проста форма, последните кръгове само правят ръбовете малко по-остри.

Всичко това важи за всяка рисунка. Наистина! Сега е твоят шанс да си поиграеш с това.

Рисувай тук!

Използвай слайдера, за да контролираш колко кръгчета са използвани за рисунката ти

Отново, ще видиш, че повечето фигури можем да ги приближим сравнително точно само с малък брой кръгове, вместо да пазим всички точки.

Можем ли да използваме това за истински данни? Ами, да можем! В действителност имаме друг формат данни, наречен SVG, който вероятно се справя по-добре с видовете рисунки, които обикновено правим. Засега, това е просто начин да правим готини малки gif-чета.

Все пак има и друг вид визуални данни, които използват преобразованието на Фурие.

JPEGs

Знаеше ли, че преобразованието на Фурие също може да бъде използвано върху изображения? Всъщност, ние го използваме през цялото време, тъй като JPEG изображенията работят така! Прилагаме същите принципи върху снимки - разбиваме нещо на купчина синусови вълни и запазваме само важните.

Сега като работим с изображения, трябва да използваме друг тип синусова вълна. Трябва да имаме нещо, което независимо от каква снимка му дадем, да можем да съберем няколко от тези синусови вълни, за да получим обратно оригиналното изображение.

За да направим това, всяка от синусовите ни вълни също трябва да бъдат изображение. Вместо вълна, която е линия, ще имаме снимки с бели и черни части. Всяко изображение ще има повече или по-малко контраст, за да можем да представим размерът на вълната.

Можем да ги използваме и за да представим цвят по същия начин, но нека започнем с черно-бели снимки. За да представим безцветно изображение, ни трябват няколко изображения на хоризонтални вълни:

Както и на няколко вертикални вълни.

Самостоятелно само хоризонтални и вертикални изображения не са достатъчно, за да представим видовете снимки, които имаме. Ще ни трябват още няколко, които получаваме при умножение на вертикални и хоризонтални едни с други.

×
=

Ето всичките снимки, които ни трябват за 8х8 на снимка.

Ако вземем тези снимки и им настроим контраста правилно, а след това ги съберем, можем да пресъздадем всяка снимка.

Нека започнем с тази буква 'A'. Доста е малка, но ни трябва да е малка, защото иначе ще имаме твърде много други снимки.

Като прибавяме още и още от тези снмки, получаваме нещо, което става все по-близко до истинската снимка. Но може би виждаш модела, че имаме допустимо приближение само с няколко от тях.

За истинските JPEG снимки има още няколко детайла.

Снимката се разбива на части 8х8 и всяка от тях се разделя инвидивуално. Използваме множество от честоти, за да определим колко светъл или тъмен всеки пиксел е, а след това още две множества за цвета - един за червено-зелено и друг за синьо-жълто. Броят честоти, които използваме за всяка част, определя качеството на JPEG изображението.

Ето истинско JPEG изобразжение, което е увеличено, за да видим детайлите. Когато си играем с нивата на качество, можем да видим как се случва процесът.

Заключение

Нека преговорим:

Това е само повърхността на някои приложения. Преобразованието на Фурие е изключително силен инструмент, защото разделянето на неща на честоти е доста основно. Използва се в много области, включително в дизайн на интегрални схеми, сигнали на мобилини телефони, магнитно-резонанса томография (ЯМР) и квантова физика!

Въпроси за любопитните

Изпуснах повечето математически неща тук, но ако си заинтересован в принципите и как работи, ето няколко въпроса, които да ти помогнат в проучването:

Допълнително 'четене'

Няколко много добри ресурси, които можеш да разгледаш, за да научиш повече са:

An Interactive Guide To The Fourier Transform Добра статия, която задълбава повече в математиката на какво се случва.

But what is the Fourier Transform? A visual introduction. Прекрасно Youtube видео на 3Blue1Brown, което също обяснява математиката на преобразованята на Фурие от аудио перспектива.

A Tale of Math & Art: Creating the Fourier Series Harmonic Circles Visualization Друга статия, която обяснява как можеш да използваш епицикли, за да нарисуваш крива. Разглежда се от перспективата на линейната алгебра.

Fourier transform (Wikipedia) Разбира се и Уикипедия статия е доста добра.

Авторът

Аз съм Джез! Работя на пълен работен ден в компания за търсене по крайбрежието на САЩ и в свободното си време обичам да правя игри и интерактивни кодови неща като това!

Тази уеб страница е open-source и можеш да разгледаш кода в GitHub! Ако имаш обратна връзка или въпроси, можеш да ми пратиш имейл на fourier [at] jezzamon [dot] com, или да ми пратиш tweet на Twitter.

Ако желаеш да разгледаш още от работата ми, разгледай заглавната ми страница. Ако искаш да видиш какво ще правя, можеш да последваш Twitter акаунта ми @jezzamonn!