Update 'autocorr.m'
This commit is contained in:
parent
798382f614
commit
a87913aca3
114
autocorr.m
Normal file
114
autocorr.m
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
%% This function was automatically generated. When modifying its signature, take care to apply
|
||||||
|
%% modifications also to the descriptor files in the repository.
|
||||||
|
%% function out = my_app(Time Series File, Number of lags , Number of standard deviations)
|
||||||
|
|
||||||
|
function [acf,lags,bounds,numLags,numMA,numSTD] = ...
|
||||||
|
autocorr(time_series,numLags,numMA,numSTD)
|
||||||
|
|
||||||
|
[rows,columns] = size(time_series);
|
||||||
|
|
||||||
|
if (rows ~= 1) && (columns ~= 1)
|
||||||
|
|
||||||
|
error('Input file must be a vector');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
time_series = time_series(:); % Ensure a column vector
|
||||||
|
N = length(time_series); % Sample size
|
||||||
|
defaultLags = 20; % Recommendation of [1]
|
||||||
|
|
||||||
|
% Ensure numLags is a positive integer or set default:
|
||||||
|
|
||||||
|
if (nargin >= 2) && ~isempty(numLags)
|
||||||
|
|
||||||
|
if numel(numLags) > 1
|
||||||
|
|
||||||
|
error('Number of lags must be a scalar value');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if (round(numLags) ~= numLags) || (numLags <= 0)
|
||||||
|
|
||||||
|
error('Number of lags must be a positive integer');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if numLags > (N-1)
|
||||||
|
|
||||||
|
error('Number of ACF lags must not exceed the number of observations minus one');
|
||||||
|
% numLags = min(defaultLags,N-1)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
numLags = min(defaultLags,N-1); % Default
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% Ensure numMA is a nonnegative integer or set default:
|
||||||
|
|
||||||
|
if (nargin >= 3) && ~isempty(numMA)
|
||||||
|
|
||||||
|
if numel(numMA) > 1
|
||||||
|
|
||||||
|
error('Number of moving average must be a scalar value');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if (round(numMA) ~= numMA) || (numMA < 0)
|
||||||
|
|
||||||
|
error('Number of moving average must be a positive integer');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if numMA >= numLags
|
||||||
|
|
||||||
|
error('Number of moving average must be lower than number of lags');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
numMA = 0; % Default
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% Ensure numSTD is a positive scalar or set default:
|
||||||
|
|
||||||
|
if (nargin >= 4) && ~isempty(numSTD)
|
||||||
|
|
||||||
|
if numel(numSTD) > 1
|
||||||
|
|
||||||
|
error('Number of standard deviations must be a scalar value');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if numSTD < 0
|
||||||
|
|
||||||
|
error('Number of standard deviations cannot be negative');
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
numSTD = 2; % Default
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
nFFT = 2^(nextpow2(length(time_series))+1);
|
||||||
|
F = fft(time_series-mean(time_series),nFFT);
|
||||||
|
F = F.*conj(F);
|
||||||
|
acf = ifft(F);
|
||||||
|
acf = acf(1:(numLags+1)); % Retain non-negative lags
|
||||||
|
acf = acf./acf(1); % Normalize
|
||||||
|
acf = real(acf);
|
||||||
|
|
||||||
|
% Compute approximate confidence bounds using the approach in [1],
|
||||||
|
% equations 2.1.13 and 6.2.2, pp. 33 and 188, respectively:
|
||||||
|
|
||||||
|
sigmaNMA = sqrt((1+2*(acf(2:numMA+1)'*acf(2:numMA+1)))/N);
|
||||||
|
bounds = sigmaNMA*[numSTD;-numSTD];
|
||||||
|
lags = (0:numLags)';
|
||||||
|
|
||||||
|
end
|
8
my_app.m
8
my_app.m
@ -1,8 +0,0 @@
|
|||||||
%% This function was automatically generated. When modifying its signature, take care to apply
|
|
||||||
%% modifications also to the descriptor files in the repository.
|
|
||||||
function out = my_app(Time Series File, Number of lags , Number of standard deviations)
|
|
||||||
|
|
||||||
%% AUTOCORRELATION_MOD
|
|
||||||
%% TODO: Put your application code here
|
|
||||||
|
|
||||||
end
|
|
Loading…
Reference in New Issue
Block a user