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.
 
 
 
 
 

141 lines
2.8 KiB

% cohpsk_plots.m
% David Rowe Feb 2017
%
% Generate some plots for chps modem blog post
rand("seed",1);
% Multipath with simple unfiltered BPSK signal
N = 100; % number of symbols
M = 4; % oversample rate
tx_bits = rand(1,N) > 0.5;
tx_symbols = 2*tx_bits - 1;
tx = zeros(1,N*M);
for i=1:N
tx((i-1)*M+1:i*M) = tx_symbols(i);
end
h = [0 0 0 0 0.5]; % model of second path
rx1 = tx;
rx2 = filter(h,1,tx);
rx = rx1 + rx2;
% Multipath in time domain
figure(1); clf;
subplot(311)
plot(rx1, "linewidth", 4)
axis([0 10*M+1 -2 2]);
subplot(312)
plot(rx2, "linewidth", 4)
axis([0 10*M+1 -2 2]);
subplot(313)
plot(rx, "linewidth", 4)
axis([0 10*M+1 -2 2]);
xlabel('Time');
print("cohpsk_multipath_time.png", "-dpng", "-S600,440", "-F:8")
% Multipath channel magnitude and phase response against frequency
h = [1 0 0 0 0.5]; % model of two path multipath channel
H = freqz(h,1,100);
figure(2); clf;
subplot(211)
plot(20*log10(abs(H)), "linewidth", 4)
title('Amplitude (dB)');
subplot(212)
plot(angle(H), "linewidth", 4)
title('Phase (rads)');
%axis([0 500 -2 2]);
xlabel('Frequency');
print("cohpsk_multipath_channel.png", "-dpng", "-S600,440", "-F:8")
% Effective of 1 sample multipath for different symbols lengths
h = [1 0 0 0 0.5]; % model of two path multipath channel
M1 = 2;
M2 = 20;
tx1 = zeros(1,N*M1);
tx2 = zeros(1,N*M2);
for i=1:N
tx1((i-1)*M1+1:i*M1) = tx_symbols(i);
tx2((i-1)*M2+1:i*M2) = tx_symbols(i);
end
rx1 = filter(h,1,tx1);
rx2 = filter(h,1,tx2);
figure(3); clf;
subplot(211)
plot(rx1, "linewidth", 4)
axis([0 10*M1+1 -2 2]);
title('1ms multipath with 2ms symbols')
subplot(212)
plot(rx2, "linewidth", 4)
axis([0 10*M2+1 -2 2]);
title('1ms multipath with 20ms symbols')
xlabel('Time');
print("cohpsk_multipath_symbol_length.png", "-dpng", "-S600,440", "-F:8")
% DBPSK --------------------------------------------------
N = 10;
tx_bits = rand(1,N) > 0.5;
bpsk = 2*tx_bits - 1;
prev_bpsk = 1;
for i=1:N
% BPSK -> DBPSK
dbpsk(i) = bpsk(i) * (-prev_bpsk);
prev_bpsk = bpsk(i);
% oversampling
tx_bpsk((i-1)*M+1:i*M) = bpsk(i);
tx_dbpsk((i-1)*M+1:i*M) = dbpsk(i);
end
figure(4); clf;
subplot(211);
plot(tx_bpsk, "linewidth", 4)
axis([0 10*M+1 -2 2]);
title('Tx BPSK');
subplot(212);
plot(tx_dbpsk, "linewidth", 4)
axis([0 10*M+1 -2 2]);
title('Tx DBPSK');
print("cohpsk_dbpsk1.png", "-dpng", "-S600,440", "-F:8")
dbpsk *= -1;
prev_rx = 1;
for i=1:N
% rx DBPSK -> PSK
bpsk(i) = dbpsk(i) * (prev_rx);
prev_rx = bpsk(i);
% oversampling
rx_bpsk((i-1)*M+1:i*M) = bpsk(i);
rx_dbpsk((i-1)*M+1:i*M) = dbpsk(i);
end
figure(5); clf;
subplot(211);
plot(rx_dbpsk, "linewidth", 4)
axis([0 10*M+1 -2 2]);
title('Rx DBPSK with 180 deg phase shift');
subplot(212);
plot(rx_bpsk, "linewidth", 4)
axis([0 10*M+1 -2 2]);
title('Rx BPSK');
print("cohpsk_dbpsk2.png", "-dpng", "-S600,440", "-F:8")