FFT eller filter i PIC eller Atmel?
FFT eller filter i PIC eller Atmel?
Hej!
Jag har en liten fråga angående ett kommande projekt.
Jag skulle vilja mäta amplituden på tre till fem frekvenser med en uC.
Frekvenserna ska ligga inom 20-20k och vara variabla.
Ex:
50Hz = -50dB
250Hz = 30dB
osv..
Man ska även kunna ställa in en gate nivå för varje frekvens.
Så om tex 250Hz överstiger 0dB så kanske port A0 blir ett.
Vad tror ni om det?
/Hampus
Jag har en liten fråga angående ett kommande projekt.
Jag skulle vilja mäta amplituden på tre till fem frekvenser med en uC.
Frekvenserna ska ligga inom 20-20k och vara variabla.
Ex:
50Hz = -50dB
250Hz = 30dB
osv..
Man ska även kunna ställa in en gate nivå för varje frekvens.
Så om tex 250Hz överstiger 0dB så kanske port A0 blir ett.
Vad tror ni om det?
/Hampus
Titta på goertzel:s algorithm, bra för detektering av ett fåtal toner och magnituden^2 ramlar ut enkelt...dessutom kan nästan alla beräkningar ske samtidigt som man samplar signalen = inget behov av att lagra ett "fönster" som med FFT t.ex.:
http://www.embedded.com/story/OEG20020819S0057
Håller för tillfället på att trycka in den i en ATMega8 för 15 frekvenser mellan 900Hz och 2500Hz...
http://www.embedded.com/story/OEG20020819S0057
Håller för tillfället på att trycka in den i en ATMega8 för 15 frekvenser mellan 900Hz och 2500Hz...
Det beror förstås på om man måste hinna behandla all data som kommer in, om det räcker att FFT:a ett "fönster" varje sekund eller så är det betydligt lättare. PIC18 har ju hårdvaru 8x8 mul, och dsPIC har förstås en 16x16 MAC-enhet.
Men alla har ont om minne för att lagra datan...
Goertzels algoritm låter ju faktiskt väldigt bra av den anledningen, hade aldrig hört talas om den.
Men alla har ont om minne för att lagra datan...
Goertzels algoritm låter ju faktiskt väldigt bra av den anledningen, hade aldrig hört talas om den.
Tack för visat intresse!
Har kikat lite på Goertzel algoritmen nu och den verkar passa till det här.
Framför allt den optimerade versionen.
Jag hade inte heller hört talas om den tidigare och det verkar inte finnas
så mycket info om den som man förväntat sig.
Frågan är hur lång tid den skulle ta att exekvera i en PIC eller en Mega. (rimmar!)
zus: Hur många gånger per sek uppdateras din data
och vilken typ använder du?
Jag har ingen som hellst erfarenhet av varken FFT eller digitalafilter,
men ska helt klart dyka djupare i det här.
Kan va bra till många saker.
/Hampus
Har kikat lite på Goertzel algoritmen nu och den verkar passa till det här.
Framför allt den optimerade versionen.
Jag hade inte heller hört talas om den tidigare och det verkar inte finnas
så mycket info om den som man förväntat sig.
Frågan är hur lång tid den skulle ta att exekvera i en PIC eller en Mega. (rimmar!)
zus: Hur många gånger per sek uppdateras din data
och vilken typ använder du?
Jag har ingen som hellst erfarenhet av varken FFT eller digitalafilter,
men ska helt klart dyka djupare i det här.
Kan va bra till många saker.
/Hampus
Ska erkänna att jag inte heller hört talas om goertzel innan vi började med detta projektet, vilket för övrigt ska bli en dekoder för CCIR-selektiv. Processorn ligger och samplar en signal hela tiden och letar efter godkända toner. I system-80 kommer tonerna 5 i följd, den första ska enligt standard vara 100ms eller längre och de efterföljande 80ms...
Kanske kommer redovisa kod och hårdvara här sedan - annars är det väl offentlig handling iaf. när vi lämnat in det (projektkurs på högskolan)...
cyr: Gick inte du också på LiTH?
Kanske kommer redovisa kod och hårdvara här sedan - annars är det väl offentlig handling iaf. när vi lämnat in det (projektkurs på högskolan)...
cyr: Gick inte du också på LiTH?
Jo jag pluggar på LiTH, men jag har inte hört talas om goertzel ändå - iaf inte vad jag kommer ihåg
En processor med hårdvarumultiplier av något slag fixar det nog utan problem i t.ex. 44KHz samplerate.

