Update April
This commit is contained in:
@@ -11,25 +11,39 @@ classdef Electricalsignal < Signal
|
||||
%ELECTRICALSIGNAL Construct an instance of this class
|
||||
% Detailed explanation goes here
|
||||
arguments
|
||||
signal
|
||||
signal
|
||||
options.fs
|
||||
options.logbook
|
||||
end
|
||||
|
||||
obj = obj@Signal(signal);
|
||||
|
||||
|
||||
fn = fieldnames(options);
|
||||
|
||||
for l = 1:numel(fn)
|
||||
obj.(fn{l}) = options.(fn{l});
|
||||
obj.(fn{l}) = options.(fn{l});
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
function pow = power(obj)
|
||||
|
||||
pow = mean(abs(obj.signal),"all") ;
|
||||
pow = mean( abs(obj.signal).^2 ) ;
|
||||
pow = pow2db(pow)+30; %dbm
|
||||
|
||||
end
|
||||
|
||||
function cspr = cspr(obj)
|
||||
|
||||
carrier_power_dbm = pow2db( abs(mean(obj.signal)).^2 )+30; % dB -> +30 -> dBm
|
||||
signal_power_dbm = obj.power;
|
||||
|
||||
carr_lin = abs(mean(obj.signal)).^2;
|
||||
sign_lin = mean(abs(obj.signal).^2);
|
||||
|
||||
cspr_lin = pow2db(carr_lin/sign_lin);
|
||||
|
||||
cspr =carrier_power_dbm-signal_power_dbm;
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -3,15 +3,26 @@ classdef Informationsignal < Signal
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
|
||||
|
||||
fs
|
||||
end
|
||||
|
||||
methods
|
||||
function obj = Informationsignal(signal)
|
||||
function obj = Informationsignal(signal,options)
|
||||
%OPTICALSIGNAL Construct an instance of this class
|
||||
% Detailed explanation goes here
|
||||
arguments
|
||||
signal
|
||||
options.fs
|
||||
options.logbook
|
||||
end
|
||||
|
||||
obj = obj@Signal(signal);
|
||||
|
||||
fn = fieldnames(options);
|
||||
|
||||
for l = 1:numel(fn)
|
||||
obj.(fn{l}) = options.(fn{l});
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -32,11 +32,53 @@ classdef Opticalsignal < Signal
|
||||
|
||||
end
|
||||
|
||||
%%
|
||||
function [obj,delay_n] = delay(obj,options)
|
||||
|
||||
arguments
|
||||
obj Opticalsignal
|
||||
options.delay_meter double = 0
|
||||
options.delay_samples = 0
|
||||
end
|
||||
|
||||
if options.delay_meter ~= 0
|
||||
delay_t = options.delay_meter /(physconst("LightSpeed")/1.4677);
|
||||
delay_n = delay_t .* obj.fs;
|
||||
else
|
||||
delay_n = options.delay_samples;
|
||||
end
|
||||
|
||||
obj.signal=delayseq(obj.signal,delay_n);
|
||||
|
||||
end
|
||||
|
||||
|
||||
function pow = power(obj)
|
||||
|
||||
pow = mean(abs(obj.signal.^2)) ;
|
||||
% pow = pow2db(pow)+30;
|
||||
pow = mean( abs(obj.signal).^2 ) ;
|
||||
pow = pow2db(pow)+30; %dbm
|
||||
|
||||
end
|
||||
|
||||
function cspr = cspr(obj)
|
||||
|
||||
carrier_power_dbm = pow2db( abs(mean(obj.signal)).^2 )+30; % dB -> +30 -> dBm
|
||||
signal_power_dbm = obj.power;
|
||||
|
||||
carr_lin = abs(mean(obj.signal)).^2;
|
||||
sign_lin = mean(abs(obj.signal).^2);
|
||||
|
||||
cspr_lin = pow2db(carr_lin/sign_lin);
|
||||
|
||||
cspr =carrier_power_dbm-signal_power_dbm;
|
||||
|
||||
end
|
||||
|
||||
function papr = papr(obj)
|
||||
|
||||
average_power = obj.power;
|
||||
peak_power = pow2db(max(abs(obj.signal.^2)))+30;
|
||||
papr = peak_power - average_power;
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -12,6 +12,7 @@ classdef Signal
|
||||
%SIGNAL Construct an instance of this class
|
||||
% Detailed explanation goes here
|
||||
obj.signal = signal;
|
||||
obj.signal = obj.signal;
|
||||
|
||||
SignalType = [];
|
||||
TimeStamp = [];
|
||||
@@ -26,13 +27,18 @@ classdef Signal
|
||||
end
|
||||
|
||||
%% CONVERT TO INFORMATIONSIGNAL
|
||||
function [i_sig, varargout] = Informationsignal(obj)
|
||||
function [i_sig, varargout] = Informationsignal(obj,options)
|
||||
arguments
|
||||
obj
|
||||
options.fs
|
||||
options.logbook
|
||||
end
|
||||
|
||||
if isa(obj,'Electricalsignal')
|
||||
|
||||
%convert to optical
|
||||
%convert to information
|
||||
varargout{1} = obj.fs;
|
||||
i_sig = Informationsignal(obj.signal);
|
||||
i_sig = Informationsignal(obj.signal,"fs",options.fs,"logbook",options.logbook);
|
||||
|
||||
elseif isa(obj,'Opticalsignal')
|
||||
|
||||
@@ -109,12 +115,32 @@ classdef Signal
|
||||
end
|
||||
|
||||
%% Add signals from one signal to another, the first object will sustain
|
||||
function Sum = plus(X,Y)
|
||||
Sum = X; %first input object will sustain
|
||||
Sum.signal = X.signal + Y.signal;
|
||||
end
|
||||
function Sum = plus(X,y)
|
||||
|
||||
%% Display length
|
||||
if isa(y,'Signal')
|
||||
Sum = X;
|
||||
Sum.signal = X.signal + y.signal;
|
||||
elseif isnumeric(y)
|
||||
Sum = X;
|
||||
Sum.signal = X.signal + y;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function Product = times(X,y)
|
||||
|
||||
if isa(y,'Signal')
|
||||
Product = X;
|
||||
Product.signal = X.signal .* y.signal;
|
||||
elseif isnumeric(y)
|
||||
Product = X;
|
||||
Product.signal = X.signal .* y;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
%% Display length
|
||||
function return_length = length(obj)
|
||||
%METHOD1 Summary of this method goes here
|
||||
% Detailed explanation goes here
|
||||
@@ -142,7 +168,7 @@ classdef Signal
|
||||
|
||||
end
|
||||
|
||||
%% Resample Signal
|
||||
%% Resample Signal
|
||||
function obj = resample(obj,options)
|
||||
|
||||
arguments
|
||||
@@ -157,6 +183,8 @@ classdef Signal
|
||||
|
||||
obj = obj.logbookentry(desc);
|
||||
|
||||
obj.fs = options.fs_out;
|
||||
|
||||
end
|
||||
|
||||
%%
|
||||
@@ -262,6 +290,7 @@ classdef Signal
|
||||
|
||||
end
|
||||
|
||||
|
||||
%%
|
||||
function obj = normalize(obj,options)
|
||||
|
||||
@@ -270,7 +299,7 @@ classdef Signal
|
||||
options.mode normalization_mode = normalization_mode.rms
|
||||
end
|
||||
|
||||
switch options.mode
|
||||
switch options.mode
|
||||
case normalization_mode.rms
|
||||
obj.signal = obj.signal/sqrt(mean(abs(obj.signal).^2,"all"));
|
||||
case normalization_mode.oneone
|
||||
@@ -283,20 +312,58 @@ classdef Signal
|
||||
function [obj,delay_n] = delay(obj,options)
|
||||
|
||||
arguments
|
||||
obj Opticalsignal
|
||||
options.delay_meter double = 0
|
||||
obj Signal
|
||||
options.delay_samples = 0
|
||||
end
|
||||
|
||||
delay_t = options.delay_meter /(physconst("LightSpeed")/1.4677);
|
||||
|
||||
delay_n = round(delay_t .* obj.fs);
|
||||
|
||||
% finally circshift the signal
|
||||
% obj.signal=circshift(obj.signal,delay_n);
|
||||
|
||||
obj.signal=[zeros(delay_n,1); obj.signal(1:end-delay_n) ];
|
||||
obj.signal=delayseq(obj.signal,options.delay_samples);
|
||||
|
||||
end
|
||||
|
||||
%%
|
||||
function [obj,D,cuts] = tsynch(obj,options)
|
||||
% time sync and cut
|
||||
arguments
|
||||
obj Signal
|
||||
options.reference Signal
|
||||
options.fs_ref = 0;
|
||||
end
|
||||
|
||||
%normalize the signal
|
||||
a = obj.normalize("mode","oneone").signal;
|
||||
|
||||
%resample the reference
|
||||
q = obj.fs/options.fs_ref;
|
||||
b = options.reference.resample("fs_in",options.fs_ref,"fs_out",obj.fs).normalize("mode","oneone").signal;
|
||||
|
||||
%estimate delay between signals
|
||||
[co,lags] = xcorr(a,b,100);
|
||||
[~,pos] = max(co);
|
||||
D = lags(pos);
|
||||
|
||||
if D == 100
|
||||
warning('Check Sync: Delay is found to be 100 which is the max. windowlength is xcorr function!')
|
||||
end
|
||||
|
||||
% delay by lagging samples
|
||||
obj = obj.delay("delay_samples",-D);
|
||||
|
||||
cuts = obj.length-(options.reference.length*q);
|
||||
|
||||
if cuts > 10
|
||||
warning('Check Sync: Signal difference larger than 10.')
|
||||
end
|
||||
|
||||
if cuts < 0
|
||||
% warning('Check Sync: Reference Signal shorter than signal to sync.')
|
||||
else
|
||||
% then cut out the length of the reference
|
||||
obj.signal = obj.signal(1:end-cuts);
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user