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;
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
% 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);
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];
% 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
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;
grid
title('FDM Rx Spectrum');
+if 0
% interleaving tests
load ../unittest/inter560.txt
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
% Simulation Parameters --------------------------------------
-frames = 50;
+frames = 100;
EbNo_dB = 7.3;
Foff_hz = 0;
modulation = 'dqpsk';
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;
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;
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);
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])