1 van 4

Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: za 26 jun 2010, 13:59
door Wimapon
Mijn radiotelescoop ontvangt een ruis spectrum van 3 KHz breed.

Ik wil hiervan bijvoorbeeld alleen het stukje van 400 tot 800 Hz overhouden.

uit mijn ontvanger komt laagfrequent ruis tussen 0 en 3 KHz.

Mijn AD covertor maakt hier gedurende een halve seconde 8192 getallen van.

Een FFT geeft een mooi spectrum van deze ruis.

Nu wil verder rekenen met slechts een smal bandje van dit spectrum.

Ik moet dus gaan filteren.

Hoe kan ik dit het beste doen?

Kom svp niet met ingewikkelde integralen etc, want ik ben wiskundig gezien een dummy.

Het liefst had ik een formule die ik rechtstreeks kan programmeren.

Een internet site die deze formule geeft is natuurlijk ook prima.

Eerdere pogingen zijn falicant mislukt.....

Vast heel erg bedankt.

Wim

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 17:52
door TD
Dit lijkt me eerder iets voor een technisch forum; verplaatst.

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 18:23
door mcs51mc
Waarom niet hardwarematig filteren adh van een band pass filter?

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 18:50
door Wimapon
Ik wil dit softwarematig doen omdat ik dan vrij ben om elke bandbreedte en elke plek binnen het spectrum

te kunnen gebruiken.

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 19:45
door mcs51mc
Filters, FFT en zo zijn niet direct mijn 'cup of tea' maar met de LabVIEW voorbeelden geraakt een mens soms ver.

Is dit wat je in gedachten had?

Afbeelding

Als je echt niets kan vinden, wil ik wel eens proberen een dll te maken van dat voorbeeld van NI.

DLL's heb ik ook nog nooit gemaakt ;) , EXE's en installers des te meer en dat lukt altijd wel vrij goed ;)

Ik weet niet waarmee je nu programmeert, maar als je een dll kunt aanspreken kan ik je misschien verder helpen.

Misschien moet je eerst eens een tabel van 8192 getallen posten, ik haal ze dan eens door die LV code en we zien wel wat eruit komt... ...

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 19:59
door Wimapon
mcs51mc,

Ja dat is ongeveer wat ik graag wil..

Ik wil wel alles zelf programmeren, omdat ik een hele pijplijn van programma's achter elkaar moet draaien.

(Voor vele uren rekenwerk)

Ik programmeer het snelle rekenwerk in Quick Basic en het grafische werk in Just Basic en ik kan geen

DLL aanspreken. Ik werk nog met DOS.

Ik wil wel een rij getallen posten, maar ik weet niet hoe dat moet.

( 8 maal 1024 is nog al veel)

Ik zal een plaatje posten van de FFT's en het signaal zelf van 2 simultane kanalen.

Dit is de data die ik gedurende 0.5 seconde ontvang.

Elk kanaal wil ik gaan filteren... bijvoorbeeld kies het stuk van 400 tot 800 Hz.

Sorry het lukt niet.

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 20:07
door Bert F
je hebt eigenlijk twee zaken nodig:

1)een fir

2)de convolutie

zie hier voor wat een fir is http://nl.wikipedia.org/wiki/FIR je moet wel nog de coëfficiënten vinden, normaal kan hier ook een programmatje voor vinden zelf gebruik ik daarvoor meestal matlab mss helpt dit: http://www.rocketdownload.com/program/fir-...der-169911.html (nooit zelf geprobeerd)

dan moet je de convolutie van deze getallen samen met je input waarden uitrekenen.

code hiervoor: http://www.codeguru.com/forum/showthread.php?threadid=442954 dit is hetzelfde als de recursieve som zoals in de fir.

Groeten.

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 20:31
door Wimapon
Bert F, ik ga proberen het te snappen.... Ik begrijp om te beginnen de betekenis van de diverse letters al niet,

dus ik vrees het ergste...

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 21:52
door Bert F
niet vrezen vraag maar als je iets niet begrijpt.

Een fir staat voor final impuls respons maar onthoud er gewoon voor dat fir een manier is om digitaal gemakkelijk te kunnen filteren.

Een convolutie is een manier om de berekening (van de fir) uit te voeren.

De convolutie is het geen wat je moet programmeren dat is een loop waarin je met ieder getal van de fir (de coëfficiënten genaamd) een produkt en nadien een som moet maken. Zie link wikipedia

Concreet moet je nu te weten komen welke coëfficiënten je nodig hebt voor je gewenste frequentie bandje te filteren deze gebruik je dan in je loopje ==>> bij het uitvoeren van de convolutie.

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 22:17
door 317070
Iets wat je sowieso zult moeten uitdokteren is de convolutie (kijk vooral naar de animaties). De formules ogen misschien wel ingewikkeld, maar zijn (vooral in discrete vorm) zeer gemakkelijk te programmeren. Het is een berekening die essentieel is voor signaalanalyse, misschien zelfs essentiëler dan een FFT.

Een filter in het frequentiedomein bestaat eigenlijk uit een convolutie nemen van je originele signaal. (in dit geval is een fir gesugereerd). Een geschikte fir vinden om tussen 400-800 kHz te filteren is wel niet zo simpel, tenzij je ze zelf wilt berekenen. ;)

Ik vraag me (voor je doel) af waarom je enkel buiten 400-800 kHz wil filteren? Zou je niet beter een ruisfilter zoeken die de ruis uit je signaal filtert, en signaal behoudt? Of (aangezien je 2 gelijkaardige signalen hebt) de kruiscorrelatie zoeken tussen de signalen? (eventueel in de fase?)

Misschien kun je beter zeggen wat je wil bereiken, dan een manier voorstellen om het te willen bereiken. ;)

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: zo 27 jun 2010, 23:30
door Wimapon
hoi 317070

Ik ben op dit moment al een stuk gevorderd met mijn radiotelescoop.

Ik heb al resultaat.

Inderdaad door kruiscorrelatie tussen de beide antenne signalen zie ik al een radiobron in de loop van een

dag voorbij komen! Ik zie dus dat de fase tussen de beide antenne signalen verandert.

Toch gaat er van alles mis... een goede calibratie wil niet lukken.

uit het testen van mijn ontvangers blijkt dat ze niet voor elke frequentie binnen de 3 KC/s dezelfde fase

opleveren. Ik denk dat dit de calibratie "verziekt".

Het blijkt dat de fase afhankelijk is van de frequentie... ik weet niet waardoor dit komt.

Dit probleem moet ik hardwarematig oplossen en dat is me nu even teveel werk.

daarom wil ik eens proberen met slechts een deel van het ruisbandje van 3 KC/s te gaan rekenen.

en dan te zien of de calibratie beter zal gaan.

Maar dan moet ik eerst in staat zijn om goed te filteren.

Dus vandaar mijn vraag;

Het is me nu trouwens gelukt , met de kennis van Wikipedia IIR-filteren , een laagdoorlaatfilter en een

hoogdoorlaatfilter te maken.....

Nu nog uitvinden hoe ik een bandfilter maak..

Het probleem is dat ik betekenis van de gebruikte letters in de formules niet ken.

Maar omdat ik de uitleg in "woorden" wel snap kan ik het programmeren, en werkt het ook nog!

Na wat verder studeren zal ik hierover , hier vragen stellen...

(Ik vind het allemaal vreselijk moeilijk hoor.... )

O ja.. de ruis wegfilteren en het signaal behouden is niet zo eenvoudig omdat het signaal zelf ook ruis is.....

Elke radiobron geeft ruis... de som van al die ruizen ontvang ik met mijn ontvangers....

Op mijn site kun je de grafieken van de eerste resultaten zien

"http://home.kpn.nl/apon001/huis.htm" ( zie hoofdje Phasing interferemotry)

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: ma 28 jun 2010, 07:41
door mcs51mc
Wimapon schreef:Het is me nu trouwens gelukt , met de kennis van Wikipedia IIR-filteren , een laagdoorlaatfilter en een

hoogdoorlaatfilter te maken.....

Nu nog uitvinden hoe ik een bandfilter maak..
Is dat niet gewoon de twee na elkaar uitvoeren?

Eerst laagdoorlaat met 800Hz cut off (alles onder de 800Hz wordt behouden)

Dan hoogdoorlaat met 400Hz cut off (alles boven de 400Hz wordt behouden)

Finaal hou je enkel alles over tussen 400 & 800Hz.

Of zie ik het te simpel ;)

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: ma 28 jun 2010, 09:38
door Wimapon
mcs51mc,

Ja, ik denk dat het inderdaad zo zal moeten, alleen heb ik nog niet gevonden hoe je een cut-off frequentie

kan ingeven.....

Ik doe nu een hoogdoorlaatfilter maken door:

voor elke i: -----> x(i) = x(i+1) - x(i) te doen.

Dit kan ik dan een aantal maal herhalen om de curve steiler te maken.

Ik weet nog niet wat er met de faseinhoud gaat gebeuren.. maar dat zal de eerste dag-berekening wel tonen.

Een laagdoorlaatfilter gaat ongeveer net zo.

Dus er is nergens sprake van een cufoff frequentie.

Het is zo jammer dat ik hier geen plaatjes kan posten... dan kon ik je het laten zien.

mijn plaatjes zijn als jpg minimaal 200 KBytes groot

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: ma 28 jun 2010, 12:28
door Wimapon
http://home.kpn.nl/apon001/fringes1.jpg

