Nödvändig bandbredd för FSK?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

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

Inlägg av guckrum »

Eller varför inte som en oneliner i sitt "skal":

Kod: Markera allt

% echo 'for(n=0;n<80;n++) (2^15-1)*c(2*3.141593*1300/8000*n)' | bc -l | awk '{printf("%#.4x\n", $1)}' | sed 's/ffffffffffff//' | paste - - - - - - - - | sed 's/\t/, /g'

0x7fff, 0x42e0, 0xc5e5, 0x8067, 0xb4c5, 0x30fb, 0x7e6b, 0x5320
0xd873, 0x838b, 0xa57f, 0x1de1, 0x79bb, 0x6154, 0xebfb, 0x89c0
0x9873, 0x0a0a, 0x720b, 0x6d22, 0x0000, 0x92de, 0x8df5, 0xf5f6
0x678d, 0x7640, 0x1405, 0x9eac, 0x8645, 0xe21f, 0x5a81, 0x7c75
0x278d, 0xace0, 0x8195, 0xcf05, 0x4b3c, 0x7f99, 0x3a1b, 0xbd20
0x8002, 0xbd20, 0x3a1c, 0x7f9a, 0x4b3b, 0xcf05, 0x8195, 0xace0
0x278d, 0x7c75, 0x5a81, 0xe21f, 0x8645, 0x9eac, 0x1406, 0x7640
0x678c, 0xf5f5, 0x8df5, 0x92de, 0x0000, 0x6d22, 0x720b, 0x0a0a
0x9873, 0x89c0, 0xebfb, 0x6154, 0x79bb, 0x1de1, 0xa57f, 0x838b
0xd873, 0x5320, 0x7e6b, 0x30fb, 0xb4c4, 0x8067, 0xc5e5, 0x42e0
Antaget 16 bitar och tvåkomplement maxar jag dynamiken (och minimerar kvantiseringsbruset) genom att sätta maxamplituden till 2^15-1 = 32767 = 0x7fff.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

@YD1150

Stuket med en includefil i assembler är från den gamla kompilatorns tid (C30). Jag kör med MPLABX och xc16. Har visserligen MPLAB kvar på en annan maskin för projekt jag inte orkat porta. Nu är jag inte så bra på MATLAB/Octave, men nedanstående ger samma resultat som float2Frac() i xc16:

Kod: Markera allt

# NAVTEX parameters
Fdelta =  170;  # BFSK frequency difference
Fsym =    100;  # Symbol rate
F =      1385;  # Center frequency
# Receiver parameters
Fs =     8000;  # sample frequency
N =   Fs/Fsym;  # Samples per symbol

h_low = cos(2*pi*(F-Fdelta/2)/Fs*(0:N-1));
h_high = cos(2*pi*(F+Fdelta/2)/Fs*(0:N-1));

Bits=16;

Navtex_16bit_Coeffs_lo = round((32768*h_low));
Navtex_16bit_Coeffs_hi = round(32768*h_high);

for j=1:length(Navtex_16bit_Coeffs_lo)
  if (h_low(j) == 1 )
    printf( " 0x7FFF")
  elseif round(Navtex_16bit_Coeffs_lo(j))==0
    printf(" 0x0000")
  elseif (h_low(j) <= 0 )
  printf( " 0x%04X",65535+Navtex_16bit_Coeffs_lo(j)+1 );
  else
  printf( " 0x%04X",Navtex_16bit_Coeffs_lo(j) );
  endif
  if (mod(j,8) == 0) 
    printf (",\n")
  else
  printf (",")
    endif
end
To convert a number from floating point to Qm.n format:

Multiply the floating point number by 2n
Round to the nearest integer
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

@xxargs

Ah, jag förstår vad du menar. Ta absolutvärdet och ett löpande medelvärde. Om värdet på hög är större än låg så antar vi hög. Om tvärtom så är det låg. Nu medan jag labbar och kör ut via en DAC så är det enklast att ta värde för värde, men i drift sedan då man inte behöver bry sig så himla mycket om att synka en DAC så man man ju låta ADn sampla 16 värden och behandla dem som klump. Så här ser det ut från de två kanalerna på DACen. Insignalen är en ljudfil och jag har ett 8nde ordningens filter med brytfrekvensen 2kHz på ingången.
PRINT_37.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