Det ser inte ut att vara mer än 1 multiplikation och några additioner per sampel, per ton. Om jag fattat det rätt.cosmox skrev: Frågan är hur lång tid den skulle ta att exekvera i en PIC eller en Mega. (rimmar!)
En processor med hårdvarumultiplier av något slag fixar det nog utan problem i t.ex. 44KHz samplerate.
Ja, hårdvarumultiplikation är nödvändigt - iaf. med lite högre frekvenser. Som det ser ut nu kommer vi i projektet använda 8kHz samplerate => 2000 instruktioner för beräkningar vid varje sample...men så har vi ju 15 toner också....
...med frekvenser på ~20kHz är det ju nödvändigt med en samplerate om >40kHz och då blir det lite smått om beräkningsutrymme kvar i en ATMega8 (16MHz)....
Det är en stor fördel om man kan använda en processor med flyttalaritmetik. Men det går att skala upp konstanterna och använda heltal också...
...återkommer med resultat när projektet är färdigt...
...med frekvenser på ~20kHz är det ju nödvändigt med en samplerate om >40kHz och då blir det lite smått om beräkningsutrymme kvar i en ATMega8 (16MHz)....
Det är en stor fördel om man kan använda en processor med flyttalaritmetik. Men det går att skala upp konstanterna och använda heltal också...
...återkommer med resultat när projektet är färdigt...
Tack för alla svar!
Nu har jag kollat på Goertzel algoritmen lite mer.
Cyr: Så har jag oxå fattat det. Jag tänkte att man kanske kunde använda
en av PICs kretsar i 18F serien, dom har ju 8x8 hwmul i sig.
Nu är jag ingen hejjare på ASM men jag ska försöka skriva ett litet test prog
och se vad som händer.
Är det en fördel att använda extern ADC i det här fallet?
Avlastar man uCn på något vis då?
Jag tror att det skulle räcka med en 8bits ADC.
Jag läste i Circut Cellar (tror jag det var) om ett litet chip (8 pins DIL) som
innehöll en flyttals matte processor. en sådan kanske skulle passa, om man nu får
tag i en.
/Hampus
Nu har jag kollat på Goertzel algoritmen lite mer.
Cyr: Så har jag oxå fattat det. Jag tänkte att man kanske kunde använda
en av PICs kretsar i 18F serien, dom har ju 8x8 hwmul i sig.
Nu är jag ingen hejjare på ASM men jag ska försöka skriva ett litet test prog
och se vad som händer.
Är det en fördel att använda extern ADC i det här fallet?
Avlastar man uCn på något vis då?
Jag tror att det skulle räcka med en 8bits ADC.
Jag läste i Circut Cellar (tror jag det var) om ett litet chip (8 pins DIL) som
innehöll en flyttals matte processor. en sådan kanske skulle passa, om man nu får
tag i en.
/Hampus
Matseng: Ja, det var i2c.The internal microcontroller (CY8C27143) has 16K of Flash memory that is clocked at a whopping internal 24MHz! This allows for much faster and more powerful computations
Cyr: Ja, det verkar så.
Det kan ju vara bra att låta den ta hand om matteoperationer medans uCn pysslar med något annat.
Jag kikade bara som hastigast på instruktions tabellen, men tyckte att det verkade gå ganska fort.
Det skulle vara kul att få en sample o testa lite iaf.
/Hampus
EDIT: Matseng: jag läste fel.
Vad gäller extern ADC...tror inte det spelar någon större roll....om du ändå tänker köra med en uC med inbyggd ADC....
Det går ju nämligen att ligga ett block efter med beräkningarna och att läsa in en sample ifrån uC:ns interna register eller en extern ADC är ju ganska likvärdigt...förutom att man inte behöver använda 8+ datapinnar om man kör med en intern...
Det går ju nämligen att ligga ett block efter med beräkningarna och att läsa in en sample ifrån uC:ns interna register eller en extern ADC är ju ganska likvärdigt...förutom att man inte behöver använda 8+ datapinnar om man kör med en intern...