Мазмұны:
Бейне: QuickFFT: Arduino үшін жоғары жылдамдықты FFT: 3 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:23
Кәдімгі 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 шығысымен сәйкес келеді. Алайда, шығыс көптеген қосымшалардан жаңылыстыратын көптеген шуылдан тұрады. Сондықтан өтінімге жүгінер алдында кодты дұрыс тексерген жөн.
Бұл код сіздің жобаңыз үшін пайдалы деп үміттенемін. Сұрақ немесе ұсыныс болған жағдайда түсініктеме беріңіз.
Ұсынылған:
Үйде жоғары жылдамдықты электромобиль: 7 қадам
Үйде жұмыс істейтін жоғары жылдамдықтағы электр машинасы: Егер сіз өзіңіздің жеке электромобиль жасағыңыз келсе, бұл қарапайым материалдардан жоғары жылдамдықты автокөлікті, сондай -ақ электронды дүкеннен бірнеше арзан заттарды жасаудың қарапайым әдісі. Енді RC автокөліктеріне 30-60 доллар жұмсауға болмайды
РЕО бойынша жоғары жылдамдықты жүктеу мен OKAY ағыны үшін VPN премиум орнату нұсқаулығы: 10 қадам
Жоғары жылдамдықты жүктеу мен OKAY ағыны үшін VPN премиум орнату нұсқаулығы: REO арқылы рахмет: Asuswrt-MerlinHi, мен Тайландтанмын. Мен орташа жылдамдығы 100 Мб/сағ айналасында жоғары жылдамдықты жүктеу үшін VPN егжей-тегжейлі орнату нұсқаулығын жазамын және Netflix, Crunchyroll, Hulu және т.б. үшін ең ыңғайлы ағын болуы мүмкін, Таиландтан
Жоғары жылдамдықты ЭКГ немесе басқа деректерді бір ай бойы үздіксіз тіркеңіз: 6 қадам
Бір ай бойы үздіксіз ЭКГ немесе басқа деректерді тіркеңіз: Бұл жоба университеттің медициналық зерттеу тобын қолдау үшін әзірленген, оған 2 x ЭКГ сигналын әрқайсысы 1000 сынақ/секундқа тіркейтін (барлығы 2K үлгі/секунд) медициналық аппарат қажет. аритмияны анықтау үшін 30 күн бойы үздіксіз. Жоба презентациясы
24в тұрақты ток қозғалтқышы жоғары жылдамдықты әмбебап қозғалтқышқа (30 вольт): 3 қадам
24 вольтты тұрақты ток қозғалтқышы жоғары жылдамдықты әмбебап қозғалтқышқа (30 вольт): Сәлеметсіз бе! Бұл жобада мен сізге 24 В тұрақты ток ойыншығын 30 В әмбебап қозғалтқышқа айналдыруды үйретемін. . Балалар, мен сізге алдымен бейнені көруге кеңес берер едім. V жоба
Тұрақты ток қозғалтқышымен жоғары жылдамдықты желдеткішті қалай жасауға болады ?: 6 қадам
Тұрақты ток қозғалтқышымен жоғары жылдамдықты желдеткішті қалай жасауға болады?