Och så litet dekodning. Blir litet förvirrad av Q1.15 och vanliga integers, men så länge man håller sig till EN så skall vanliga aritmetiska funktioner fungera eller hur? Eller inte??

Insignalen är kapacitivt kopplad och ingången hålls trimbart på 2,5V, då ger mig ADCn värden mellan -1 och +1 är noll är vid 2,5V
PRINT_38.jpg
Överst utsignalen från höga filtret, nedan enveloppen och sist den avkodade signalen.

Kod: Markera allt

                
                spi_send2((outputSignal[0]^0x8000)>>4);  // Data is 12-bit, left adjusted
                //
                hi_ave = (hi_ave / 5)*4 + (abs(outputSignal[0])/5); // Moving average
                lo_ave = (lo_ave / 5)*4 + (abs(outputSignal2[0])/5);
                //
                spi_send((hi_ave^0x8000)>>4);

                if(hi_ave > lo_ave) LATDbits.LATD0 = 1; else LATDbits.LATD0 = 0;

Testar här med ett rullande medelvärde där varje ny sampel påverkar med en femtedel. Finns säkert en hel del att fila på i detaljerna.
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 »

Signalen i den nedre skärmskottet se mycket sämre med mindre undertryckning av den andra frekvensen än den övre - vad är skillnaden ??
annan del av källsignalen, har frekvensen glidit ??


Vad händer om du kvadrera värdet istället för göra absolutvärde (vet inte om det kostar så mycket i CPU att det är värt det)

(hmm egentligen borde man ha I och Q på signalen - då skulle magnituden vara samma hela perioden över samplen och alla kvadrater av denna skulle bli på samma nivå och spegla den egentliga energi-flödet - dvs I=1, Q=0 ger M=1, I=0.71, Q=0.71 ger M=1, I=0 Q=1 ger M=1, I=-0.71, Q=0.71 ger M=1 etc. ; M = sqrt(I^2 + Q^2) )


kvadreringen bör ta bort negativa tecknet också och utsignalen motsvarar då signaleffekten och inte signalspänningen och med glidande integreringen så har du egentligen inget annat än en RMS-mätare men utan 'S' i slutet - dvs en energimätare med en symbols tid i mätintervall...

informationsöverföring handlar i slutändan om energi-överföring, så egentligen bör kompareringen mellan hög och låg baseras på energimängd och inte av ström eller spänning... det finns anledning varför vi hantera signaler med med begreppet 'dB' då det alltid avser energi-kvoter, inte spänning eller strömkvoter.


---

Såg vid en andra genomläsning att det var kapacitivt inkopplat - inge bra då det ger frekvensberoende om C är litet och står för hela dämpningen/spänningsdelningen

använd pot/motstånd som spänningsdelare för lagom signal och ha i sammanhanget stor konding (100 nF om systemimpedansen mot AD-omvandlare är > 100 KOhm) som DC-avkopplare, är systemimpedansen lägre så får du använda större konding.


---

asså... - det kliar verkligen i fingrarna att prova själv men det är mycket som måste skaffas hem och jag vet inte var jag skall börja när det gäller lämplig kit för tex dsPIC eller annan motsvarande plattform - finns det bra nybörjakit typ med audio in och audio ut med tillräckligt med DSP-pulver och kan köpas på Elfa eller annan gubbdagis ??

(tyvärr har jag inte sådan lyx som digitaloscilloskop utan bara gammalt analogt - men för audio-frekvenser så kan ljudkort vara substitut som fungera hyffsat och vida mer upplösning bitmässigt på samplen än de flesta digital-oscilloskop)

jag har en ICOM IC-R71E mottagare som man kanske möjligen kan hämta hem lite realtidssignaler - dock bor i förort, mycket switchad elektronik i omgivningen och liten möjlighet att få ut antenn med längre längd.
Senast redigerad av xxargs 27 augusti 2017, 21:14:53, redigerad totalt 1 gång.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

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

Inlägg av guckrum »

OK. Det tar sig. Två filter med mittfrekvens 1300 och 1470 puttas ut på D/A-omvandlarens båda kanaler.
Mycket snyggt att plocka ut det analogt ur kretsen så att man kan titta på filteroutputen! Det är roligt att följa detta projektet.

Två saker:

1. En kommentar runt filterkvantisering. I ditt octaveprogram multiplicerar du filterkoefficienterna med 32768 för att senare korrigera maxvärdet så att det är inom range. Bättre att multiplicera med 32767 istället. Om man inte håller tungan rätt i mun riskerar man (i tvåkomplement) att det största positiva värdet ersätts med det största negativa. Det är så stort ett fel kan bli för ett sampel. Jag gjorde det en gång, i en DVB-mottagare med 64QAM, och oj vad konstellationen briserade varje gång felet inträffade. (Och så avrundar du också, vilket jag glömde i mitt shell-script!)

2. Sedan tänker jag på själva avkodningen till bitströmmen ut. Nu förstår jag det som att du skall använda detta som en försteg i en befintlig krets som tar en binär signal som input, så situationen är lite speciell. Men hursomhelst, här är grejen: I en optimal avkodare har man filter som är lika långa som symbolerna, och det har du ju nu. Låt oss säga att vi kör 8kHz, så filterna är 80 tappar långa. Den optimala avkodningen får man när filtret precis täcker den sända symbolen, och så kör man filtret var 80e sampeltidpunkt. Man kör alltså bara filtret en gång per symbol, för detta genererar det bästa utvärdet. Alla andra mellanliggande 79 utsignaler ur filtret slänger man (eller struntar i att beräkna). Anledningen är att vid alla dessa 79 tidpunkter löper filtret mer eller mindre över två symboler, och dessa blandas då i filtret vilket är kass. Detta kräver alltså att man synkroniserar mottagaren i tid med sändaren så att man vet när man skall köra filtret. En sådan synkronisering är ganska enkel att få till.

Man kan se detta i dina oscilloscope-plottar. Signalen rampar när den går mellan låg och hög. Det är pga "integreringen" i filtret. Det är precis när den "rampat klart", innan den eventuellt påbärjar nästa ramp, som man skall ta utsignalen. Och bara då.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

@guckrum
Mycket snyggt att plocka ut det analogt ur kretsen så att man kan titta på filteroutputen!
Tack och jo, det gör det hela enklare då man ser underligheter lättare. Jag hade först enormt mycket fladder på den resulterande signalen, men det berodde på att jag multiplicerade före division vid medetvärdesberäkningen och helt enkelt slog i tak. Syntes tydligt i enveloppen.
I ditt octaveprogram multiplicerar du filterkoefficienterna med 32768 för att senare korrigera maxvärdet så att det är inom range. Bättre att multiplicera med 32767 istället.
Du har naturluigtvis rätt. Skall ändra det.
Nu förstår jag det som att du skall använda detta som en försteg i en befintlig krets som tar en binär signal som input
Inte nödvändigtvis. Tänkte göra även avkodningen, dvs "pulståg" till Baudot i samma processor så att hela enheten kan leverera ASCII över en seriell port.
Den optimala avkodningen får man när filtret precis täcker den sända symbolen, och så kör man filtret var 80e sampeltidpunkt.
Således, vad du menar är att ha feedback från den avkodade signalen, så att jag "vet" när en "bit" börjar och då kör jag filtreringen? Är inte riktigt säker på att jag förstått det rätt?
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

Hittade annars denna Navtex-implementation gjord i Java. Påminner en del om vad vi gör här och i den så tar de dessutom subtraherar de, de kvadrerade värdena som xxargs föreslog. Skall kika litet på koden.

Bild

Kör man på en PC kan man ju göra vad som helst. Kör man på en liten MCU och dessutom vill minimera strömförbrukningen så är det litet knepigare.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

