Мазмуну:

QuickFFT: Arduino үчүн жогорку ылдамдыктагы FFT: 3 кадам
QuickFFT: Arduino үчүн жогорку ылдамдыктагы FFT: 3 кадам

Video: QuickFFT: Arduino үчүн жогорку ылдамдыктагы FFT: 3 кадам

Video: QuickFFT: Arduino үчүн жогорку ылдамдыктагы FFT: 3 кадам
Video: #1 Как запрограммировать ПЛК Outseal Arduino (начало работы) 2024, Ноябрь
Anonim
QuickFFT: Arduino үчүн жогорку ылдамдыктагы FFT
QuickFFT: Arduino үчүн жогорку ылдамдыктагы FFT

Типтүү Arduino чектелген RAM жана иштетүү кубаттуулугуна ээ, жана FFT эсептөөчү-интенсивдүү процесс. Көптөгөн реалдуу убакыт тиркемелери үчүн бирден-бир максималдуу амплитудага ээ болгон жыштыкты алуу же жыштык чокуларын аныктоо талап кылынат.

Менин көрсөтмөлөрүмдүн биринде мен FFT үчүн кодду даярдадым, аны бул жерден табууга болот: EasyFFT

Бул код Arduino наносунда 128 үлгүгө чейин FFT аткара алган. Ардуинонун эс тутумунун чектелүү болгондугунан, мындан жогору үлгү саны мүмкүн эмес. Мен функцияны ылдамдыкты жогорулатуу жана эс тутумун азайтуу үчүн бир аз өзгөрттүм. Бул өзгөртүү Arduinoго FFTти беш эсе ылдам аткарууга мүмкүндүк берет жана дээрлик жарым эс тутумун сарптайт. Бул Нускамада FFTдин иштеши камтылган эмес, ал үчүн шилтемелерди EasyFFTден тапса болот.

1 -кадам: Иштөө

Иштеп жатат
Иштеп жатат
Иштеп жатат
Иштеп жатат
Иштеп жатат
Иштеп жатат
Иштеп жатат
Иштеп жатат

Типтүү FFT функциясы ылдамдыкты азыраак тактык менен жакшыртуу үчүн өзгөртүлгөн. Сүрөттө көрсөтүлгөндөй, сыноо сигналын синус же косинус толкун формаларына көбөйтүү керек. Бул маанилер 0дөн 1ге чейин болушу мүмкүн, андыктан калкып көбөйтүү зарыл. Ардуинодо, калкып жүрүүчү көбөйтүү бүтүн операцияларга салыштырмалуу жай.

Бул функцияда синус/косинус толкуну төрт бурчтуу толкун менен алмаштырылат. 0, 1 же -1 мааниге ээ болгон квадрат толкуну менен сыноо сигналын көбөйтүшүбүз керек. Ушундан улам, биз өзгөрмөлүү көбөйтүүнү бүтүн санга кошууга же кемитүүгө алмаштыра алабыз. Arduino үчүн бүтүн сандарды кошуу же азайтуу 5 эсе ылдамыраак. Бул 5 эсе тезирээк чечүүнү камсыз кылат.

Бул өзгөртүүгө байланыштуу азыр жыштык кутусунун баалуулуктары бүтүндөй сан катары сакталышы мүмкүн (мурда калкып жүргөн) жана биз эс тутумдун дагы бир артыкчылыгын алабыз. Ардуино Нанодо int 2 байт эс тутумун, ал эми float 4 байт эс тутумун сарптайт. Жаңы кодекстеги бул артыкчылыктан улам, биз дээрлик 256 үлгү үчүн FFT аткара алабыз (мурда 128 үлгү).

Жөнөкөй 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 жасоо үчүн колдонулат. Ардуинодогу Int -бул 16 биттик номер жана -32768ден 32768ге чейинки маанилерди камтышы мүмкүн. бул маселени качандыр бир деңгээлдеги эсептөөлөрдөн кийин жок кылуу. Эгерде кандайдыр бир маани 15000ден ашса, толук массивдер 100гө бөлүнөт.

2. Амплитудасын эсептөө: Амплитуданы эсептөө үчүн чыныгы жана элестүү бөлүк квадратка бөлүнүшү керек жана сумманын квадрат тамыры талап кылынат. чарчы жана функциянын квадрат тамыры убакытты талап кылат. процессти тездетүү үчүн, бул код реалдуу жана ойдон чыгарылган бөлүктөрдүн чоңдугун гана кылат. Бул, албетте, анча так эмес жана кээ бир учурларда туура эмес жыйынтыкка алып келиши мүмкүн. чоңдукту эсептөө үчүн Кадимки ыкмага кайтууну тандай аласыз, бирок бул көбүрөөк убакытты талап кылат жана бул сандарды сактоо үчүн кандайдыр бир чараларды көрүү керек.

3. Бул коддо бир нече чокуну аныктоо модулу жок. Бул жөн гана максималдуу амплитудага ээ болгон маанини тандайт (DC офсетинин биринчи санын кошпогондо). Эгер сизге бир нече чокулар керек болсо, EasyFFT кодуна кайрылып, бул жерде керектүү өзгөртүүлөрдү жасай аласыз. Бул учурда, кээ бир массив/өзгөрмө глобалдык өзгөрмө катары жарыяланышы керек.

4. Функция төмөнкү сапты камтыйт:

unsigned 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)

мында An-жыштыктын амплитудасы жана Fn-1-жыштык мааниси.

3 -кадам: Жыйынтыктар:

Жыйынтыктар
Жыйынтыктар
Жыйынтыктар
Жыйынтыктар

Чечилүү убактысы EasyFFT менен жогорудагы сүрөттү салыштырууда көрсөтүлгөн. Анын ылдамдыгы салыштыруу менен көрсөтүлөт.

Ар кандай жыштыктагы 3 синусоидалдык толкунга ээ болгон маалымат үчүн көрсөтүлөт. QuickFFTтин натыйжасы Scilab чыгаруу менен салыштырылат. Сүрөттөн көрүнүп тургандай, максималдуу амплитудасы бар 3 чоку Scilab чыгаруу менен дал келет. Бирок, чыгаруу кээ бир тиркемелерди адаштырышы мүмкүн болгон чуудан турат. Андыктан колдонмого кайрылардан мурун кодду туура текшерүү сунушталат.

Бул код сиздин долбооруңуз үчүн пайдалуу деп ишенем. Эгерде кандайдыр бир суроо же сунуш болсо, комментарийге жазыңыз.

Сунушталууда: