-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgetEmuSignalMap.m
113 lines (94 loc) · 4.81 KB
/
getEmuSignalMap.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
function emuSignalMap = getEmuSignalMap()
OSR = 20;
FFTLength = 64;
% Half-period sine wave
pulse = sin(0:pi / OSR:(OSR - 1) * pi / OSR);
objWaveform = zeros(OSR * 16 + OSR / 2, 16);
% See Table 73 in IEEE 802.15.4, 2011 revision
chipMap = ...
[1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0;
1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0;
0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0;
0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1;
0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1;
0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0;
1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1;
1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1;
1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1;
1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1;
0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1;
0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0;
0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0;
0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1;
1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0;
1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0];
flipQFactor = [-1 * ones(1, 10), ones(1, (4 * OSR - 10))];
flipQFactor = repmat(flipQFactor, 1, (OSR * 16) / length(flipQFactor));
flipQFactor = [ones(1, OSR / 2), flipQFactor]';
for sym_ith = 1:1:16
chips = chipMap(sym_ith, :); % +1 for 1-based indexing
% O-QPSK modulation
% split two 2 parallel streams, also map [0, 1] to [-1, 1]
oddChips = chips(1:2:end) * 2 - 1;
evenChips = chips(2:2:end) * 2 - 1;
% Half-sine pulse filtering
filteredReal = pulse' * oddChips; % each column is now a filtered pulse
filteredImag = pulse' * evenChips; % each column is now a filtered pulse
re = [filteredReal(:); zeros(round(OSR / 2), 1)];
im = [zeros(round(OSR / 2), 1); filteredImag(:)];
% Quadrant flipping of WEBee.
im = im .* flipQFactor;
objWaveform(:, sym_ith) = complex(re, im);
end
numSampPerWiFiCP = 16;
numSampPerWiFiSym = 80;
% WEBee signal tweaking.
for ith = 2:2:4
objWaveform(((ith - 1) * numSampPerWiFiSym + 1):((ith - 1) * numSampPerWiFiSym + numSampPerWiFiCP), :) = ...
objWaveform((ith * numSampPerWiFiSym - numSampPerWiFiCP + 1):(ith * numSampPerWiFiSym), :);
end
numPadSamp = 0;
if mod(size(objWaveform, 1), numSampPerWiFiSym) > 0
numPadSamp = numSampPerWiFiSym - mod(size(objWaveform, 1), numSampPerWiFiSym);
end
objWaveform = [objWaveform; zeros(numPadSamp, size(objWaveform, 2))];
% Waveform configuration
cfgNonHT = wlanNonHTConfig;
cfgNonHT.Modulation = 'OFDM';
cfgNonHT.ChannelBandwidth = 'CBW20'; % Channel bandwidth
cfgNonHT.NumTransmitAntennas = 1; % Number of transmit antennas
cfgNonHT.MCS = 7; % Modulation and coding scheme
cfgNonHT.PSDULength = 110;
cfgNonHT.BandwidthOperation = 'Static';
emuSignalMap = zeros(size(objWaveform, 1), size(objWaveform, 2));
field = 'NonHT-Data';
numWiFisym = ceil(size(emuSignalMap, 1) ./ numSampPerWiFiSym);
for sym_ith = 1:1:size(objWaveform, 2)
focusObjZigBeeSignal = reshape(objWaveform(:, sym_ith), numSampPerWiFiSym, numWiFisym);
focusObjZigBeeSignal(1:1:16, :) = []; % Remove the CP part.
rxSignalWiFi = fftshift(fft(focusObjZigBeeSignal, [], 1), 1);
info = wlanNonHTOFDMInfo(field, cfgNonHT);
% Demodulation based on MATLAB WLAN toolbox.
rxSignalWiFi = rxSignalWiFi(info.ActiveFFTIndices, :);
rxSignalWiFi = rxSignalWiFi .* sqrt(FFTLength);
rxSignalWiFi = rxSignalWiFi(info.DataIndices, :);
rxSignalWiFi(1:1:(size(info.DataIndices, 1) / 2 - 5), :) = 0;
rxSignalWiFi((end - size(info.DataIndices, 1) / 2 + 6):1:end, :) = 0;
% WEBee part.
[txBitsW, scramInit] = webeeBitGenerator(rxSignalWiFi, cfgNonHT);
% Send out emulate signals.
cfgNonHT.PSDULength = length(txBitsW) / 8; % Payload length in bytes
emuSignalMap(:, sym_ith) = wlanNonHTData(txBitsW, cfgNonHT, scramInit);
end
% Rrop non-signal samples.
emuSignalMap = emuSignalMap(1:1:end-numPadSamp, :);
emuSignalMap = lowpass(emuSignalMap, 1e6, wlanSampleRate(cfgNonHT));
% Normalization so that the power of each signal is 1
for sym_ith = 1:1:size(emuSignalMap, 2)
tmp = emuSignalMap(:, sym_ith);
emuSignalMap(:, sym_ith) = tmp / sqrt(sum(abs(tmp.^2), 1)/size(tmp, 1));
end
% Downsampling
emuSignalMap = emuSignalMap(1:5:end, :);
save ../emuSignalMap.mat emuSignalMap
end