You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.3 KiB
107 lines
2.3 KiB
% fsk_basic_alt.m
|
|
% David Rowe April 2018
|
|
%
|
|
% Modification of fsk_basic.m, to explore idea of alternating tone frequencies
|
|
% for multipath channels.
|
|
|
|
#{
|
|
|
|
So alternate tone spacings at Rs/2 worked quite well, no implementation loss
|
|
but odd spectrum.
|
|
|
|
But when multipath added (e.g 2ms delay on 2.5ms Rs), performance the same
|
|
as for non-stepped tones. Multipath echo must be interfering with stepped
|
|
tone.
|
|
|
|
When 2nd step of tones are Rs spaced - then multipath perf much better,
|
|
as expected.
|
|
|
|
There is also the impact of freq selective fading as well as ISI, FSK
|
|
tone level will be pushed down and we may choose wrong tone.
|
|
|
|
Also be interesting to test FSK with FEC on HF, combined response.
|
|
#}
|
|
|
|
% make sure we get same results from random number generators on each run
|
|
|
|
rand('seed',1);
|
|
randn('seed',1);
|
|
|
|
% constants -----------------------------------------------------------
|
|
|
|
Fs = 8000; % sample rate
|
|
f1 = 1000;
|
|
f2 = 1400;
|
|
f3 = 1200;
|
|
f4 = 1600;
|
|
Rs = 400; % symbol rate
|
|
Ts = Fs/Rs; % length of each symbol in samples
|
|
|
|
% simulation parameters -----------------------------------------------
|
|
|
|
Nbits = 10000;
|
|
EbNodB = 9;
|
|
multipath = 1;
|
|
stepped = 1;
|
|
|
|
% start simulation ----------------------------------------------------
|
|
|
|
tx_bits = round(rand(1,Nbits));
|
|
|
|
% continuous phase FSK modulator
|
|
|
|
w1 = 2*pi*f1/Fs;
|
|
w2 = 2*pi*f2/Fs;
|
|
w3 = 2*pi*f3/Fs;
|
|
w4 = 2*pi*f4/Fs;
|
|
|
|
% choose tones here, e.g. offset on every 2nd symbol
|
|
|
|
if stepped
|
|
w = [w1 w2; w3 w4];
|
|
else
|
|
w = [w1 w2; w1 w2];
|
|
end
|
|
|
|
tx_phase = 0;
|
|
tx = zeros(1,Ts*Nbits);
|
|
|
|
for i=1:Nbits
|
|
for k=1:Ts
|
|
tx_phase += w(1+mod(i-1,2),1+tx_bits(i));
|
|
tx((i-1)*Ts+k) = exp(j*tx_phase);
|
|
end
|
|
end
|
|
|
|
% AWGN channel noise
|
|
|
|
EbNo = 10^(EbNodB/10);
|
|
variance = Fs/(Rs*EbNo);
|
|
noise = sqrt(variance/2)*(randn(1,Nbits*Ts) + j*randn(1,Nbits*Ts));
|
|
|
|
rx = tx + noise;
|
|
if multipath
|
|
d = 0.002*Fs;
|
|
tx_delayed = [zeros(1,d) tx(1:end-d)];
|
|
rx += 0.5*tx_delayed;
|
|
end
|
|
|
|
figure(1); clf;
|
|
Tx = abs(fft(tx(1:Fs)));
|
|
plot(Tx);
|
|
|
|
% integrate and dump demodulator
|
|
|
|
rx_bits = zeros(1,Nbits);
|
|
for i=1:Nbits
|
|
arx_symb = rx((i-1)*Ts + (1:Ts));
|
|
wr = 1+mod(i-1,2);
|
|
filt1 = sum(exp(-j*w(wr,1)*(1:Ts)) .* arx_symb);
|
|
filt2 = sum(exp(-j*w(wr,2)*(1:Ts)) .* arx_symb);
|
|
rx_bits(i) = filt2 > filt1;
|
|
end
|
|
|
|
Nerrors = sum(xor(tx_bits, rx_bits));
|
|
ber = Nerrors/Nbits;
|
|
printf("EbNodB: %4.1f Nerrors: %d BER: %1.3f\n", EbNodB, Nerrors, ber);
|
|
|
|
|