Orodha ya maudhui:

EasyFFT: Mabadiliko ya Haraka ya Fourier (FFT) ya Arduino: Hatua 6
EasyFFT: Mabadiliko ya Haraka ya Fourier (FFT) ya Arduino: Hatua 6

Video: EasyFFT: Mabadiliko ya Haraka ya Fourier (FFT) ya Arduino: Hatua 6

Video: EasyFFT: Mabadiliko ya Haraka ya Fourier (FFT) ya Arduino: Hatua 6
Video: Узнайте, как Дженни Тайлер совершает революцию в сфере здравоохранения! 2024, Novemba
Anonim
Image
Image

Upimaji wa masafa kutoka kwa ishara iliyonaswa inaweza kuwa kazi ngumu, haswa kwenye Arduino kwani ina nguvu ndogo ya kihesabu. Kuna njia zinazopatikana za kukamata kuvuka sifuri ambapo masafa yanakamatwa na kukaguliwa ni mara ngapi ishara inavuka mistari ya sifuri ndani ya wakati uliopewa. Njia kama hiyo haiwezi kufanya kazi wakati ishara ni mchanganyiko wa masafa anuwai.

Hii ni ngumu kwa njia fulani ikiwa sio wa asili kama hiyo. Lakini kuwa mchochezi nambari hii inaweza kuwa muhimu sana kwa miradi anuwai inayohusiana na muziki, uchambuzi wa ishara. Kusudi la mradi huu lilikuwa kuandaa nambari ambayo ni rahisi kutekeleza kwenye Arduino bila kuingia kwenye msingi wake.

Mradi huu hauelezei Kufanya kazi kwa FFT lakini unaelezea matumizi ya kazi ya FFT. Utaratibu huo huo pia umeelezewa kwenye video iliyoambatanishwa.

Ikiwa unapendezwa tu na utumiaji wa nambari na sio ufafanuzi wake. Unaweza kuruka moja kwa moja hatua ya 3.

Hatua ya 1: Utangulizi wa Mabadiliko ya Frequency

Utangulizi wa Mabadiliko ya Mzunguko
Utangulizi wa Mabadiliko ya Mzunguko
Utangulizi wa Mabadiliko ya Mzunguko
Utangulizi wa Mabadiliko ya Mzunguko

Ishara yoyote inaweza kutengenezwa na mchanganyiko wa mawimbi anuwai ya sinusoidal. Kwa hivyo ishara yoyote inayotegemea wakati inaweza pia kuonyeshwa kama mchanganyiko wa sine anuwai ya amplitudes tofauti.

