used to generate figures for HF modem design blog post
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 9 Feb 2017 05:45:43 +0000 (05:45 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 9 Feb 2017 05:45:43 +0000 (05:45 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3028 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/cohpsk_plots.m [new file with mode: 0644]

diff --git a/codec2-dev/octave/cohpsk_plots.m b/codec2-dev/octave/cohpsk_plots.m
new file mode 100644 (file)
index 0000000..9fc9a11
--- /dev/null
@@ -0,0 +1,141 @@
+% 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")
+