Springen naar inhoud

Ik zoek een algoritme om een ruisbandje te filteren.


  • Log in om te kunnen reageren

#1

Wimapon

    Wimapon


  • >100 berichten
  • 114 berichten
  • Ervaren gebruiker

Geplaatst op 26 juni 2010 - 12:59

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

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

TD

    TD


  • >5k berichten
  • 24049 berichten
  • VIP

Geplaatst op 27 juni 2010 - 16:52

Dit lijkt me eerder iets voor een technisch forum; verplaatst.
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

#3

mcs51mc

    mcs51mc


  • >250 berichten
  • 470 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 17:23

Waarom niet hardwarematig filteren adh van een band pass filter?

#4

Wimapon

    Wimapon


  • >100 berichten
  • 114 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 17:50

Ik wil dit softwarematig doen omdat ik dan vrij ben om elke bandbreedte en elke plek binnen het spectrum
te kunnen gebruiken.

#5

mcs51mc

    mcs51mc


  • >250 berichten
  • 470 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 18:45

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?
Geplaatste 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... ...

#6

Wimapon

    Wimapon


  • >100 berichten
  • 114 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 18:59

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.

Veranderd door Wimapon, 27 juni 2010 - 19:11


#7

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 19:07

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.rocketdow...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....threadid=442954 dit is hetzelfde als de recursieve som zoals in de fir.

Groeten.

#8

Wimapon

    Wimapon


  • >100 berichten
  • 114 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 19:31

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...

#9

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 20:52

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.

#10

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 27 juni 2010 - 21:17

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. ;)

Veranderd door 317070, 27 juni 2010 - 21:18

What it all comes down to, is that I haven't got it all figured out just yet
And I've got one hand in my pocket and the other one is giving the peace sign
-Alanis Morisette-

#11

Wimapon

    Wimapon


  • >100 berichten
  • 114 berichten
  • Ervaren gebruiker

Geplaatst op 27 juni 2010 - 22:30

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/a...on001/huis.htm" ( zie hoofdje Phasing interferemotry)

Veranderd door Wimapon, 27 juni 2010 - 22:37


#12

mcs51mc

    mcs51mc


  • >250 berichten
  • 470 berichten
  • Ervaren gebruiker

Geplaatst op 28 juni 2010 - 06:41

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 ;)

#13

Wimapon

    Wimapon


  • >100 berichten
  • 114 berichten
  • Ervaren gebruiker

Geplaatst op 28 juni 2010 - 08:38

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

Veranderd door Wimapon, 28 juni 2010 - 08:46


#14

Wimapon

    Wimapon


  • >100 berichten
  • 114 berichten
  • Ervaren gebruiker

Geplaatst op 28 juni 2010 - 11:28

http://home.kpn.nl/a...01/fringes1.jpg

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

Veranderd door Wimapon, 28 juni 2010 - 11:38


#15

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 28 juni 2010 - 11:52

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.

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....ilter/trad.html

De relatie moet er dus als volgt uit zien:
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:
Geplaatste afbeelding

Veranderd door 317070, 28 juni 2010 - 12:00

What it all comes down to, is that I haven't got it all figured out just yet
And I've got one hand in my pocket and the other one is giving the peace sign
-Alanis Morisette-





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures