From cfbe21480178e1f485c6a152c19c25b39f5b2e48 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 9 Feb 2017 05:45:43 +0000 Subject: [PATCH] used to generate figures for HF modem design blog post git-svn-id: https://svn.code.sf.net/p/freetel/code@3028 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/cohpsk_plots.m | 141 +++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 codec2-dev/octave/cohpsk_plots.m diff --git a/codec2-dev/octave/cohpsk_plots.m b/codec2-dev/octave/cohpsk_plots.m new file mode 100644 index 00000000..9fc9a11f --- /dev/null +++ b/codec2-dev/octave/cohpsk_plots.m @@ -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") + -- 2.25.1