Nödvändig bandbredd för FSK?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
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 »

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.
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.
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 »

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: Markera allt

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..
guckrum
Inlägg: 1670
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

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

Inlägg av guckrum »

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: Markera allt

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...
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 »

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?
spektrum_2017-09-01_20-42-23.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

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

Inlägg av Andax »

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.
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 »

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.
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 »

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.
Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

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

Inlägg av Andax »

Här kommer ett förslag utan diskontinuiteter. Använder en blandning av AndersG och Guckrums kod + min egen.

Kod: Markera allt

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.
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 »

@Andax
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:
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

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

Inlägg av Andax »

Ä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?
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 »

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.
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

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

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));
Om man kikar i filterdesignmjukvara så väljer man ju även filterkarakteristika, typ Chebychev, Bessel, elliptiskt? Vilket har snyggast impulsrespons?
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 »

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 :)
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 »

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: Markera allt

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 4 september 2017, 11:46:44, redigerad totalt 1 gång.
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 »

@Andax
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.
Skriv svar