Мазмұны:

QuickFFT: Arduino үшін жоғары жылдамдықты FFT: 3 қадам
QuickFFT: Arduino үшін жоғары жылдамдықты FFT: 3 қадам

Бейне: QuickFFT: Arduino үшін жоғары жылдамдықты FFT: 3 қадам

Бейне: QuickFFT: Arduino үшін жоғары жылдамдықты FFT: 3 қадам
Бейне: Measure Temperature and Humidity WiFi with ESP32 DHT11 and DHT22 - Robojax 2024, Қараша
Anonim
QuickFFT: Arduino үшін жоғары жылдамдықты FFT
QuickFFT: Arduino үшін жоғары жылдамдықты FFT

Кәдімгі Arduino оперативті жады мен өңдеу қуаты шектеулі, ал FFT-есептеуді қажет ететін процесс. Нақты уақыттағы көптеген қосымшалар үшін жалғыз талап-максималды амплитудасы бар жиілікті алу немесе жиілік шыңдарын анықтау үшін қажет.

Менің нұсқауларымның бірінде мен FFT кодын дайындадым, оны мына жерден табуға болады: EasyFFT

Бұл код Arduino наносында 128 үлгіге дейін FFT жасай алды. Ардуиноның жадының шектеулі болуына байланысты бұдан жоғары үлгі саны мүмкін емес. Мен жылдамдықты жақсарту және жадты тұтынуды азайту үшін функцияны сәл өзгерттім. Бұл модификация Arduino -ға FFT -ті бес есе жылдам орындауға мүмкіндік береді және жадының жартысын тұтынады. Бұл нұсқаулық FFT жұмысына қатысты емес, оған сілтемелерді EasyFFT сайтынан табуға болады.

1 -қадам: жұмыс

Жұмыс
Жұмыс
Жұмыс
Жұмыс
Жұмыс
Жұмыс
Жұмыс
Жұмыс

Әдеттегі FFT функциясы жылдамдықты аз дәлдікпен жақсарту үшін өзгертілген. Суретте көрсетілгендей, сынақ сигналын синус немесе косинус толқындарымен көбейту қажет. Бұл мәндер 0 -ден 1 -ге дейін болуы мүмкін, сондықтан өзгермелі көбейтуді жасау қажет. Arduino -да өзгермелі көбейту бүтін сандармен салыстырғанда баяу жүреді.

Бұл функцияда синус/косинус толқыны шаршы толқынмен ауыстырылады. Біз тест сигналын квадрат толқынмен көбейтуіміз керек, оның мәні 0, 1 немесе -1 болуы мүмкін. Осының арқасында біз өзгермелі көбейтуді бүтін санға қосу немесе азайтуды алмастыра аламыз. Arduino үшін бүтін сандарды қосу немесе азайту шамамен 5 есе жылдам. Бұл 5 есе жылдам шешуге мүмкіндік береді.

Осы модификацияның арқасында енді жиіліктер қалтасының мәндері бүтін сан ретінде сақталуы мүмкін (ол бұрын өзгермелі болатын) және біз жадты аз тұтынудың тағы бір артықшылығын аламыз. Arduino Nano -да int 2 байт жады тұтынады, ал float 4 байт жады тұтынады. Жаңа кодтағы осы артықшылықтың арқасында біз 256 дерлік (бұрын 128 үлгі) FFT жасай аламыз.

Қалыпты FFT -те шешімді тезірек жасау үшін синус мәнін сақтау қажет болды. Жаңа функцияда синус/косинус мәндері қажет болмайтындықтан, біз оны жоя аламыз және жадты сақтай аламыз.

Іске асыру:

Бұл функцияны жүзеге асыру тікелей. Біз функцияны кодтың еншісінде көшіре аламыз. Бұл функцияны төмендегі пәрменнің көмегімен орындауға болады:

float f = Q_FFT (деректер, 256, 100); Q_FFT функциясында, деректер: бұл термин - сигнал мәндері бар массив, ұсынылатын үлгі өлшемі 2, 4, 8, 32, 64, 128, 256, 512,… одан әрі. егер үлгі өлшемі осы мәндерге жатпаса, ол мәндердің ең жақын төменгі жағына қиылады. мысалы, егер іріктеу өлшемі FFT -тен 75 болса, сынамалардың 64 саны бойынша жүргізіледі. Үлгі өлшемінің максималды саны Arduino қол жетімді RAM -мен шектеледі.

