Känna igen ljud?

Planering och tankar kring eventuella framtida projekt.
Användarvisningsbild
zus
Inlägg: 198
Blev medlem: 14 december 2003, 11:34:08
Ort: Göteborg

Inlägg av zus »

Det kan nog bli lite småjobbigt att räkna goertzel i en pic - därmed inte sagt att det är omöjligt - i ett projektarbete i våras använde vi den metoden för ccir-avkodning och implementerade det i en ATMega8 @ 16MHz. Blev lite småjobbigt att räkna amplituden av 15 toner trots att vi bara samplade i 8kHz. Den stora fördelen med goertzel är att man inte behöver utföra några trig. beräkningar under körning, bara multiplikationer. Dessa multiplikationer blir dock mycket jobbiga när man måste implementera dem helt i mjukvara. ATMegan har ju faktiskt heltalsmultiplikation, men bara 8x8->16bitar om jag inte minns fel = otillräckligt. Vill du göra det enkelt för dig - använd en processor med flyttasoperationer, vill du ha det halvsvårt - använd en processor med någon typ av hårdvarumultiplikation och vill du att det ska vara jättejobbigt - använd en processor helt utan hårdvarumultiplikator...
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Inlägg av arvidb »

Det fina med Goertzels algoritm är just att den i princip inte kräver något minne - du matar bara in en sample i taget och får ut ett svar efter N samples.

zus, skulle 16x16->32 bitar räcka? I så fall är MSP430F149 en bra mikrokontroller: 16-bitars helt igenom, hårdvarumultiplikation 16x16->32, 12-bitars ADC, och kostar 133:- exkl moms på Elfa. Dessutom är det jättesmidigt att programmera C för den m.h.a. msp430-gcc (port av gcc).

Jag hade turen att få lära mig den på mitt sommarjobb och har skrivit en liten kom-igång-sida (specifik för labkortet den satt på - ESB - och Nadas Red Hat-datorer, men en del kan nog vara nyttigt i alla fall): http://www.student.nada.kth.se/~d97-abr/ESB/

Arvid
Användarvisningsbild
zus
Inlägg: 198
Blev medlem: 14 december 2003, 11:34:08
Ort: Göteborg

Inlägg av zus »

16x16->32 räcker nog långt, men är det inte flyttal har man fortfarande bekymmer med hur man ska skala upp det hela för att behålla en hyffsad noggrannhet. Kommer inte ihåg i detta nu hur vi lagrade amplituden, men tror att det var med 32 eller 48 bitar. Sen är det ju en stor fördel om man får och kan programmera i C också. I vårt fall var det omöjligt av två anledningar, dels behövdes optimeringarna man får genom att "smartkoda" i assembler och dels så fick vi helt enkelt inte använda något annat än assembler i proj.

Ett litet tips till den som ska försöka sig på något liknande: Skriv en "prototyp" i c för en vanlig pc och se om det fungerar - i alla fall för själva signabearbetningen: Om det fungerar så är det "bara" att flytta det till mikrokontrollern sen...
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Orkade inte lusläsade hela tråden men jag har i af implementerat Goertzel i en atmega32, skrivet i C.
Använder den som nummerpresentatör.

Om Goertzel är den bästa vägen att gå beror på hur mång toner du vill få fram.
Beräkning av 8 olika frekvenser är likvärdig med en 256-punkters fft, detta beror på att goertzel är av ordningen n^2 medans fft:n är log2(n).
Det man spar på med Goertzel är att beräkningen kan göras efter att varje sampel har kommit in.

Du kan ta en titt på min rapport här, källkod finns i slutet:
http://student.itn.liu.se/~frejo242/temp/rapport.doc

Kan tillägga att när jag började med uppgiften hade jag inte riktigt koll på Goertzel och alla beräkningarna görs därför efter samplingen, så det finns lite optimeringar att göra på koden ifall man vill få det riktigt snabbt. Som det är nu plockar den ungefär halva telefonnummret när det ringer här hemma, kör jag med en något långsammare ljudfil från datorn fungerar det felfritt.

Ang. amplituden känns det inte direkt relevant, inte i den tillämpningen jag gjorde.
Fanns tonen man letade efter var amplituden 30-70 och fanns den inte var amplituden närmare noll, min idé för att snabba upp det hela är gå över till 16-bitars fixed point med 5 bitar heltalsdel och 11 bitar decimaldel. Det gör ju inget att amplituden trycks ner till max 32 då man ändå bara intresserad av om tonen finns eller ej. Googla på "fixed-point arithtmetics" om du vill läsa mer om det.
Rollo
Inlägg: 217
Blev medlem: 2 januari 2004, 19:23:29

Inlägg av Rollo »

oj här var det full rulle... grymt kul att folk angagerar sig.!

Vi är som sagt väldigt tidigt i utvecklingen men gör allt för att komma igång. Min lärare tyckte att det såg väldigt intressant med den sidan som Schnegelwerfer länkade till..

