Capt501
http://pascal.nedlinux.nl Niet tegenspreken, Ik heb altijd gelijk !
Ik probeer een noisblanker bij elkaar te verzinnen.
Dit is het idee wat ik op dit moment heb :
Mijn bron signaal gaat door een BPF, dat is het signaal dat ik wil ontvangen.
Het bron signaal gaat ook door een Band Reject Filter, dat is spul dat ik NIET in mijn ontvangen signaal wil terug vinden.
Nu bedacht ik me de float samples met elkaar te vergelijken,
Ongeveer op de volgende manier
float vergelijk(float bpf, float brf)
{
float x = 0.0;
if(bpf == brf)
x = bpf;
return x;
}
Dit kan uiteraard niet zo omdat we het over floats hebben.
Hoe ik dat oplos moet ik me nog bedenken.
Punt is dat ik dalijk weet dat er een stoor signaal is, en hoe groot dat is.
Maar als ik dat van het bpf signaal af zou tellen, zou ik steeds op 0 uitkomen waardoor ik de stoorpuls vervang door een al even vervelende 0.
Ik zou beter tussen een paar samples kunnen middelen door deze rommel door een lpf te sturen of en dan van het gewenste signaal af te tellen.
Geen idee eigenlijk
Wat is een goede manier om zo'n noise blanker in elkaar te zetten ?
Ik blank noise (nooit geweten dat het een ww was) in het F domein, ik zet een instelbare threshold waarmee ik de elementen in de FFT vermenigvuldig alvorens ze (na wat andere operaties) weer terugvoer in het tijdsdomein. is natuurlijk wat bot, maar werkt als de ruis over het hele spectrum verspreid is.
Voor meer specifieke brommen e.d. gebruik ik een 2 * 2de orde notch filter, als computing geen probleem is gebruik ik FIR filters liever omdat ze een veel mooiere karakteristiek hebben.
Het mooist is een windowed sync fft filter, daarmee kan je bij wijze van spreken rommel met een bandbreedte van een paar Hz weghalen zonder de rest aan te tasten
grjanS
.... Overigens werkt jouw vergelijkingscode prima als je een epslion definieert en dan de "==" operator implementeert als
bool equal (float a, b)
if (a > b) return (a - b > epsilon)
if (a < b) return (b - a > epsilon)
return TRUE;
}
Capt501
http://pascal.nedlinux.nl Niet tegenspreken, Ik heb altijd gelijk !
Jan,
Je Epsilon oplossing vind ik een beetje flauw, maar dat had je vast wel verwacht.
Kun je iets meer toelichten hoe je die treshold dinges geval boems dinges doet ?
Ik heb geen idee of ik er iets aan heb.
Ben voor een vriend wat aan het knutselen voor 136kHz.
Daar staan spijkerharde signalen die ook binnen de band elende veroorzaken.
1. lees een aantal samples
2 doe de FFT (ik heb 16K elementen voor 48000 Hz samples, dus zo'n 3 Hz per element)
3. ik doe dan bandfiltering (met een 512 punts FIR gedefinieerd filter waar ik de FFT van neem)
4. ik doe dan de frequentietransformatie door een shift in het F domein
5. tijdens een van de wandelingen over het FFT maak ik er een polar representatie van en als de argumentwaarde < epsilon maak ik er 0 van.
6. epsilon is een via de gui instelbare waarde.
Nogmaals, het is wat bot, maar als ruwe squelch werkt het wel aardig
Het komt van een oud artikel: "Signals Samples and Stuff, a DSP tutorial" Doug Smits 1998 (Qex)
.... maar als je in je spectrum een aantal zeer smalbandige stoorsignalen hebt, kan je proberen de corresponderende elementen in je FFT te blanken alvorens het signaal te IFFT-en naar het tijdsdomein. Blanken van individuele elementen in een FFT representatie van het signaal (d.w.z. het nullen van de arg, en de fase maar onveranderd laten) heeft in experimentele setups bij mij prima gewerkt.
Capt501
http://pascal.nedlinux.nl Niet tegenspreken, Ik heb altijd gelijk !
Hmmm ik moet het eens nader bestuderen, het lijkt me niet echt wat ik wil maar klinkt plausibel.
In mijn genoemd voorbeeld is het ook wel toe te passen, maar iha kan ik het wel vergeten
Ik kan normaliter geen lagere samplerate dan 320kS/sec kiezen (althans dat is wat er binnen komt, ik kan natuurlijk wel weer decimeren)
Met die (320ks/s) samplerate en met bijpassende fft's gaat mijn arme klapdoosje vast helemaal over de zijk.
En dan heb ik nog niet eens een hogere samplerate gekozen (in de praktijk is een rate van 2Ms/sec ook wel lekker he)
Ik neem aan dat je een bandje wil selecteren uit het spectrum. 320k is veel te hoog om echt lekker te rekenen, maar je hebt nog wel voldoende rekenkracht voor een 4 * 2-de orde IIR of zo?
Dan down met je gekozen band, en met 64 of 88 k of zo wat subtieler rekenwerk.
Mijn elektor sdr-retje sampled op een vrij normale laptop van 1.5 jaar met 96k in het front end en 16 k in de detector, en als gezegd, ik doe de front end filtering (en een beetje analyse) in het F domein op een FFT van 16 K (dus zo'n 12 keer per seconde), en dan kan ik onderwijl nog internetten.
Ben wel benieuwd naar meer specificatie van je probleem