Екінші термин массивтегі үлгілер санын көрсетеді, ал соңғы термин - Гц жиіліктерінде іріктеу жиілігі.

2 -қадам: код

Бұл бөлім EasyFFT кодында енгізілген өзгертулерді түсіндіреді, олар кодты өзгерту кезінде ескерілуі керек, 1. Жоғарыда айтылғандай, мұнда бүтін сандар FFT үшін қолданылады. Arduino -дегі Int -16 -биттік сан және -32768 -ден 32768 -ге дейінгі мәндерді қамтуы мүмкін. Int мәні осы диапазоннан асқан сайын бұл мәселені тудырады. деңгейлік есептеуден кейін бұл мәселені жою үшін. егер кез келген мән 15000 -нан асса, толық массивтер 100 -ге бөлінеді. бұл int толып кетуіне жол бермейді.

2. Амплитудалық есептеу: Амплитуданы есептеу үшін нақты және ойдан шығарылған бөлікті квадраттап, қосындының квадрат түбірі қажет. квадрат және функцияның квадрат түбірі уақыт алады. процесті жылдамдату үшін бұл код нақты және ойдан шығарылған бөліктердің шамасын жасайды. Бұл, әрине, дәл емес және кейбір жағдайларда қате қорытындыға әкелуі мүмкін. Сіз шаманы есептеу үшін Қалыпты әдіске оралуды таңдай аласыз, бірақ бұл көп уақытты қажет етеді, сонымен қатар бұл сандарды сақтау үшін белгілі бір шараларды жасау қажет.

3. Бұл кодта бірнеше шыңды анықтау модулі жоқ. Ол максималды амплитудасы бар мәнді таңдайды (тұрақты токтың ығысуы болып табылатын бірінші санды қоспағанда). Егер сізге бірнеше шың қажет болса, EasyFFT кодына сілтеме жасай аласыз және осы жерде қажетті өзгертулер жасай аласыз. Бұл жағдайда кейбір массив/айнымалы жаһандық айнымалы ретінде жариялануы керек.

4. Функция келесі жолды қамтиды:

белгісіз int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

жоғарыда көрсетілген айнымалыларды жаһандық айнымалы деп жариялау (кодтың басында қою) әр орындауда 1 миллисекунд уақытты үнемдейді.

5. EasyFFT функциясынан айырмашылығы, онда алдынғы анықталған массивте жоғарғы 5 шың сақталған. Бұл функция өзгермелі мәнді қайтарады. бұл мән Гц -те максималды амплитудасы бар жиілікті көрсетеді. Сондықтан кодтың көрінісі келесідей болады.

float f = Q_FFT (деректер, 256, 100);

6. Шыңды анықтау: максималды амплитудасы бар жиілік табылғаннан кейін бұл функция дәл нәтижелерді есептеу үшін жиілік амплитудасын қолданады. Бұл есепте қолданылатын амплитуда да модульдердің қосындысы болып табылады (квадраттар қосындысының квадрат түбірі емес)

егер Fn - максималды амплитудасы бар жиілік болса, жиілікті төмендегі формуладан есептеуге болады.

Нақты F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)

мұндағы Ан-жиіліктің амплитудасы, ал Fn-1-жиілік мәні.

3 -қадам: Нәтижелер:

Нәтижелер
Нәтижелер
Нәтижелер
Нәтижелер

Шешу уақыты EasyFFT көмегімен суретті салыстыруда көрсетілген. Оның жылдамдығы салыстыру арқылы көрсетілген.

Әр түрлі жиіліктегі 3 синусоидальды толқындары бар үлгі деректері үшін көрсетілген. QuickFFT нәтижесі Scilab шығысымен салыстырылады. Суретте көріп отырғанымыздай, максималды амплитудасы бар 3 шың Scilab шығысымен сәйкес келеді. Алайда, шығыс көптеген қосымшалардан жаңылыстыратын көптеген шуылдан тұрады. Сондықтан өтінімге жүгінер алдында кодты дұрыс тексерген жөн.

Бұл код сіздің жобаңыз үшін пайдалы деп үміттенемін. Сұрақ немесе ұсыныс болған жағдайда түсініктеме беріңіз.

Ұсынылған: