Mi a jel frekvenciája? (solution needed)

Greg sez:

van egy periodikus jelem amit folyamatosan mintavételezek. ebben kellene megnéznem mi a jel frekvenciája. erre kellene egy egyszerű algoritmus, hogy megtaláljam a maximumokat, aztán a két csúcs közötti idő alapján már ugye megvan a frekcencia… mezei treshold-ot nem akarok használni, mert különböző amplitúdójú jelek frekvenciáját is meg kell tudni mondani.

és persze legyen egyszerű, mert egyrészt fel kell fognom :) másrészt mikrokontrollerben kell megoldani a feladatot wiring nyelven. :)

Értem a problémát! Emberek! Tanuljunk! Hogy kell megoldani ezt?

Annyit már gyorsan kiwikiztem, hogy a mikrokontroller egy baromi egyszerű és olcsó integrált CPU, vagyis nem csak a processzor, hanem némi memória (RAM, ROM, Flash) és input/output interfészek is van benne, ami mindenféle egyszerű felhasználásra alkalmazható. Keveset fogyaszt, olcsó, legtöbb alkalmazáshoz remek. Példák: távirányítók, motor vezérlő rendszerek, irodai eszközök, játékok. Érdekes adat:

About 55% of all CPUs sold in the world are 8-bit microcontrollers. According to Semico, Over 4 billion 8-bit microcontrollers were sold in 2006.

Az most nem érdekes, hogy Greg mire akarja használni a projektet, nyilvánvalóan egy csapásszámlálót akar építeni, illetve egyszerűbben mondva, faszkorbácsot.

Namasté.

update: Greg adott egy grafikont is, illetve néhány további komment előjön a hozzászólás folyamban.

az ekg nagyon jó hasonlat, ezért mezei szélsőérték vizsgálat nem elegendő. csináltam egy mintát, a wiimote -ot végigtologatva a nappali padlóján, kicsit gyorsítva menet közben. ebben kellene a 6 csúcsot megtalálni algoritmikusan, illetve mindig csak az utolsó kettő az érdekes.

(…)

kérdeztétek a platformot: Arduino, open source embedded hardware. Én a kisebb fogyasztású, méretű változatot tervezem használni, ami 8MHz -en ketyeg. 14 általános, digitális I/O láb, 6 analóg bemenet amik közül tetszőleges számú digitális kimenetként is üzemelhet. 1KB RAM, 512byte eeprom… 40mA áramfelvétel.

27 hozzászólás

TBS

Periodikus jelnél (frekvencia, ugye) a küszöb is működik akármilyen amplitúdó mellett… ;)

Kevés az infó. Mérési tartomány, mérendő jelalak, stb.

“Amit nem lehet megírni assemblyben, azt nem lehet megírni!”

Amúgy nem csúcsokat keresnék (érdekel a MÉRETE..?), hanem megfelelő analóg jelformálás után az AD folyam előjelváltásait… Stb.

tfe

Eloszor is meg kell hatarozni a legnagyobb merendo frekvenciat (megbecsulni, hogy kb mennyi lesz), a mintavetelezes frekvenciajat ennek megfeleloen kell mevalasztani (van vmi keplet amire nem emlekszem mar :)

Pontos freki meghatarozashoz egy furier analizis kell, google az algoritmusra. Nem lesz egyszeru… Viszont ha valamilyen ismert kontrollerrel dolgozik Greg akkor tobb mint valoszinu hogy fog kesz kodot talalni a problemara, amit csak kicsit hekkelni kell. (nepszeruenk pl. a PIC, Atmel etc.)

Mikrokontroller: annyiban kulonbozik egy CPU-tol, hogy memoria (data+code) illetve portok vannak egybetokozva a CPU-val. A “baromi egyszeru CPU” nem igazan fedi a valosagot :) Az ar meg relativ, vannak baromi draga kontrollerek is.

tfe

PS: legegyszerubb keresni egy villanymernokot, aki Háréből/Jelekből penge volt az egyetemen, es tud segiteni neked. Nem rocket science, de azert nem is egy HelloWorld!

tfe

PS2: Egy DSP-vel (Digital Signal Processor) lehet hogy egyszerubb lenne megoldani a feladatot, azokat erre talaltak ki.

Van egy ismerosom aki uzemeltet egy (magyar) levlistat a temaban (mindenfele mikrokontroller programozas es egyeb elektronika) Ott biztosan lesz valaki aki tud segiteni. Ha erdekel dobj egy mailt, utananezek hogy lehet feliratkozni.

TBS

DFT? DSP? Mit vízionáltok Ti itt épp..? Ez már pont “rocket science”… :D

Az infó továbbra is kevés.

Zsolt

Lehet valóban azt is csinálni, hogy a maximumokat számolod, de az csak impulzus-jellegű jelalaknál jó, amúgy félrevezető lehet.

A politikailag korrekt megoldás az FFT, azaz gyors Fourier transzformáció. Ehhez persze megfelelően kell mintavételezni. Ha jól emlékszem az aliasingot úgy lehet elkerülni (ami egy evil thing lenne), hogy ha mondjuk 0 és 10 Hz között akarod az FFT-t, akkor minimum 20Hz -el mintavételezel.

mazsi

szerintem elso korben nyugodtan hasznalj egyszeru threshold-ot:
- ha a jeled bipolaris, akkor a kuszobszint lehet 0
- ha nem az, de az alapvonal stabil, akkor a kuszobszintet tedd picit a fele
- ha ez sem igaz, de az alapvonal csak lassan maszik, akkor a kuszobot allitsd a jel atlagertekere (mondjuk nehany [tiz] periodusidore szamolva)
- ha meg ez sem igaz, akkor lehet, hogy egy microcontroller nem eleg

ha zajos a jel, akkor esetleg erdemes egy moving average-et tenni ra (par mintat hasznalva).

turista

Szerintem Nyquist-Shannon :) , mert a “sima” Nyquist-tétel csak a PI/periódusidőre mondja ki a mintavételi frekvencia minimumát.

greg

Küldtem Józsinak linket a táblázatokhoz, illetve a grafikonhoz amin látszik kb milyen a jel. Annyit kell tudni, hogy egy olimpikon kajakos sprintben 100-130 csapást produkál percenként. Ez a alapján a mintavételi frekvencia 100-120Hz körül lesz.

Mint az a grafikonon is látszik, az eredeti jel elég zajos, ezért csináltam két szűrőt (mozgóátlag, IIR szűrő) és az látszik, nagyon hasonló az eredő jel hasznossága, ezért maradok a mozgóáltagnál, mert azt kevesebb clock-ból, processzor műveletből meg lehet oldani.

greg

Ja és kérdeztétek a platformot: Arduino, open source embedded hardware. Én a kisebb fogyasztású, méretű változatot tervezem használni, ami 8MHz -en ketyeg. 14 általános, digitális I/O láb, 6 analóg bemenet amik közül tetszőleges számú digitális kimenetként is üzemelhet. 1KB RAM, 512byte eeprom… 40mA áramfelvétel.

Ger

Ez egy Atmel kontrolleres struktúra (egy kis környezet, mint a basic-stamp), ráadásul nem is egyszerű mikrokontrollerekkel. Lehet, hogy jobban jársz, ha valami célhardvert illesztesz ehhez (DSP vagy FFT).
Esetleg csinálsz egy célharvert (trigger, számláló, komparátor, soksikert :-) )

Ha még nem kötelezted el magad, akkor nézzél egyszerűbb dolgot. Nekem az INTEL kontroller már bonyolult volt (túl sok címzés, túl sok regiszter), szerény Assembly ismereteimhez.
A PIC ilyen szempontból szimpatikusabb. C-ben és Assemblyben is könnyű programozni, nagyon széles a hardver-kínálat. Most már van soros programozás is, ami miatt az illesztös könnyű. Nagyon sok cuccot le lehet szedni internetről.

medoc

Greg, csak nem egy Szub-Éta Deket-O-Métert akaesz építeni? :)

greg

Szenyo: a papírral az a baj, hogy a kajakban elázik miközben lapátolsz, a ceruzát meg nehéz megfogni a lapát mellé :)

azért arduino, mert könnyen programozható. aki látott már C-t, azt 5 perc alatt otthon érzi magát. az open source jelleg miatt rengeteg tudás van már amit nem kell nekem végigszopni és sok extra kütyü kapható hozzá. illetve olyan kompatibilis hw alternatívát választok ami az én célomra a legjobb, hiszen maga a hw is “open source” bárki gyárthat saját, okosított verziókat.

ráadásul olcsó technika, 3500 ft körül megvan az agy, ami már ciripel, villog. ehhez képest a dsp -s megoldás kb egy nagyságrenddel drágább. nagyobb, többet is fogyaszt. overkill. bőven elég ide egy mikrokontroller.

TBS

Volna 1 kérdésem. Melyik összetevő frekvenciájára vagy kíváncsi..? Ez eléggé DFT/FFT-ért kiáltó jelecske, abból meg válogathatod a mérőablak domináns frekijét egyszerű sorttal.

Mondjuk egy kondis csatolással az AD előtt eltüntetheted a “mozgóátlagot”, bár azt sejtem, hogy nem te digizel. Ha nem te digizel, akkor biza a szoftveres erőforrásigény lesz nagy.

Ha pontatlan és “olcsó” megoldás kellene nekem, akkor nézném az előjelváltásokat a mozgóátlaghoz viszonyítva, stb…

(Egy pici PIC 2 pillanat alatt FFT-zik neked izzadás nélkül évekig egy 4.5V-os zsebtelepről. ;) )

pozsy

Le tudnam valahonnan tolteni a pelda adatsort valami tablazatos formaban? Nem akarok hulyesegeket mondani, de lenne par konkret otletem csak elobb kiprobalnam oket.

tfe

greg:

Ha jol ertem a kihivast a DFT/FFT implementacio adja, erre valoban jobb egy DSP (PIC). Azok olcsok, valoszinuleg talalhato ahhoz is hasonlo osszeszerelt panel es nem kell implementalni az algoritmust, mert adott hardverben. Gondolom atmel is gyart olcso DSP/uC-t, ott pedig ugyanazt a C-t hasznalhatod mint ennel a panelnel.

ern0

Greg, hagyd a picsába a matematikát! Vond ki a szomszédos értékeket, és ezt a delta számsort nézd meg a szemeddel, rá fogsz jönni a megoldásra.