Nödvändig bandbredd för FSK?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
thebolt
Inlägg: 248
Blev medlem: 10 februari 2008, 17:41:40
Ort: Taipei Taiwan

Re: Nödvändig bandbredd för FSK?

Inlägg av thebolt »

AndersG skrev:Jo, jag vet. Har tom tentat det en gång. Vad jag var ute efter var närmast vilken typ av filter jag får med koefficienterna uträknade som ovan?
Ingetdera.. De koefficienterna definierar en oscillator med frekvens motsvarande hög respektive låg frekvens. Närmast kan det ses som en DFT med enbart två buckets (en centrerad på F+delta och en på F-delta).

-M
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

Ja, men med de koefficienterna i ett FIR-filter får jag ju ett filter?

edit:
Som jag förstår det är ju faktorerna en sinc (sin(x)/x) kurva i sin enklaste form. Sedan multipliceras dessa faktorer med faktorer från en tabell, som definierar ett "fönster", där den enklaste är rektangulärt, alla faktorer = 1 i "fönstret". Exemper Hanning är en cosinus:

Bild

Så, i det enkla exemplet har jag ett rektangulärt filter?
thebolt
Inlägg: 248
Blev medlem: 10 februari 2008, 17:41:40
Ort: Taipei Taiwan

Re: Nödvändig bandbredd för FSK?

Inlägg av thebolt »

Du får ett FIR-filter ja, men inget av de fyra grundtyperna.

Det stämmer inte med ett sinc-filter heller.. du har ingen division med x. Koefficienterna har alla amplitud 1.

-M
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

Du får ett FIR-filter ja, men inget av de fyra grundtyperna.
Således ett rektangulärt?
Det stämmer inte med ett sinc-filter heller.. du har ingen division med x. Koefficienterna har alla amplitud 1.
Nej, det stämmer. Läste slarvigt. Så hur blir de då ett filter, vilket det bevisligen blir när jag multiplicerar det samplade indatat med cosinus för Fc?
thebolt
Inlägg: 248
Blev medlem: 10 februari 2008, 17:41:40
Ort: Taipei Taiwan

Re: Nödvändig bandbredd för FSK?

Inlägg av thebolt »

Då filter oftast karakteriseras efter sin frekvens-spec så ja, ett perfekt sinc-filter är rektangulärt i frekvensplanet. Dock går ett perfekt sinc-filter inte att implementera då det dels kräver oändligt antal koefficienter, dels behöver koefficienter med negativt index (dvs det behöver se in i framtiden) alternativt ha en fördröjning som är oändlig.

När koefficienterna är en cos-serie sådär så är de en resonator, och effekten av att göra det digitalt blir i princip samma som att ha ett resonator-filter analogt. Signaler i närheten av definierad frekvens släpps igenom, andra undertrycks. See en kortare presentation här t.ex.
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Nödvändig bandbredd för FSK?

Inlägg av guckrum »

Vad jag egentligen undrar över är vilken typ av filter jag får med:

Kod: Markera allt

cos(2*pi*(F-Fdelta/2)/Fs*(0:N-1));
Du kan se det lite som att du först mixar ner din önskade signal till DC, och därefter tar ett medelvärde över alla tapparna. Den komplexa varianten är egentligen renare och bättre och enklare att förstå, tycker jag

Kod: Markera allt

exp(j*2*pi*(F-Fdelta/2)/Fs*(0:N-1));
Att multiplicera i tidsdomänen med en komplex rotation är ju detsamma som ett rent skift av frekvensplanet. Denna komplexa variant känner man också igen som de beräkningar som sker för varje DFT (Diskret FourierTransform)-tapp. Med cosinus istället slipper vi komplexa tal och den är också nästan en diskret cosinusdito.

Så länge allt är idealt, och om vi hade vetskap om sändarens fas, så är detta filtret _optimalt_ för mottagaren ifråga. Du kan alltså inte hitta ett bättre filter. I praktiken kan det, som tidigare nämnts, vara annorlunda, om man tar hänsyn till färgen på bruset och kanalens karaktäristik.

EDIT: förtydligande samband tids/frekvensdomän
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Nödvändig bandbredd för FSK?

Inlägg av guckrum »

Men jag är lite fundersam över oscillogrammet (heter det väl?) som visar signalerna "LO" och "HI" och detekteringen av utbitarna. Det ser ut som att signalerna oscillerar, men kanske misstar jag mig på vad som visas. Tar du absolutbelopp och kvadrat på det? Hos mig ser det ut så här
figure1.jpg
Där grön och blå är kvadrerat absolutbelopp ut ur de två filterna, visade med halv amplitud i diagrammet, och röd är skillnaden mellan dem.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

@guckrum

