ПредишенСледващото

За да използвате библиотеката, изтеглете ZIP-файл, го разархивирайте и след това го поставете в папка за IDE Ардуино библиотеки.

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

Общо седем библиотечни функции: две предварителен fft_reorder () и fft_window (). една основна fft_run () и четири амплитуда, отговарящи за различните формати на изходните данни: 16-битов линейни, 8-битов линейни, 8-битов логаритмична и 8-битов октава.

fft_run () функция - главната функция на FFT библиотека. Тя не се нуждае от никакви аргументи, и го връща нищо. Ако изпълните тази функция, се приема, че исканите данни са реорганизирани и са в памет SRAM. Тези данни се съхраняват в архива нарича fft_input []. който се състои от две 16-битови стойности - реално и сложна. Ако попълните този масив себе си, а след това на действителната стойност се съхранява в четните изходни проби, както и на комплекса - странно.

Така fft_input [0] - тази първа действителната стойност, fft_input [1] - първи комплексна стойност, fft_input [2] - втори действителната стойност, fft_input [3] - втори комплексна стойност и т.н.

Вследствие на това се оказва, удвояване, така че броят на пробите в масива ще бъде два пъти повече, отколкото в действителност, реално ФПБ -otschetov. Ако използвате само реални числа (т.е. стойностите, получени от ADC), а след това да ги запишете в четните проби и въведете "0" в нечетните отчети.

Резултатът се съхранява в fft_input []. дори когато пробите са отговорни за фактическото амплитудата и нечетните - за комплекса. Сами има значение, е от порядъка на честоти (ASC).

Така fft_input [0] и fft_input [1] - е амплитудата на първата референтна рамка (0Hz -> Fs / N), fft_input [2] и fft_input [3] - е амплитудата на втората референтна рамка (Fs / N -> 2Fs / N), и т.н.

За да получите от пробите всякаква полезна информация, която ще трябва да пуснете един от четирите амплитудни функции (от които по-долу).

fft_reorder ()

fft_reorder () функция реорганизира входните данни и ги подготвя за обработка FFT алгоритъм. Може би не е необходимо тази функция, тъй като Тази реорганизация може да се извършва ръчно. fft_reorder () функция се изпълнява преди fft_run (). Тя не се нуждае от никакви аргументи, и го връща нищо. Освен това, е необходимо да попълните fft_input [] масив преди извикването на тази функция. защото Това отнема необработените данни от там.

fft_window ()

fft_window () функция умножава входните данни с помощта на набор от инструменти за увеличаване на данните за разрешаване на честота за ФПБ. Тя не се нуждае от никакви аргументи, и го връща нищо. Освен това, е необходимо да попълните fft_input [] масив преди извикването на тази функция. защото Това отнема необработените данни от там. fft_reorder () функция се изпълнява преди fft_run () и fft_reorder ().

fft_mag_lin8 ()

fft_mag_lin8 () функция дава амплитудата за всеки FFT рамка. Тя обобщава реални и комплексни стойности, квадрат, а след това на корен квадратен, закръгли на стойността на 8-битов (тя използва сравнителна таблица, настройка на стойностите на пълен 8-битова гама). Тя не се нуждае от никакви аргументи, и го връща нищо. Първоначалните данни за това е данни от масива fft_input []. и резултатът се съхранява в масив fft_lin_out8 []. след което данните могат да бъдат използвани за други цели. Амплитудата се изчислява само за първата половина на изходни проби (N / 2) от втората половина на FFT е идентична за целия първи диапазон на първоначалните стойности. Следователно, броят на 8-битови стойности в fft_lin_out8 масива [] ще бъде N / 2. където всеки индекс ще съответства на номера на рамата изход (минус "1").

Това е fft_lin_out8 [0] - е амплитудата на първата референтна рамка (0Hz -> Fs / N), fft_lin_out8 [1] - е амплитудата на втората референтна рамка (Fs / N -> 2Fs / N), и т.н.

fft_mag_lin ()

fft_mag_lin () функция дава амплитудата за всеки FFT рамка. Тя обобщава реални и комплексни стойности, квадрат, а след това да вземе корен квадратен. използване на сравнителна таблица за квадратен корен, така че точността има някои ограничения. Функцията включва пълен 16-битов обхват, но в даден момент от тази резолюция обхват все още ще бъде 8-битов.

Този 8-битова стойност, където 4 бита разпределени по реда (т.е. експонента). Първоначалните данни за това е данни от масива fft_input []. и резултатът се съхранява в масив fft_lin_out []. Получените данни са подредени в последователен ред, и общият им брой е N / 2. от втората половина на FFT е идентична за целия първи диапазон на първоначалните стойности.

fft_mag_log ()

