Electrokit Buggfix Plus
Aktuellt datum och tid: 17.49 2017-09-25

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 169 inlägg ]  Gå till sida Föregående  1 ... 5, 6, 7, 8, 9, 10, 11, 12  Nästa
Författare Meddelande
InläggPostat: 11.02 2017-09-04 

Blev medlem: 17.41 2008-02-10
Inlägg: 241
Ort: Taipei Taiwan
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


Upp
 Profil  
 
InläggPostat: 11.05 2017-09-04 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
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?


Upp
 Profil  
 
InläggPostat: 13.25 2017-09-04 

Blev medlem: 17.41 2008-02-10
Inlägg: 241
Ort: Taipei Taiwan
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


Upp
 Profil  
 
InläggPostat: 13.48 2017-09-04 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
Citera:
Du får ett FIR-filter ja, men inget av de fyra grundtyperna.


Således ett rektangulärt?

Citera:
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?


Upp
 Profil  
 
InläggPostat: 15.34 2017-09-04 

Blev medlem: 17.41 2008-02-10
Inlägg: 241
Ort: Taipei Taiwan
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. https://www.slideshare.net/Prakash_1320 ... resonators


Upp
 Profil  
 
InläggPostat: 20.28 2017-09-04 

Blev medlem: 08.04 2012-06-19
Inlägg: 54
Ort: Lund
Citera:
Vad jag egentligen undrar över är vilken typ av filter jag får med:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
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


Upp
 Profil  
 
InläggPostat: 20.40 2017-09-04 

Blev medlem: 08.04 2012-06-19
Inlägg: 54
Ort: Lund
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
Bilaga:
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.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 18.28 2017-09-05 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
@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.


Upp
 Profil  
 
InläggPostat: 19.26 2017-09-06 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
Litet bilder:
Bilaga:
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
Bilaga:
PRINT_48.jpg

Enveloppen
Bilaga:
PRINT_49.TIF

Bilaga:
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
                //
                // 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);


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 18.36 2017-09-07 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
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.


Upp
 Profil  
 
InläggPostat: 07.41 2017-09-08 

Blev medlem: 08.04 2012-06-19
Inlägg: 54
Ort: Lund
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.


Upp
 Profil  
 
InläggPostat: 07.50 2017-09-08 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
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.


Upp
 Profil  
 
InläggPostat: 08.48 2017-09-10 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
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.

Citera:
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.
Bilaga:
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


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 08.58 2017-09-10 

Blev medlem: 13.28 2006-09-23
Inlägg: 8378
Ort: Södertälje
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...)


Upp
 Profil  
 
InläggPostat: 13.29 2017-09-10 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5712
Ort: Mariehamn
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.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 169 inlägg ]  Gå till sida Föregående  1 ... 5, 6, 7, 8, 9, 10, 11, 12  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: AndersG, Bing [Bot], makino, MicaelKarlsson och 31 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010