-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDigitalModulation.m
58 lines (49 loc) · 1.94 KB
/
DigitalModulation.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
classdef (Abstract) DigitalModulation < handle
properties
M
averageEnergy
end
methods (Abstract)
signals = signalCoords(obj)
dim = dimensionality(obj)
[errorProbability, isUpperBound] = errorProbability(obj, N0)
end
methods
function setMKeepAverageEnergy(obj, M)
obj.M = M;
end
function setMKeepBitEnergy(obj, M)
bitEnergy = obj.averageEnergy/log2(obj.M);
obj.M = M;
obj.setBitEnergy(bitEnergy);
end
function setBitEnergy(obj, bitEnergy)
% Va chiamata ***DOPO*** aver reimpostato il valore di M se non
% si usa setMKeepBitEnergy()
obj.averageEnergy = bitEnergy * log2(obj.M);
end
function setAverageEnergy(obj, averageEnergy)
obj.averageEnergy = averageEnergy;
end
function displayProperties(obj)
fprintf( 'M: %d\nAverageEnergy: %f\nDimensionality: %d\n', obj.M, obj.averageEnergy, obj.dimensionality())
end
function [receivedSignals, errorRatio] = montecarloSim(obj, N0, tries)
signals = obj.signalCoords();
receivedSignals = zeros(tries, obj.dimensionality());
correctSignals = 0;
for i = 1:tries
sentSignalIndex = unidrnd(obj.M);
n = normrnd(0, sqrt(N0/2), 1, obj.dimensionality());
receivedSignals(i,:) = signals(sentSignalIndex,:) + n;
distances = zeros(1,obj.M);
for j = 1:obj.M
distances(j) = norm(receivedSignals(i,:) - signals(j,:));
end
[~, chosenSignalIndex] = min(distances);
correctSignals = correctSignals + (sentSignalIndex == chosenSignalIndex);
end
errorRatio = (tries-correctSignals) / tries;
end
end
end