Problemet är att jag bara har två analoga kanaler ut så jag måste ändra i koden och kompilera om varje gång jag vill se ngt annat. Jo jag kvadrerar värdet och adderar sedan det till ett exponentiellt medelvärde.

Jag skall ta ut nya skärmdumpar i slutet av veckan.

Tack för DSP-förklaringen. Det underlättar. Jag har som sagt var inte sysslat med DSP alls, om man nu bortser från hembyggda digitalekon.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

Litet bilder:
PRINT_47.jpg
1: Hög
2: Låg
D8: Hög - låg
D9: Samplad vågform
D10: Samplingspunkter
D11: När jag klockar ut 7 bitar
PRINT_48.jpg
Enveloppen
PRINT_49.TIF
PRINT_50.jpg
Enveloppen, detalj.

Vet inte var "luddet" kommer ifrån. jag gör lika med båda:
Multiplicerar signalen med sig själv
Multiplicerar med 0,2 sparar värdet
Tar den gamla summan, multiplicerar med 0,8
Adderar dem
I detta använder jag DSPns inbyggda instruktioner som använder en 40-bitars ackumulator och sedan "saturerar" jag ned det till Q15.

Kod: Markera allt

                //
                // Calculate Basic exponential smoothing for hi
                //
                resultACCA = __builtin_clr();            // clear out accumulator
                                                        // square signal
                resultACCA = __builtin_mpy(outputSignal[0], outputSignal[0], NULL, NULL, 0, NULL, NULL, 0);
                ftemp1 = __builtin_sac(resultACCA, 0);   //
                resultACCA = __builtin_clr();            // clear out accumulator
                                                        // multiply by weighthing factor
                resultACCA = __builtin_mpy(ftemp1, f2, NULL, NULL, 0, NULL, NULL, 0);
                ftemp1 = __builtin_sac(resultACCA, 0);   // Weighted new value
                //spi_send((ftemp1^0x8000)>>4);
                resultACCA = __builtin_clr();            // clear out accumulator
                                                        // multiply by weighthing factor
                resultACCA = __builtin_mpy(hi_ave, f1, NULL, NULL, 0, NULL, NULL, 0);
                ftemp2 = __builtin_sac(resultACCA, 0);   // weighted old value
                //
                //hi_ave = ftemp1 + ftemp22;
                resultACCA = __builtin_clr();            // clear out accumulator
                resultACCA = __builtin_add(resultACCA, ftemp1, 0);
                resultACCA = __builtin_add(resultACCA, ftemp2, 0);
                hi_ave = __builtin_sac(resultACCA, 0);
                //
                //spi_send((hi_ave^0x8000)>>4);
                //
                // Calculate Basic exponential smoothing for lo
                //
                resultACCB = __builtin_clr();            // clear out accumulator
                                                        // square signal
                resultACCB = __builtin_mpy(outputSignal2[0], outputSignal2[0], NULL, NULL, 0, NULL, NULL, 0);
                ftemp1 = __builtin_sac(resultACCB, 0);   //
                resultACCB = __builtin_clr();            // clear out accumulator
                                                        // multiply by weighthing factor
                resultACCB = __builtin_mpy(ftemp1, f2, NULL, NULL, 0, NULL, NULL, 0);
                ftemp1 = __builtin_sac(resultACCB, 0);   // Weighted new value
                //spi_send((ftemp1^0x8000)>>4);
                resultACCB = __builtin_clr();            // clear out accumulator
                                                        // multiply by weighthing factor
                resultACCB = __builtin_mpy(lo_ave, f1, NULL, NULL, 0, NULL, NULL, 0);
                ftemp2 = __builtin_sac(resultACCB, 0);   // weighted old value
                //
                //hi_ave = ftemp1 + ftemp22;
                resultACCB = __builtin_clr();            // clear out accumulator
                resultACCB = __builtin_add(resultACCB, ftemp1, 0);
                resultACCB = __builtin_add(resultACCB, ftemp2, 0);
                lo_ave = __builtin_sac(resultACCB, 0);
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

OK. Jag hittade felet: Jag hade för hög nivå in så det bottnade. Drog ned insignalen och nu ser det bättre ut.
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Nödvändig bandbredd för FSK?

Inlägg av guckrum »

Good!

Det finns inga dipswitchar eller liknande så att man kan multiplexa ut olika saker till DAn? Det är ju rätt behändigt att kunna switcha fram och tillbaka mellan olika "vyer" när man försöker förstå vad som händer där inne.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

Nä, jag måste fixa det i så fall. Skall försöka få dit en loggning av rådata via SPI så att jag kan logga på en PC.

Edit: Fick aldrig en UMFT220XB-01 att spela rent, dessutom var en av två trasiga från Mouser, morr, så jag satte helt enkelt en annan PIC som SPI till USB konverter för att få ut loggdata så snabbt att jag inte slöade ned sampleloopen.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