testje hoe moet ik nu het url van een plaatje invoeren.... ik klik op "voeg een afbeelding in" maar... noppes

Re: Ik zoek een algoritme om een ruisbandje te filteren.

Geplaatst: ma 28 jun 2010, 12:52
door 317070
mcs51mc schreef:Is dat niet gewoon de twee na elkaar uitvoeren?

Eerst laagdoorlaat met 800Hz cut off (alles onder de 800Hz wordt behouden)

Dan hoogdoorlaat met 400Hz cut off (alles boven de 400Hz wordt behouden)

Finaal hou je enkel alles over tussen 400 & 800Hz.

Of zie ik het te simpel ;)
Nee, dat is de algemene manier om het (snel) te doen. Het probleem is wel dat de vervorming te groot kan worden als je filters een afwijkende breekfrequentie hebben als je dit bij willekeurige filters zou doen.
Wimapon schreef:mcs51mc,

Ja, ik denk dat het inderdaad zo zal moeten, alleen heb ik nog niet gevonden hoe je een cut-off frequentie

kan ingeven.....

Ik doe nu een hoogdoorlaatfilter maken door:

voor elke i: -----> x(i) = x(i+1) - x(i) te doen.

Dit kan ik dan een aantal maal herhalen om de curve steiler te maken.

Ik weet nog niet wat er met de faseinhoud gaat gebeuren.. maar dat zal de eerste dag-berekening wel tonen.

Een laagdoorlaatfilter gaat ongeveer net zo.

Dus er is nergens sprake van een cufoff frequentie.
Dat is inderdaad een IIR-filter (de eenvoudigste). Degene die je hier vermeld zijn echter niet echt goede filters, aangezien ze je signaal sterk vervormen. (en ze nauwelijks filteren; eigenlijk zijn deze enkel geschikt in theorie als basis om uit te leggen hoe filters ongeveer werken)

Als je wilt, wil ik wel eens kijken om een IIR-filter te maken tussen 400Hz en 800Hz, maar ik wil dit enkel maar doen als je zeker bent van je stuk. Je kunt achteraf niet zomaar eenvoudig die breekfrequenties een beetje verplaatsen.

Dat, en je moet je samplingfrequentie eens meegeven. Ik vermoed dat je niet aan exact 6000Hz samplet?

Ik heb dus snel even gekeken: ik heb hier een handige tool gevonden: http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

De relatie moet er dus als volgt uit zien:

Code: Selecteer alles

Recurrence relation:

y[n] = (  1 * x[n-20])

 + (  0 * x[n-19])

 + (-10 * x[n-18])

 + (  0 * x[n-17])

 + ( 45 * x[n-16])

 + (  0 * x[n-15])

 + (-120 * x[n-14])

 + (  0 * x[n-13])

 + (210 * x[n-12])

 + (  0 * x[n-11])

 + (-252 * x[n-10])

 + (  0 * x[n- 9])

 + (210 * x[n- 8])

 + (  0 * x[n- 7])

 + (-120 * x[n- 6])

 + (  0 * x[n- 5])

 + ( 45 * x[n- 4])

 + (  0 * x[n- 3])

 + (-10 * x[n- 2])

 + (  0 * x[n- 1])

 + (  1 * x[n- 0])

 + ( -0.0017820875 * y[n-20])

 + (  0.0387309183 * y[n-19])

 + ( -0.4111305294 * y[n-18])

 + (  2.8308581223 * y[n-17])

 + (-14.1680177848 * y[n-16])

 + ( 54.7519171722 * y[n-15])

 + (-169.4387712114 * y[n-14])

 + (429.8313691642 * y[n-13])

 + (-907.5633411356 * y[n-12])

 + (1610.3756932883 * y[n-11])

 + (-2414.0692545962 * y[n-10])

 + (3062.2622671977 * y[n- 9])

 + (-3280.7595198059 * y[n- 8])

 + (2951.7958480361 * y[n- 7])

 + (-2207.9535492666 * y[n- 6])

 + (1351.3740145742 * y[n- 5])

 + (-660.5471327188 * y[n- 4])

 + (248.3330369343 * y[n- 3])

 + (-67.4932385300 * y[n- 2])

 + ( 11.8120011380 * y[n- 1])
met y(n) de uitgang en x[n] de ingang. Dit zou een 20-polige Bessel-banddoorlaatfilter moeten zijn. Let er dus op dat je dus niet je signaal gaat kunnen overschrijven zoals je vroeger deed, maar dat je een nieuw signaal gaat moeten maken!

Ik heb nu vooral gezorgd voor een sterke attenuatie (dus dat overtollige frequenties sterk onderdrukt worden), hierdoor is het signaal dat je wil behouden wel wat meer vervormd, dat is altijd een afweging die je moet maken.

De filter ziet er zo uit:

Afbeelding