Nilijaribu kuelezea utendaji kazi wa DFT (discrete Fourier transform) katika moja ya maelekezo ya hapo awali (https://www.instructables.com/id/Arduino-Frequency…). Njia hizi ni polepole sana kwa matumizi yoyote ya wakati halisi. ambayo inafanya kuwa karibu haina maana.

Katika picha, ishara inaonyeshwa ambayo ni mchanganyiko wa masafa mawili f2 na f5. Ishara hii huzidishwa na mawimbi ya sine ya mtihani wa f1 hadi f5.

Inaweza kuonyeshwa kihisabati kwamba -summation ya kuzidisha kwa seti mbili za data ya harmonic kuwa na mzunguko tofauti huwa sifuri (idadi kubwa ya data inaweza kusababisha matokeo ya kugonga). Kwa upande wetu, ikiwa masafa haya mawili ya kuzidisha yana mzunguko sawa (au wa karibu sana) jumla ya kuzidisha ni nambari ya nonzero.

Kwa hivyo ikiwa ishara yetu itaongezwa na summation ya f1 ya kuzidisha itakuwa sifuri (karibu na sifuri kwa matumizi halisi). sawa na kesi ya f3, f4. Walakini kwa thamani, pato la f2 na f5 haitakuwa sifuri, lakini ni kubwa zaidi kuliko maadili mengine.

Hapa ishara inajaribiwa na masafa 5, kwa hivyo ishara inahitaji kuzidishwa na masafa matano. Hesabu kali kama hiyo inachukua wakati zaidi. Kimahesabu inaonyeshwa kuwa kwa N idadi ya sampuli inachukua N * N kuzidisha ngumu.

Hatua ya 2: Mabadiliko ya Haraka ya Fourier

Ili kufanya hesabu ya DFT haraka FFT algorithm ilitengenezwa na James Cooley na John Tukey. Algorithm hii pia inachukuliwa kama moja ya algorithms muhimu zaidi ya karne ya 20. Inagawanya ishara kuwa sehemu isiyo ya kawaida na hata iliyofuatana ambayo hufanya idadi ya hesabu zinazohitajika kuwa chini. Kwa kuitumia kuzidisha ngumu ngumu inaweza kupunguzwa kuwa NlogN. ambayo ni uboreshaji mkubwa.

Unaweza kutaja marejeo hapa chini ambayo nilirejelea wakati wa kuandika nambari hiyo kwa uelewa wa kina wa hisabati nyuma ya FFT:

1.

2.

3.

4.

Hatua ya 3: Ufafanuzi wa Kanuni

1. Sine haraka na Cosine:

Hesabu FFT inachukua thamani ya sine na cosine anuwai mara nyingi. Kazi iliyojengwa ya Arduino haina haraka ya kutosha na inachukua muda mzuri kutoa thamani inayohitajika. Ambayo hufanya nambari iwe polepole sana (mara mbili ya sampuli 64). Kukabiliana na swala hili la thamani ya sine kwa digrii 0 hadi 90 imehifadhiwa kama nyingi ya 255. Kufanya hivyo kutaondoa hitaji la kutumia nambari za kuhifadhi kama kuelea na tunaweza kuzihifadhi kama byte ambayo inachukua nafasi ya 1/4 kwenye Arduino. Sine_data inahitaji kubandika juu ya nambari ili kuitangaza kama utofauti wa ulimwengu.

Mbali na sine_data, safu inayoitwa f_peaks ilitangazwa kama utofauti wa ulimwengu. Baada ya kila kukimbia kwa kazi ya FFT safu hizi za safu. Ambapo f_peaks [0] ni masafa zaidi na maadili zaidi kwa utaratibu wa kushuka.

byte sine_data [91] = {0, 4, 9, 13, 18, 22, 27, 31, 35, 40, 44, 49, 53, 57, 62, 66, 70, 75, 79, 83, 87, 91, 96, 100, 104, 108, 112, 116, 120, 124, 127, 131, 135, 139, 143, 146, 150, 153, 157, 160, 164, 167, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 206, 209, 211, 214, 216, 219, 221, 223, 225, 227, 229, 231, 233, 235, 236, 238, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255, 255}; kuelea f_peaks [5];

Kama tunavyohifadhi thamani ya sine kwa digrii 0 hadi 90 thamani yoyote ya sine au cosine inaweza kuhesabiwa. Chini ya kazi mzunguko wa kwanza wa nambari hadi nambari ya decimal ya sifuri na kurudisha thamani kutoka kwa data iliyohifadhiwa. njia hii inahitaji mgawanyiko mmoja tu wa kuelea. Hii inaweza kupunguzwa zaidi kwa kuhifadhi moja kwa moja maadili ya sine (sio 255 nyingi). lakini hiyo inakula kumbukumbu kubwa juu ya Arduino.

Kutumia utaratibu hapo juu kunapunguza usahihi lakini inaboresha kasi. Kwa alama 64, inatoa faida ya 8ms na kwa alama 128 inatoa faida ya 20ms.

Hatua ya 4: Ufafanuzi wa Kanuni: Kazi ya FFT

FFT inaweza kufanywa tu kwa saizi ya sampuli ya 2, 4, 8, 16, 32, 64 na kadhalika. ikiwa thamani sio 2 ^ n, kuliko itachukua upande wa chini wa thamani. Kwa mfano, ikiwa tutachagua ukubwa wa sampuli ya 70 basi itazingatia tu sampuli 64 za kwanza na kuacha mapumziko.

Daima inashauriwa kuwa na saizi ya sampuli ya 2 ^ n. ambayo inaweza kuwa:

2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, …

Kuelea mbili nje_r na nje_im itachukua kumbukumbu kubwa. kwa Arduino nano haitafanya kazi kwa sampuli zilizo juu kuliko 128 (na wakati mwingine 128) kwa sababu ya ukosefu wa kumbukumbu inayopatikana.

data isiyoingia [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

int a, c1, f, o, x; a = N; kwa (int i = 0; i <12; i ++) // kuhesabu viwango {if (data <= a) {o = i;}} int in_ps [data [o] = {}; // pembejeo ya ufuatiliaji wa kuelea nje_r [data [o] = {}; // sehemu halisi ya kuelea kuelea out_im [data [o] = {}; // sehemu ya kufikiria ya kubadilisha

Mtiririko zaidi ni kama ifuatavyo:

1. Msimbo hutengeneza ubadilishaji kidogo wa agizo la ukubwa wa sampuli uliyopewa (maelezo juu ya kugeuza kidogo kwenye marejeleo: hatua ya 2)

2. Takwimu za kuingiza zilizoagizwa kulingana na agizo lililotengenezwa, 3. FFT ilifanya

4. Ukubwa wa nambari tata iliyohesabiwa, 5. Peaks hugunduliwa na kuamuru kwa utaratibu wa kushuka

6. matokeo yanaweza kupatikana kutoka f_peaks.

[kufikia data nyingine (mbali na msimbo wa kilele) inapaswa kubadilishwa, ili ubadilishaji wa hapa uweze kunakiliwa kwa mabadiliko kadhaa yaliyofafanuliwa ya ulimwengu]

Hatua ya 5: Kupima Nambari

Kupima Kanuni
Kupima Kanuni
Kupima Kanuni
Kupima Kanuni

Wimbi la pembetatu la mfano limetolewa kama pembejeo. kwa mzunguko huu wa sampuli ya wimbi ni 10 Hz na mzunguko wa wimbi yenyewe ni 1.25 Hz.

Kama inavyoonyeshwa kutoka kwa pato ghafi, thamani inalingana na FFT iliyohesabiwa na Scilab. Walakini, maadili haya hayafanani sawa na sisi usahihi wa chini lakini kasi ya sine.

Katika mzunguko wa safu ya mzunguko wa pato ni 1.25 na 3.75. sio lazima kupata thamani halisi kila wakati. kawaida nambari hizi huitwa mapipa ya masafa. kwa hivyo thamani ya pato inaweza kuwa mahali popote ndani ya mapipa maalum.

Kasi:

kwa Arduino nano inachukua:

Pointi 16: 4ms32 Pointi: 10ms Pointi 64: 26ms Pointi 128: 53ms

Hatua ya 6: Hitimisho

Nambari hii ya FFT inaweza kutumika katika matumizi ya wakati halisi. Kama inachukua karibu 30 ms kukamilisha hesabu. Walakini, azimio lake limepunguzwa na idadi ya sampuli. Idadi ya sampuli imepunguzwa na kumbukumbu ya Arduino. Kwa kutumia Arduino Mega au usahihi mwingine wa bodi ya utendaji inaweza kuboreshwa.

ikiwa una maswali, maoni, au marekebisho jisikie huru kutoa maoni.

Sasisha (2/5/21)

Sasisho: // ----------------------------- Kazi ya FFT ------------------------------ // kuelea FFT (int in , int N, Frequency ya kuelea)

Aina ya data ya N ilibadilishwa kuwa Nambari kamili (iliyopo Byte) kusaidia> ukubwa wa sampuli 255. Ikiwa saizi ya sampuli ni <= 128, aina ya data ya baiti inapaswa kutumika.

Ilipendekeza: