Buggfix Plus
Aktuellt datum och tid: 03.36 2017-09-25

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 167 inlägg ]  Gå till sida Föregående  1 ... 4, 5, 6, 7, 8, 9, 10 ... 12  Nästa
Författare Meddelande
InläggPostat: 08.33 2017-08-29 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
Citera:
Jag antar att du byggde kretskort, antenn, rf-steg, mixed signal delar, CPUkort samt skrev all kod då också?


Mja, jo. Ett kretskort med Z80SIO. Skrev all kod i assembler. Byggde en PLL-baserad detektor. Använde en färdig, Heathkit Mohican mottagare. Jag har artikeln någonstans skall scanna den om jag hittar den.

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


Nu kollar jag bara efter första låg till hög och samplar först 1,5 bittid, sedan 1 bittid. Om man sedan kompletterar med en buffert och kollar att man har "bytes" med fyra bitar satta i följd och om inte synkar om så kanske det skulle funka. Dessutom så är SITOR-protokollet så att man regelbundet sänder längre sekvenser med alpha (0x0f) och rep (0x66), just för synkroniseringen.

Dessutom är en sändning alltid max 10 minuter, så man kanske inte hinner driva så mycket? Varje station sänder max 10 minuter, var fjärde timme och bara sådana stationer som är långt borta sänder samtidigt. Det är ju markvåg så räckvidden är begränsad.


Upp
 Profil  
 
InläggPostat: 08.39 2017-09-01 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
Ni som kan Matlab/Octave? Kan man inte skapa en audiofil med FSK med Octave? Skulle vara perfekt med en med samma centerfrekvens, men med en känd modulering, tex följden: 0x0f, 0x66, 0x0f, 0x66, 0x0f, 0x66, 0x0f, 0x66, 0x0f, 0x66,

Testade:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
bps = 16;       % bits per sample
sps = 8000;     % sample rate [samples/s]
freq = 1000;       % frequency of the tone [Hz]
nsecs = 10;      % number of seconds of the audio file
freq_sep = 170;   % deviatin in Hz
baud = 100;       % modulating baudrate bits per second
bitlen = sps/baud;  % length of one bit

nsamples = sps*nsecs;

% Time for one bit
t = 0: 1/bitlen : 1;

time = linspace(0, nsecs, nsamples);
wave = sin(time*2*pi*(freq+freq_sep/2));
wave2 = sin(time*2*pi*(freq-freq_sep/2));
%wave2 = sin(time*2*pi*freq*2);

% The number of bits to send - Frame Length
N = 8*1000;
% Generate a bit stream
M = [ 0 0 0 0 1 1 1 1];

bit_stream = repmat(M,1,1000);

FSK_signal = [];
Digital_signal = [];

for ii = 1: 1: 4000 %length(bit_stream)
   
    % The FSK Signal
    %FSK_signal = [FSK_signal (bit_stream(round(ii/bitlen)+1)==0)*sin(2*pi*(freq-freq_sep/2)*t)+...
    %    (bit_stream(round(ii/bitlen)+1)==1)*sin(2*pi*(freq+freq_sep/2)*t)];
    FSK_signal(ii) = wave(ii)*(bit_stream(1,round(ii/bitlen)+1)==0) + wave2(ii)*(bit_stream(1,round(ii/bitlen)+1)==1);
    %printf("%d %d  ", round(ii/bitlen)+1, bit_stream(1,round(ii/bitlen)+1));
    time = [time t];
    t =  t + 1;
   
end

wavwrite(FSK_signal, sps, bps, 'audio.wav')


Det går säkert att göra snyggare av någon som kan Matlab. Med den här metoden får jag diskontinuiteter då det byter frekvens.

Edit: åsså skall man sända i rätt ordning.. lsb först..


Upp
 Profil  
 
InläggPostat: 16.59 2017-09-01 

Blev medlem: 08.04 2012-06-19
Inlägg: 54
Ort: Lund
Här är en snippet som skapats på tåget, kolla lite extra noga kanske. Jag "behöver" nog också ett sådant här program.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
Fs =   8000;
Fsym =  100;
Fc   = 1000;
Fd   =  170;
N = Fs/Fsym;

msg = [0x48, 0x45, 0x4a, 0x21];


# serialise msg into bits
# input "msg", output "d"
d = zeros(1, length(msg)*7);  # NB 7BIT - SKIP MSB!
ix = 0;
for char = msg
  for bitcnt = 0:6 # LSB FIRST
    d(ix+1) = mod((floor(char / (2^bitcnt))), 2);
    ix = ix + 1;
  end
end


n = 0:1:length(d)*N-1;

# two oscillators
lo = cos(2*pi*(Fc-Fd/2)/Fs*n);
hi = cos(2*pi*(Fc+Fd/2)/Fs*n);

# generate BFSK-signal
# input "d", "lo", "hi", output "s"
s = zeros(1,length(d)*N);
ix = 0;
while ix < length(d)
  bit = d(ix+1);
  # r is a range of N indices in "time", corresponding
  # to the current bit.  Copy a corresponding chunk
  # from lo or hi to the output
  r = 1+ix*N:(ix+1)*N;
  # No pulse shaping, just select oscillator
  if bit == 1
    s(r) = hi(r);
  else
    s(r) = lo(r);
  endif
  ix = ix + 1;
end


Det är lätt att inte vara stormförtjust i matlabs scriptspråk...


Upp
 Profil  
 
InläggPostat: 18.43 2017-09-01 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
Tack. Betydligt enklare att mata in hexvärden direkt än bitar. Kikar jag på den i Audacity så har jag fortfarande diskontinuiteter, men det kanske inte spelar ngn roll?

Bilaga:
spektrum_2017-09-01_20-42-23.png


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


Upp
 Profil  
 
InläggPostat: 18.52 2017-09-01 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4153
Ort: Jönköping
Det enklaste sättet att undvika diskontinuiteter är att använda en variabel för fasvinkel och sedan ha ett inkrement som ökar på denna för varje sampel. Om du nu ändrar inkrementet som funktion av om det är '1' eller '0' så blir det inga hopp.
Behöver du mer förklaring kanske jag hinner slänga ihop en matlab funktion senare i kväll.


Upp
 Profil  
 
InläggPostat: 20.39 2017-09-01 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
Citera:
Behöver du mer förklaring kanske jag hinner slänga ihop en matlab funktion senare i kväll.


Gärna det, men nu tar jag kväll :) Vet inte hur mycket diskontinuiteterna påverkar det hela.

Har litet problem med koden som plockar ihop ord av bitarna så jag måste koncentrera mig på det och det är ju enklare med en kontrollerad fil med bara några få symboler.

Att det är 7 databitar, utan start eller stopp gör det ganska utmanande.


Upp
 Profil  
 
InläggPostat: 22.14 2017-09-01 

Blev medlem: 13.28 2006-09-23
Inlägg: 8378
Ort: Södertälje
Vad jag förstår så är bit-sekvenserna noga utvalda för att ha hammingavstånd 2 mellan teckenkoderna - detta för att veta om koden (varje teckensymbol individuellt faktiskt) är korrekt eller har ett fel i sig.

Redundant information är värdelöst om man inte samtidigt kan avgöra om mottagen teckensymbol är felfri eller inte så att den vet när den skall vänta in den redundanta koden eller att den redundanta koden kanske är felaktig och skall skippas. - det är också den här kodningen som gör att bitmönster/teckentabellen är relativt gles med stora luckor mellan tecknen om man ser i möjliga binära kombinationer som bitströmmen kan ge.

Det handlar inte bara om att tugga i sig bitarna utan man måste också veta hur felkollen går till och kan använda denna för att just avgöra om mottagna teckensymbol är korrekt eller om det finns tveksamheter innan den redundanta kopian kommer ett antal tecken senare.


Upp
 Profil  
 
InläggPostat: 23.29 2017-09-01 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4153
Ort: Jönköping
Här kommer ett förslag utan diskontinuiteter. Använder en blandning av AndersG och Guckrums kod + min egen.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
bps = 16;
sps = 8000;
nsecs = 10;

freq_nom = 1000;
freq_sep = 170;
baud = 100;

%msg = [0x48, 0x45, 0x4a, 0x21];
msg = hex2dec({'48','45','4a','21'})';

% serialise msg into bits
% input "msg", output "d"
d = zeros(1, length(msg)*7);  % NB 7BIT - SKIP MSB!
ix = 0;
for char = msg
  for bitcnt = 0:6 % LSB FIRST
%    d(ix+1) = mod((floor(char / (2^bitcnt))), 2);
    d(ix+1) = bitget(char,bitcnt+1);
    ix = ix + 1;
  end
end

% Calculate how much the phase is incremented for each sample
phase_inc_0 = 2*pi*(freq_nom - freq_sep/2)/sps;
phase_inc_1 = 2*pi*(freq_nom + freq_sep/2)/sps;

% Preallocate number of sample generated
nsamples = sps*nsecs;
fsk_signal = zeros(1,nsamples);

phase = 0;
phase_inc = phase_inc_0;

bitcount = 1;

for k = 1:nsamples
   
    if mod(k, round(sps/baud)) == 1

        % Check if current bit is 0 or 1
        if d(bitcount) == 0
            phase_inc = phase_inc_0;
        else
            phase_inc = phase_inc_1;
        end
       
        % Advance to next bit in message
        bitcount = bitcount + 1;
       
        % If end of message, restart from beginning
        if bitcount > length(d)
            bitcount = 1;
        end
    end

    fsk_signal(k) = sin(phase);
    phase = phase + phase_inc;
   
end

%wavwrite(fsk_signal, sps, bps, 'audio.wav');
audiowrite('audio.wav', fsk_signal, sps, 'BitsPerSample', bps);


Notera att koden är gjord för matlab och inte octave. Några funktioner skiljer, men jag har med octaves funktioner bortkommenterade.


Upp
 Profil  
 
InläggPostat: 08.17 2017-09-02 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
@Andax
Citera:
Några funktioner skiljer, men jag har med octaves funktioner bortkommenterade.


Min Octave kör den rakt av, men har du ordningen på bitarna omsvängd? Ser ut så på skopet.

När jag testar med mitt och Guckrums exempel från i går, sekvensen 0xf 0x66:

Bilaga:
PRINT_40.jpg


Så får jag ut rätt sekvens. Det jag undrar över är vad som händer vid pilarna? Varför tappar jag amplitud mitt i en räcka ettor och nollor? Något med filtren?

Sample är bara en markör då jag samplar, startar vi första låg->hög, väntar 1,5 bittid och sedan en bittid efter det. Man kunde givetvis göra det elegantare och vänta och sedan ta tre samples för att göra det stabilare.


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


Upp
 Profil  
 
InläggPostat: 10.16 2017-09-02 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4153
Ort: Jönköping
Är på ridskola med dottern så jag kan inte testa just nu. Kanske getbit funkar annorlunda. Testa och kommentera den raden och prova om originalet funkar. Det var en annan bug som gjorde att jag provade med getbit istället.

Men diskontinuiteterna är borta?


Upp
 Profil  
 
InläggPostat: 12.42 2017-09-02 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
Citera:
Men diskontinuiteterna är borta?


Skall kolla.

Undrar om jag har ngt underligt med mina filterkoefficienter. Det syns tom i bilden ovan, men nivån på signalen från det höga filtret är kanske 30% lägre än den för det låga? För att det skall funka optimalt borde de vara lika.


Upp
 Profil  
 
InläggPostat: 13.07 2017-09-02 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
@guckrum

Vilken typ av filter blir det egentligen om man beräknar enligt:

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


Om man kikar i filterdesignmjukvara så väljer man ju även filterkarakteristika, typ Chebychev, Bessel, elliptiskt? Vilket har snyggast impulsrespons?


Upp
 Profil  
 
InläggPostat: 04.56 2017-09-03 

Blev medlem: 17.41 2008-02-10
Inlägg: 241
Ort: Taipei Taiwan
De olika filtertyperna karakteriseras (i frekvensplanet) av om de har monoton/rak frekvensgång eller om du har rippel i pass/spärrband (eller båda). Vanligen är avvägningen "ju mer rippel du tillåter, ju brantare blir övergången mellan pass och spärrband".

De vanligaste är
- Butterworth (också maximally flat) är helt (nästan) rak i passbandet, är brantare än Bessel men har icke-linjär fas (dvs frekvensberoende fasförskjutning)
- Bessel är också rak som butterworth, har nästan helt linjär fas men mindre brant övergång
- Chebysh finns i två typer. Båda är brantare än Bessel/Butteworth, Typ1 har rippel i passbandet, typ2 i spärrbandet
- Elliptiska filter är brantast i övergången, men har rippel i både pass och spärrband.

Impuls/stegsvar (tidsdomän) och frekvenskarakteristiken hänger ihop. I princip, Bessel har stegsvar utan översläng och ju mer mot elliptisk man går ju mer översläng har du. Sidan 34 och frammåt i denna pdf http://www.analog.com/media/en/training ... apter8.pdf har karakterisitk på de fyra olika

Vilket man väljer avgörs lite av behoven. Dock brukar butterworth ofta funka som en första test iaf :)


Upp
 Profil  
 
InläggPostat: 14.08 2017-09-03 
EF Sponsor
Användarvisningsbild

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

Sedan så är det väl så att jag borde eftersträva ett så brett filter som möjligt för att få en vassare impulsrespons?

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


Jämfört med om jag kör funktionen fir1() i Octave/Matlab? Där kan jag ju ange exempelvis vilken typ av "fönster" jag använder, tex Hanning?


Senast redigerad av AndersG 10.46 2017-09-04, redigerad totalt 1 gång.

Upp
 Profil  
 
InläggPostat: 14.38 2017-09-03 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.10 2008-02-25
Inlägg: 5710
Ort: Mariehamn
@Andax
Citera:
Men diskontinuiteterna är borta?


Japp och nu är bitarna i rätt ordning.

Jag tror förresten att jag vet var som var problemen jag hade tidigare. Jag sände ut resultatet seriellt, men det segade ned så att jag inte höll samplingstakten, därav "dipparna" får ta och sända det på ngt annat sätt, typ över SPI.

Tänkte se till att det ser bra ut så här långt, spara dataströmmen och sedan labba med algoritmerna för tolkning på en PC.


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

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Yahoo [Bot] och 1 gäst


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:  
    Electrokit
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010