fft_mag_log () функция дава амплитудата за всеки FFT рамка. Тя обобщава реални и комплексни стойности на квадрат, а след това на корен квадратен. След това функцията изчислява логаритъм на числото, получено по отношение на две. Резултатът ще бъде представена в логаритмична формат - в действителност, в децибели. fft_mag_log () функция не изисква никакви аргументи, и го връща нищо.

За квадратен корен, като се използва таблица, а резултатът се коригира за пълен 8-битова гама. Това е, уравнението на функция ще бъде както следва: 16 * (log2 ((+ kompleksn2 deystv2) 1/2)). Първоначално данни за функцията е данни от масива fft_input []. и резултатът се съхранява в масив fft_log_out []. Общо са от същия порядък, както на изходните проби на FFT. и общият брой на пробите е N / 2. от втората половина на FFT е идентична за целия първи диапазон на първоначалните стойности.

fft_mag_octave ()

fft_mag_octave () функция дава средната квадратична стойност на изходни проби, всичко представяне в октава (честота удвояване) формат. Този формат обикновено е по-полезен, защото той е близо до начина, по който хората възприемат звука. Тя не се нуждае от никакви аргументи, и го връща нищо. Първоначално данни за функцията е данни от масива fft_input []. и резултатът се съхранява в масив fft_oct_out []. Получените данни представляват 8-битова стойност, изчислена с формула 16 * log2 на (блокове (Vp)). Броят на изходни проби се изчислява както следва:

Ето, например, 5: 8 - е сумата от всички проби, разположен на 5-ти до 8-ми. Данните във всяка проба на квадрат (и реални и комплексни стойности), а след това се добавят с всички амплитуди (също квадратура), намиращи се в този диапазон. След това броят на изходни проби са взети и разделен от този брой (който, между другото, може да се изключи - виж следващия раздел) и след това на корен квадратен и логаритъма се изчислява.

Искате ли да "погледнем под капака." Добре, аз ще се опитам да го обясня на всички произведения, според какви принципи. За бързина в FFT библиотека отговаря на две неща.

На първо място, във всяка от FFT, което трябва да се размножават набор от начални стойности на константите синус и косинус. На ATmega изисква големи изчислителни ресурси, тъй като размножаването на 16-битов и 16-битов изисква 18 часа цикъла. От друга страна, добавянето на 16 бита и 16 бита са необходими само два такта. Оттук и изводът, че е по-добре да се откаже от това да се размножава. Фактът, че константите синус и косинус, използвани в FFT - това е просто една "0" и "1". така че не е нужно да използвате умножение, защото достатъчно и допълнение. Например, ако има FFT 256 изходни проби. След това е необходимо да се извърши комплекс размножаване в 1024, от които 382 - това е "0" или "1". Почти половината!

FFT библиотека за Arduino търси условия, които използват "0" и "1". и просто да го прави допълнение. Фактът, че тези константи се появяват на равни интервали, така че за тях изглеждат е съвсем проста. Въпреки това, с увеличаване на броя на изходните проби предимства на този метод са намалени. Ако броят на изходни проби в FFT настоящите спестявания N. време ще бъде (1.5 * Н - 2), и общия брой на повторенията е (N / 2) * log2 (N). По този начин, с формула, за които изчислените икономии ще бъдат 3 / log2 (N). Н. и по-висок е по-малко време можете да спестите.

Вторият метод е насочена към ускоряване на FFT - справочна таблица, използвана за изчисляване на корен квадратен от амплитудите. Сложността на този метод е, че суровите данни е много повече от съдържанието на справочната таблица. По този начин, за да се избегне загубата на паметта на програмата, първоначалните данни да бъдат компресирани. Например, ако на корен квадратен от стойността на 16-битов. ние получаваме 64 000 на входните стойности. че ние трябва да по някакъв начин се коригира до 256 изходните стойности. Паметта на програма Arduino е невъзможно да се проведе такова количество изчисления, така че линейна интерполация се използва в библиотеката на целия масив от входни данни, в резултат на различните линии ще бъдат изчислени за различните региони. Например, за линеен 8-битов формат, ще бъде достатъчно 3-4 линейни секции. и без загуба на резолюция.

По този начин, библиотека изчислява изходни данни за едно от тези линейни участъци, а след това на квадратния корен на, и това отнема около 12 часа цикъла. Това е много по-малко от 150 цикъла. които са необходими в стандартната библиотека за квадратен корен.