@xxargs
Signalen i den nedre skärmskottet se mycket sämre med mindre undertryckning av den andra frekvensen än den övre - vad är skillnaden ?? annan del av källsignalen, har frekvensen glidit ??
De kommer båda rakt ur DA-omvandlaren. "Luddet" är 8kHz, dvs samplingsfrekvensen. Antagligen spikar från DA-omvandlaren som ringer. Jag har dem även om jag sätter proben på jordklämman. Den lilla loopen som bildas plockar upp.

Tyvärr blir ju labbruskor sälllan HF-mässiga
Vad händer om du kvadrera värdet istället för göra absolutvärde (vet inte om det kostar så mycket i CPU att det är värt det)
Borde gå att köra. en enkel multiplikation.
Såg vid en andra genomläsning att det var kapacitivt inkopplat - inge bra då det ger frekvensberoende om C är litet och står för hela dämpningen/spänningsdelningen
Vilken, var? Menar du insignalen
använd pot/motstånd som spänningsdelare för lagom signal och ha i sammanhanget stor konding (100 nF om systemimpedansen mot AD-omvandlare är > 100 KOhm) som DC-avkopplare, är systemimpedansen lägre så får du använda större konding.
Det är ungefär vad jag har. Schema:
20170828_195300_resized.jpg
Borde eg ha en buffert mellan filtret och DA-ingången, typ en opamp.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

Hann inte så mycket mera i kväll än att jaga ludd och taskiga jordar, men:

Kod: Markera allt

                // Decode and output that
                rc = sitor(hi_ave > lo_ave);
                LATBbits.LATB0 = rc;
och

Kod: Markera allt

int sitor(int value)
{
    switch(sitor_state)
    {
        case SITOR_BEGIN:                       // Wait for low to high
            if(sitor_value==0 && value == 1)
            {
                sitor_value = value;
                sitor_state = SITOR_FIRSTBIT;
                TMR1 = 0;
                break;
            }
        case SITOR_FIRSTBIT:                    // First transition
            if(TMR1 > ONEANDHALFBIT)            // wait 1.5 bittime
            {
                sitor_value = value;
                sitor_state = SITOR_NEXTBIT;
                TMR1 = 0;
                break; 
            }
         case SITOR_NEXTBIT:                    // Rest of bits..
            if(TMR1 > ONEBIT)
            {
                sitor_value = value;
                sitor_state = SITOR_NEXTBIT;
                TMR1 = 0;
                break; 
            }                      
    }
    return sitor_value;
}
Mycket "rough" men gör jobbet. Skall fila litet elegantare på det sedan.
PRINT_39.jpg
Den avkodade signalen syns nedan. Som synes är den förskjuten en halv bittid eftersom jag samplar mitt i biten.

Nu kommer det roliga. Sitor har inga start och stoppbitar, utan är en ström av bitar, utan början eller slut, men med vikkloret att ett 7-bits ord, måste ha fyra ettor, fyra bitar satta. Så jag tänkte ha följande stretegi (som jag snott av Java-programmet ovan:

Putta in bitarna i en cirkulär buffer. Kolla över bufferten efter en sekvens med 7 bitar, med fyra satta. Hittar vi kollar vi om även nästa 7 bitar kvalar in. Gör det det så gör vi från den första byten.

en liten parentes gällande medelvärdet ovan. Jag plockade faktorerna 4/5 och 1/5 ur luften. Jag antar att det finns något bra matematiskt sätt att räkna fram "tidskonstanten"?
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 »

nu börja det se riktigt bra ut *applåd*

Med den här takten och kluradet så kanske mottagaren blir i samma klass och tom. en smula bättre än de som finns i den kommersiella segmentet (vet inte hur mycket krut de har lagt på mottagningen där dock) och definitivt bättre än den ursprungliga projekt-mottagaren.

dock kan det behövas lite AGC mm. för RF-nivåerna in om du också bygger RF-mottagardelen också och inte använder en färdig radio för denna.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

Jo, jag skall bytta allt. RF-Delens prototyp finns här.

Där skall det bli AGC. Man kan ju räkna fram ett lämpligt värde som man sedan DA-omvandlar och förspänner den övre FETen.

Rent parentetiskt.. Borde leta fram artikeln jag skrev för Radio & Television någon gång i början på 80-talet hur man tar emot BAUDOT på en Sinclair ZX-81 :)
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

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

Inlägg av guckrum »

Således, vad du menar är att ha feedback från den avkodade signalen, så att jag "vet" när en "bit" börjar och då kör jag filtreringen? Är inte riktigt säker på att jag förstått det rätt?
Du har två filter, en för varje symbol/frekvens. Dessa filter uppdateras för varje insampel. Det är 80 gånger oftare än det kommer nya symboler, så du skall bara välja vart 80e värde.

Om vi tar det ur ett implementationsperspektiv tänker jag såhär. Du kvadrerar dina filteroutputs som xxargs redan nämnt. Då får du energier, som alltid är positiva (och vi slipper oroa oss för att våra filter ligger 180 grader ur fas med insignalen och genererar negativa utvärden). Om du väljer utsignal efter det filter som har mest energi har du implementerat "hård avkodning" och det är bra.

Alla kvadrerade filteroutputs skickar man också till en synkroniserare, som räknar ut vilken av de 80 "faserna" som är den bästa att välja. Man kan göra detta på flera sätt. Jag har inte haft tid att simulera detta än, men jag skulle tro att ett bra sätt kan vara att skapa skilnaden mellan dina två energisignaler och skicka via ett bandpassfilter in i en resonator. Resonatorn kommer då att "låsa" till symboltakten.


(*) Mjuk avkodning innebär att man inte kvantiserar informationen direkt till en bit, utan använder energierna till att räkna ut sannolikheter för att biten är en etta eller nolla. Osv. Då kan man få bättre prestanda lite beroende på kanalen och kodningen. Det skulle vara kul att labba med tillsammans med NAVTEX-FECen. Någongång.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 8413
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg av AndersG »

@guckrum

När (om) jag får detta att fungera så är avsikten att göra kort, kanske ett, eller separera RF och processor. I så fall försöker jag göra korten så generella att de kan användas till olika saker och i så fall sälja korten, lika som jag gjort med GPIB och HPdisk, för en ringa penning. Då blir det enklare för alla att labba.

Jag är fortfarande litet osäker på hur du menar. Kan jag inte använda min avkodade signal för synkronisering? Dvs ta filteroutputs exempelvis i mitten på varje bittid?

Så vad du och xxargs föreslår är att ändra

Kod: Markera allt

abs(outputSignal[0])
till

Kod: Markera allt

outputSignal[0]*outputSignal[0]
?? Skall testa

Sedan kan man jämföra litet med hur de gör i JNX:
Bild

Det är ju i princip samma sak eller hur? Värdena på mark och space kvadrerade blir ju mellan 0 och 1 (eller 0,9999 om man skall vara petig), då blir "mixerns" output mellan -1 och 1. Sedan har de ytterligare ett lågpassfilter före medeltalet. Vilken metod är "bättre"?
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

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

Inlägg av guckrum »

Jag är fortfarande litet osäker på hur du menar. Kan jag inte använda min avkodade signal för synkronisering? Dvs ta filteroutputs exempelvis i mitten på varje bittid?
Jo, vi pratar om ungefär samma sak tror jag. Jag är ute efter hur man säkerställer att man hela tiden samplar i "mitten" på varje bit, eller där "ögondiagrammet är som öppnast", eller hur man nu ser det, även om man har otur och det brusar och så vidare. Hur man går från "rough" till något som är nära så bra det kan bli. En tidssynkroniseringsalgoritm alltså.
Så vad du och xxargs föreslår är att ändra [abs(...)] till [(...)^2] ...
Om du bara använder det till att jämföra vilken som är störst spelar det ingen roll, eftersom kvadrering är en monoton funktion. Men om du kvadrerar kan du använda signalen till annat också, tex synkronisering.
Rent parentetiskt.. Borde leta fram artikeln jag skrev för Radio & Television någon gång i början på 80-talet hur man tar emot BAUDOT på en Sinclair ZX-81 :)
Jag antar att du byggde kretskort, antenn, rf-steg, mixed signal delar, CPUkort samt skrev all kod då också? :D
Skriv svar