From 9f0dd353821a91fdf95a4b8f4f98c7b4a82e1dba Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 28 Feb 2013 04:05:21 +0000 Subject: [PATCH] tested C mod OK git-svn-id: https://svn.code.sf.net/p/freetel/code@1178 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/fdmdv.m | 11 +++++++---- codec2-dev/octave/fdmdv_demod.m | 25 +++++++++++++++++-------- codec2-dev/octave/fdmdv_ut.m | 26 +++++++++++++++----------- 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/codec2-dev/octave/fdmdv.m b/codec2-dev/octave/fdmdv.m index 65f4c5a0..8af361de 100644 --- a/codec2-dev/octave/fdmdv.m +++ b/codec2-dev/octave/fdmdv.m @@ -17,7 +17,8 @@ randn('state',1); global Fs = 8000; % sample rate in Hz global T = 1/Fs; % sample period in seconds -global Rs = 50; % symbol rate in Hz +global Rs; + Rs = 50; % symbol rate in Hz global Nc; % number of carriers Nc = 14; global Nb; @@ -26,7 +27,8 @@ global Rb; Rb = Nc*Rs*Nb; % bit rate global M = Fs/Rs; % oversampling factor global Nsym = 6; % number of symbols to filter over -global Fsep = 75; % Separation between carriers (Hz) +global Fsep; + Fsep = 75; % Separation between carriers (Hz) global Fcentre = 1500; % Centre frequency, Nc/2 carriers below this, N/c carriers above (Hz) global Nt = 5; % number of symbols we estimate timing over global P = 4; % oversample factor used for rx symbol filtering @@ -990,9 +992,10 @@ freq(Nc+1) = exp(j*2*pi*Fcentre/Fs); % takes care of that. global phase_tx; -%phase_tx = ones(Nc+1,1); +phase_tx = ones(Nc+1,1); phase_tx = exp(j*2*pi*(0:Nc)/(Nc+1)); -%phase_tx(1) *= 10 .^ (-6/20); +%phase_tx = exp(j*2*pi*(0:Nc)/4); +%phase_tx(Nc+1) = -1; global phase_rx; phase_rx = ones(Nc+1,1); diff --git a/codec2-dev/octave/fdmdv_demod.m b/codec2-dev/octave/fdmdv_demod.m index 94c16900..0675285b 100644 --- a/codec2-dev/octave/fdmdv_demod.m +++ b/codec2-dev/octave/fdmdv_demod.m @@ -116,7 +116,7 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename) else rx_symbols_log = [rx_symbols_log rx_symbols]; endif - [rx_bits sync f_err pd] = qpsk_to_bits(prev_rx_symbols, rx_symbols, modulation); + [rx_bits sync f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation); [sig_est noise_est] = snr_update(sig_est, noise_est, pd); snr_est = calc_snr(sig_est, noise_est); snr_est_log = [snr_est_log snr_est]; @@ -170,8 +170,13 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename) % Print Stats % --------------------------------------------------------------------- + % Peak to Average Power Ratio calcs from http://www.dsplog.com + + papr = max(rx_fdm_log.*conj(rx_fdm_log)) / mean(rx_fdm_log.*conj(rx_fdm_log)); + papr_dB = 10*log10(papr); + ber = total_bit_errors / total_bits; - printf("%d bits %d errors BER: %1.4f\n",total_bits, total_bit_errors, ber); + printf("%d bits %d errors BER: %1.4f PAPR(rx): %1.2f dB\n",total_bits, total_bit_errors, ber, papr_dB); % --------------------------------------------------------------------- % Plots @@ -232,12 +237,14 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename) clf; hold on; lep = length(error_pattern_log); - for p=1:Nc - plot(p + 0.25*error_pattern_log((p-1)*2+1:Nc*Nb:lep)); - plot(0.30 + p + 0.25*error_pattern_log(p*2:Nc*Nb:lep),'r') + if lep != 0 + for p=1:Nc + plot(p + 0.25*error_pattern_log((p-1)*2+1:Nc*Nb:lep)); + plot(0.30 + p + 0.25*error_pattern_log(p*2:Nc*Nb:lep),'r') + end + hold off; + axis([1 lep/(Nc*Nb) 0 15]) end - hold off; - axis([1 lep/(Nc*Nb) 0 15]) figure(7) clf; @@ -252,6 +259,7 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename) grid title('FDM Rx Spectrum'); +if 0 % interleaving tests load ../unittest/inter560.txt @@ -275,12 +283,13 @@ function fdmdv_demod(rawfilename, nbits, errorpatternfilename) end hold off; axis([1 lep/(Nc*Nb) 0 15]) +end % save error pattern file if nargin == 3 fout = fopen(errorpatternfilename, "wb"); - fwrite(fout, error_pattern_log_inter, "short"); + fwrite(fout, error_pattern_log, "short"); fclose(fout); end diff --git a/codec2-dev/octave/fdmdv_ut.m b/codec2-dev/octave/fdmdv_ut.m index 274d1ba9..6021c77c 100644 --- a/codec2-dev/octave/fdmdv_ut.m +++ b/codec2-dev/octave/fdmdv_ut.m @@ -12,7 +12,7 @@ fdmdv; % load modem code % Simulation Parameters -------------------------------------- -frames = 50; +frames = 100; EbNo_dB = 7.3; Foff_hz = 0; modulation = 'dqpsk'; @@ -65,8 +65,8 @@ C = 1; % power of each FDM carrier (energy/sample). Total Carrier power should N = 1; % total noise power (energy/sample) of noise source across entire bandwidth % Eb = Carrier power * symbol time / (bits/symbol) -% = C *(1/Rs) / 2 -Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(2); +% = C *(1/Rs) / Nb +Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(Nb); No_dBHz = Eb_dB - EbNo_dB; @@ -182,7 +182,7 @@ for f=1:frames end foff_log = [ foff_log foff ]; foff_rect = exp(j*2*pi*foff/Fs); - + for i=1:M foff_phase *= foff_rect'; rx_fdm_delay(i) = rx_fdm_delay(i)*foff_phase; @@ -269,12 +269,16 @@ ber = total_bit_errors / total_bits; papr = max(tx_fdm_log.*conj(tx_fdm_log)) / mean(tx_fdm_log.*conj(tx_fdm_log)); papr_dB = 10*log10(papr); -% Note Eb/No set point is for Nc data carriers only, exclduing pilot. -% This is convenient for testing BER versus Eb/No. Measured Eb/No -% includes power of pilot. Similar for SNR, first number is SNR excluding -% pilot pwr for Eb/No set point, 2nd value is measured SNR which will be a little -% higher as pilot power is included. +% Note Eb/No set point is for Nc data carriers only, excluding pilot. +% This is convenient for testing BER versus Eb/No. Measured SNR & +% Eb/No includes power of pilot. Similar for SNR, first number is SNR +% excluding pilot pwr for Eb/No set point, 2nd value is measured SNR +% which will be a little higher as pilot power is included. Note current SNR +% est algorithm only works for QPSK, gives silly values for 8PSK. +printf("Bits/symbol.: %d\n", Nb); +printf("Num carriers: %d\n", Nc); +printf("Bit Rate....: %d bits/s\n", Rb); printf("Eb/No (meas): %2.2f (%2.2f) dB\n", EbNo_dB, 10*log10(0.25*tx_pwr*Fs/(Rs*Nc*noise_pwr))); printf("bits........: %d\n", total_bits); printf("errors......: %d\n", total_bit_errors); @@ -308,8 +312,8 @@ title('Freq offset (Hz)'); figure(3) clf; subplot(211) -plot(real(rx_fdm_log)); -title('FDM Rx Signal'); +plot(real(tx_fdm_log)); +title('FDM Tx Signal'); subplot(212) plot((0:Nspec/2-1)*Fs/Nspec, SdB(1:Nspec/2) - 20*log10(Nspec/2)) axis([0 Fs/2 -40 0]) -- 2.25.1