Many changes
This commit is contained in:
@@ -78,11 +78,12 @@ classdef Duobinary
|
||||
|
||||
end
|
||||
|
||||
function signal = encode(~,signal)
|
||||
function signal = encode(~,signal,options)
|
||||
|
||||
arguments
|
||||
~
|
||||
signal
|
||||
options.M = [];
|
||||
end
|
||||
|
||||
if isa(signal,'Signal')
|
||||
@@ -93,17 +94,19 @@ classdef Duobinary
|
||||
|
||||
data = data./rms(data);
|
||||
|
||||
u = unique(data);
|
||||
M = numel(u);
|
||||
if isempty(options.M)
|
||||
u = unique(data);
|
||||
options.M = numel(u);
|
||||
end
|
||||
|
||||
%make unipolar
|
||||
if M == 4
|
||||
if options.M == 4
|
||||
data = data .* sqrt(5);
|
||||
elseif M == 6
|
||||
elseif options.M == 6
|
||||
data = data .* sqrt(10);
|
||||
elseif M == 8
|
||||
elseif options.M == 8
|
||||
data = data .* sqrt(21);
|
||||
elseif M == 16
|
||||
elseif options.M == 16
|
||||
data = data .* sqrt(85);
|
||||
warning('Check if PAM16 implementation, mapping and scaling is correct!')
|
||||
end
|
||||
@@ -113,7 +116,7 @@ classdef Duobinary
|
||||
data = data - b;
|
||||
data = data ./ 2;
|
||||
|
||||
% assert(isequal((0:M-1)',unique(data)),'Check Duobinary Precoding'); %seems the signal is not unipolar
|
||||
% assert(isequal((0:options.M-1)',unique(data)),'Check Duobinary Precoding'); %seems the signal is not unipolar
|
||||
|
||||
% duobinary coding (1+D)
|
||||
% coeff = [1,1];
|
||||
@@ -137,14 +140,14 @@ classdef Duobinary
|
||||
mean_power = sum((unique_points .^ 2) .* probabilities);
|
||||
scaling_factor = sqrt(mean_power);
|
||||
|
||||
if M == 4
|
||||
if options.M == 4
|
||||
data = data ./ sqrt(2.5); % 7-level constellation weighted with probability after DB code i.e. mean([-3 3 -2 -2 2 2 -1 -1 -1 1 1 1 0 0 0 0].^2) = 2.5 --> sqrt(2.5) == rms(constellation)
|
||||
elseif M == 6
|
||||
elseif options.M == 6
|
||||
data = data ./ sqrt(5.8);
|
||||
elseif M == 8
|
||||
elseif options.M == 8
|
||||
data = data ./ sqrt(10.5); % 15-level constellation weighted with probability after DB code i.e.
|
||||
else
|
||||
errormsg("Error in: Duobinary encode > scale unipolar to bipolar > The data is not PAM4, PAM6 or PAM 8? ")
|
||||
error("Error in: Duobinary encode > scale unipolar to bipolar > The data is not PAM4, PAM6 or PAM 8? ")
|
||||
end
|
||||
|
||||
if isa(signal,'Signal')
|
||||
@@ -165,15 +168,25 @@ classdef Duobinary
|
||||
|
||||
end
|
||||
|
||||
function signalclass = decode(~,signalclass)
|
||||
function signalclass = decode(~,signalclass,options)
|
||||
|
||||
arguments
|
||||
~
|
||||
signalclass
|
||||
options.M = [];
|
||||
end
|
||||
|
||||
data = signalclass.signal;
|
||||
u = unique(data);
|
||||
I = numel(u); %number of duobinary coded const. points
|
||||
M = (I+1)/2; %PAM-M order
|
||||
if isempty(options.M)
|
||||
M = (I+1)/2; %PAM-M order
|
||||
else
|
||||
M = options.M; %PAM-M order
|
||||
end
|
||||
|
||||
%make unipolar
|
||||
if I == 7
|
||||
if I == 7 || I == 6
|
||||
data = data .* sqrt(2.5);
|
||||
elseif I == 11
|
||||
data = data .* sqrt(5.8);
|
||||
|
||||
Reference in New Issue
Block a user