-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget_eff_SNRs.m
82 lines (65 loc) · 2.56 KB
/
get_eff_SNRs.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
%GET_EFF_SNRS Compute the effective SNR values from a CSI matrix
% Note that the matrix is expected to have dimensions M x N x S, where
% M = # TX antennas
% N = # RX antennas
% S = # subcarriers
%
% (c) 2008-2011 Daniel Halperin <[email protected]>,
% Wenjun Hu
%
function ret=get_eff_SNRs(csi)
ret = zeros(7,4) + eps; % machine epsilon is smallest possible SNR
% [M N S] = size(csi); % If next line doesn't compile
[M N ~] = size(csi);
k = min(M,N);
% Do the various SIMO configurations (i.e., TX antenna selection)
if k >= 1
snrs = get_simo_SNRs(csi);
bers = bpsk_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret((1:length(mean_ber)),1) = bpsk_berinv(mean_ber);
bers = qpsk_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret((1:length(mean_ber)),2) = qpsk_berinv(mean_ber);
bers = qam16_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret((1:length(mean_ber)),3) = qam16_berinv(mean_ber);
bers = qam64_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret((1:length(mean_ber)),4) = qam64_berinv(mean_ber);
end
% Do the various MIMO2 configurations (i.e., TX antenna selection)
if k >= 2
snrs = get_mimo2_SNRs(csi);
bers = bpsk_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(3+(1:length(mean_ber)),1) = bpsk_berinv(mean_ber);
bers = qpsk_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(3+(1:length(mean_ber)),2) = qpsk_berinv(mean_ber);
bers = qam16_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(3+(1:length(mean_ber)),3) = qam16_berinv(mean_ber);
bers = qam64_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(3+(1:length(mean_ber)),4) = qam64_berinv(mean_ber);
end
% Do the MIMO3 configuration
if k >= 3
snrs = get_mimo3_SNRs(csi);
bers = bpsk_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(6+(1:length(mean_ber)),1) = bpsk_berinv(mean_ber);
bers = qpsk_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(6+(1:length(mean_ber)),2) = qpsk_berinv(mean_ber);
bers = qam16_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(6+(1:length(mean_ber)),3) = qam16_berinv(mean_ber);
bers = qam64_ber(snrs);
mean_ber = mean(mean(bers, 3), 2);
ret(6+(1:length(mean_ber)),4) = qam64_berinv(mean_ber);
end
% Apparently, sometimes it can be infinite so cap it at 40 dB
%ret(ret==Inf) = dbinv(40);
end