OK. Nästa steg blir att göra en "PLL" som försöker hålla synkroniseringen fortlöpande. Med strategin att helt kallt sampla en halv bittid först och sedan en bittid därefter gör att den driver ur synk efter några sekunder. Så algoritmen blir:

Kolla tiden mellan sample och nästa förändring (låg->hög eller hög->låg). Denna skall idealt vara en halv bittid. Om den inte är det så räknar vi fram en diferens som vi dock inte låter vara större än +/-4. Denna läggs till tiden vi väntar på nästa sample.
case SITOR_NEXTBIT: // Rest of bits..
//
// Measure time efter last sample and check on change
//
if(value != last_value)
{
adj = (cnt2 - 40)/4;
if(adj>4) adj = 4;
if(adj<-4) adj = -4;
//spi_send3(adj);
}
last_value = value;
if(cnt>=(80+adj))
{
cnt = 0;
cnt2 = 0;
sitor_value = value;
sitor_state = SITOR_NEXTBIT;
if(value)
{
sitorbyte = sitorbyte | mask;
LATBbits.LATB1 = 1; // Wiggle för att visa en byte
LATBbits.LATB1 = 0;
}
mask = mask <<1;
break;
}
break;
Variablerna cnt och cnt2 räknas upp vid varje inkommande sample från ADC. Blir litet förvirrande i texten med "sample" som dels kan avse sample an inkommande vågform och dels att jag samplar differensen mellan hög och låg.
PRINT_01.png
Uppifrån och ned:
Hög
Låg
Utklockning av byte
Sample, endast höga visas
"Komparatorns" utsignal
Samplad utsignal
Insignalen är 0x0f 0x66

Målet är att få det hela stabilt med en kontrolerad vågform, sedan angripa den verkliga
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
xxargs
Inlägg: 10183
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Nödvändig bandbredd för FSK?

Inlägg av xxargs »

I ljudeditor kan du 'smutsa ned' din 'perfekta' signal med vitt brus - din tidigare inspelade signal hade typ 10 dB S/N så det kanske är lagom nivån att starta på när man vill ha lite avkodningssvårigheter ;-)


eftersom din syntetiska insignal har känd bitföljd så kan du också mäta på hur många bitfel du får efter en längre session och vid olika S/N-förhållande och se om du är i närheten av de teoretiska nivåerna - är du långt ifrån, så finns det mer och fila på kan man säga.

(för icke kohorent mottagning så lägger du på ca 1 dB i mer signal för samma BER som kohorent FSK i diagrammen i början av tråden, nu handlar det inte om att du skall optimera för att träffa de teoretiska värdena, men en mätetal är kanske bra att veta så man vet om man är 2 dB eller 10 dB över teoretiska nivån, är det under 2 dB så börja det bli jobbigt att förbättra ytterligare, är det 10 dB så får man stora förbättringar med relativt liten insats.)

Ett alternativ är kanske att efter synksekvens och startflagga generera en sekvens med en psedorandom med bestämd salt, och i din mottagare har samma psedorandom-algoritm och samma salt - triggas av startsekvensen och själv kan kontrollera att bitarna är samma och höja en pinne var gång det blir fel - typ

(sedan kanske det är bra med en register som visar totalt antal mottagna bitar och ett annat register med antalet bitar som gick fel och man kan räkna ut en BER - men vet inte om du kan läsa ut några värden från din mottagare förutom att vinka med sina utgångar...)
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8412
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Nödvändig bandbredd för FSK?

Inlägg av AndersG »

Japp... Det här blev ju liiiitet mera komplicerat än jag tänkt mig :) Men som sagt var: Hur äter man en elefant? Jo en bit i taget, så här är bitarna:

1. RF-delen, separat projekt
2. Filter, envelopp, komparator
3. Tolka till 7-bits bytes
4. Tolka en ström med 7-bits bytes från NAVTEX till ASCII, med hänsyn taget till att vi kan ha tappat en bit på vägen så att ett verkligt byte består av tex fyra bitar av en byte och tre av nästa.

Jag är väl på trean nu. Skall kolla att den håller synk även med en 10-minuters ljudfil. Sedan kan jag övergå till fyran, som enklast görs på en PC under labbning. Skriver i standard C så kan jag flytta till PICen sedan. Där kan jag ju enkelt skapa en fil med vilka bitfel jag vill. Utdata från trean i loggfilen är helt enkelt en textfil med värden i hexformat. 0f 66 0f 66 etc. Den läser fyran med fscanf.

Då jag kommit så långt som att jag får ut en avkodad ascii så kan jag gå tillbaka till tvåan och testa med verkliga eller "nedskitade" signaler.

I logiken ovan har jag förresten en timer som resettar ifall man tappar signal tre symboltider.
Skriv svar