Vi ska inom den närmsta tiden spela in en polisbil i olika förhållanden; stilla, 50 km/h och 100 km/h för att kolla upp hur stor frekvensskillnaden är pga. dopplereffekten..

Verkar vara lite olika bud, zus tycker att det är jättesvårt att använda en "vanlig" PIC, medans andra tycker att det är lätt att implementera goerzel i en PIC..

Angående hur många frekvenser jag letar efter, så räcker det ju med en i taget.. dvs. att den först letar efter "Beeee", hittar den detta, letar den efter "Boooo"...

Problemet att det finns olika sirener (Vanlig polis, "amerikansk" polis, brandbil etc.) är väl bara att tillåta flera olika frekvenser av den samplade signalen..

Hoppas ni förstår, det är svårt att härma ljud på Internet =)

*edit* Nu förstod jag vad Jimmy skrev:P en frekvenslista är inget att föredra, men jag tänkte på en sak.

Om man kör på den medelvärdesprincipen, ska man jämföra ljud 2 men nästa ljud 1 också? gör man inte det, och ljud1 innehåller sirenljud, märker den inen skillnad på nästa ljud2 och sirenen märks inte förrän den har slutat.
Användarvisningsbild
JimmyAndersson
Inlägg: 26470
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Rollo: Jo, man måste jämföra ljud 2 med nästa ljud 1. Det har du rätt i.

Frejo: Goertzel använder ju sig av ett antal fasta frekvenser. Det gör att den principen skulle kräva en jättelång frekvenslista, speciellt med tanke på att en t.ex polisbils siren skulle variera ganska mycket pga dopplereffekten.

Låt säga att listan innehåller frekvenserna 600, 615, 620 osv... Det innebär att om man ska täcka området 600-2000Hz så kräver det en lista med 280 frekvenser. Kör man med 2Hz mellan varje frekvens så blir det istället en lista med 700 frekvenser. Det skulle krävas ganska mycket minne....
(Nu vore det lite konstigt om alla frekvenser man behövde läsa av fanns med 2 eller 5Hz mellanrum, men ni förstår principen.)

Med min variant behöver man bara komma ihåg några få frekvenser, (de som används för jämförelsena), plus lite minne för några hundra mikrosekunders samplingstid per sampling.
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

ah, där får man för att man inte lusläser allt ;)

Ja med så många frekvenser är Goertzel ohanterbar, som sagt, 8 punkters motsvarar 256-punkters fft...
så jag skulle nog satsa på en fft i detta fall, har sett ett väldigt bra libb för avr:n på nätet för just detta men kan inte hitta det nu :S
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Hittade den här tråden "bakvägen" från google... sökte efter algoritmer för DTMF. Den här tråden var ju intressant. Men hur har det gått för dig Rollo?! Har ni mätt upp dopplereffekten?
Jag höll på med det där när jag läste Fysik B på disans... jag "transponerade fram" ljudet av en polisbil som passerade på en väg som jag stod x meter ifrån. Har för mig att matten inte var så speciellt svår. Minns inte riktigt, men det var nog bara något i stil med:
f_doppler = hastigheten * f_orginal * k; (där k är någon konstant... möjligt att det inte var linjärt också, men google kanske kan ge någon formel.)
Rollo
Inlägg: 217
Blev medlem: 2 januari 2004, 19:23:29

Inlägg av Rollo »

Hej hej!

Jag tyckte jag kände igen titeln på denna tråd :)

Tyvärr har jag inget att komma med, vi släppte Goertzel-tekniken och byggde produkten runt två analoga ljudfilter och lite logik.

Fungerade helt okej! Inte ens musik i bakgrunden störde tillräckligt mycket för att den skulle falsklarma..

Hoppas du får någon klarhet i det hela..

*edit*

Angående Dopplereffekten märkte vi ingen större skillnad. Vi insåg att vi endast var intresserade av när ljudet närmade sig, därför lade vi frekvensomgånget något högre(?) än normalt.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Vad byggde ni för pryl egentligen? En snutvarnare eller? :lol:
Rollo
Inlägg: 217
Blev medlem: 2 januari 2004, 19:23:29

Inlägg av Rollo »

Ärligt talat, JA!

Fast i lagligt utförande. Tanken var att prylen skulle "höra" ett utryckningsfordons sirén innan föraren. Detta skulle göra trafikanter mer uppmärksamma...

Fungerade inte riktigt i praktiken... Men det var roligt!
Användarvisningsbild
JimmyAndersson
Inlägg: 26470
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Bra idé. :)

Rollo:
"Fungerade helt okej! Inte ens musik i bakgrunden störde tillräckligt mycket för att den skulle falsklarma..
Angående Dopplereffekten märkte vi ingen större skillnad."


Alltid lika kul när man har rätt. 8)
Jag skrev ju tidigare:
"Båda "tuten" förändras ju lika mycket eftersom de befinner sig på samma avstånd till 'lyssnaren'. (Visserligen förändras en mörk ton annorlunda än en ljus, men på en t.ex polistuta så ligger tonerna så lika att man inte behöver tänka på det i detta fall.)"
:)
Skriv svar