Версия с 32-битова битов вход данни по-трудно, защото сега трябва да се коригира на изхода на 16 бита. и линейна интерполация не помага тук, защото тя не е в състояние да компресирате стойност резолюция по-голяма от 16 бита. Следователно, не се използва подход хибрид в която стойността на въвеждане се превръща в 16-битова стойност с 8-битов ред. Това може да стане много бързо, с основата "2". , която позволява използването на Конт се таблицата за квадратен корен и ценностите с резолюция по-голяма от 16 бита. Ако компресията на стойността на входа се измести от 2 бита в дясно. стойността на продукцията, може да бъде реконструиран с изместване от 1 бит на ляво. Обикновено, след нареждането за създаване (т.е., експоненциална) закръглено до четно число, като квадратен корен може да се върне целочислена стойност.

Разбира се, 32-битова версия не е толкова точна като библиотека, за да изчислява корен квадратен, но изисква само за 40 цикъла. като има предвид, тази библиотека изисква 500. Сравнителната таблица връща стойност, която е толкова вярна, колкото е възможно, само за първите 8 бита. но тази точност е достатъчна за тази FFT. Общо дълбочина FFT малко не е много по-ниско от 12 бита. защото използва фиксирана точка (за да се избегне преливане преди допълнение всяка стойност да бъде разделен от 2 ;. ако FFT 256 има изходни проби в крайна сметка дава участък от 256). Точността зависи от разделителната способност на изходните данни. Ако стойност 8-битова. точността ще бъде максимална. Ако това е 9-битова стойност. От една най-маловажният бит може да бъде погрешно. Ако тази стойност 10-битов. двете най-незначителните битове може да са грешни, и т.н. Това е най-лошия случай - на стойност 16-битово с точност +/- 0,5%.

Тези стойности позволяват да променят кода на FFT, за да отговарят на вашите нужди. Повечето от тях се включва и изключва някои функции на библиотека. По подразбиране, повечето от функциите, са изключени, така че да ги използвате, първо трябва да го активирате. Тези директиви се оценяват с #define строителство и то трябва да се направи преди да се свържете библиотеки, което прави дизайна #include.

  • FFT_N директива определя размера на FFT. Вариантите са: 16. 32. 64. 128 и 256. опция 256 настройки по подразбиране.
  • Директива мащаб е отговорен за приближаване fft_mag_lin8 (функция). От 8-битови - това е доста слаба резолюция, потребителят може да искате да мащабирате данните, за да ги увеличите до пълния набор.
  • Директива СКАЛА умножава изхода от постоянна преди изчисляване на корен квадратен, което води до изхода е минимизиран резолюция. Това ще изисква малко повече ресурси от нормалното, но прекалената консумация е много малък. Скалата на директивата да посочите всяко число от 1 до 255. настройката по подразбиране 1. най-малко количество ресурси консумира използване 1. 2. 4. 128 и 256.
  • директива ПРОЗОРЕЦ активира или деактивира-кутията. Ако не използвате fft_window (). тогава ще трябва да влезете в прозореца 0 (изключен). По подразбиране е 1 ПРОЗОРЕЦ (Онтарио).
  • директива преподредите активира или деактивира реорганизацията. Ако не използвате fft_reorder (). След това трябва да въведете преподредите 0 (изключен). По подразбиране е преподредите 1 (на).
  • директива LOG_OUT активира или деактивира логаритмична формат. Ако използвате fft_mag_log (). След това трябва да въведете LOG_OUT 1 (на). По подразбиране е LOG_OUT 0 (изключен).
  • директива LIN_OUT активира или деактивира формат линеен (16 бита). Ако използвате fft_mag_lin (). След това трябва да въведете LIN_OUT 1 (на). По подразбиране е LIN_OUT 0 (изключен).
  • директива LIN_OUT8 активира или деактивира формат линеен (8 бита). Ако използвате fft_mag_lin8 (). След това трябва да въведете LIN_OUT8 1 (на). По подразбиране е LIN_OUT8 0 (изключен).
  • директива OCTAVE активира или деактивира функцията за октава формат. Ако използвате fft_mag_octave (). След това трябва да въведете октава 1 (на). OCTAVE подразбиране е 0 (изключен).
  • директива OCT_NORM се включва и изключва в октава функция формат нормализиране. И е част от fft_mag_octave (функция). която разделя всяка групирани преброяване на средния брой на обвинения. От много източници звукови излъчват така наречените "розов шум" (падането на амплитудата с увеличаване на честотата), това води до намаляване на мащаба. Да бъдеш изключен (OCT_NORM 0), настоящата директива за изкуственото увеличаване на амплитудата при високи честоти. нормализиране по подразбиране е включена (OCT_NORM 1).
  • FFT ADC - Прилагане на FFT на данните от ADC и чрез изпращане на резултат пиша ()
  • FFT ADC сериен - Прилагане на FFT на данните от ADC и изпращане на резултата чрез println ()
  • FFT кодек - Прилагане на FFT на данните от модула Codec Shield

Свързани статии

Подкрепете проекта - споделете линка, благодаря!