Mercurial > hg > ltpda
diff m-toolbox/classes/@ssm/noiseSpectrum.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ssm/noiseSpectrum.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,238 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: noiseSpectrum makes spectra of ssm outputs from the given noises spectra. +% +% CALL: [ao_out] = noiseSpectrum(sys, plist_inputs) +% +% INPUTS: +% - sys, (array of) ssm object +% - plist_inputs contains names of noise inputs, spectra of +% specified noise inputs, returned +% outputs and frequency's vector of returned spectrum +% +% OUTPUTS: +% _ ao_out contains spectra of specified outputs and states +% +% <a href="matlab:utils.helper.displayMethodInfo('ssm', 'noiseSpectrum')">Parameters Description</a> +% +% VERSION: $Id: noiseSpectrum.m,v 1.8 2011/04/08 08:56:23 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +function varargout = noiseSpectrum(varargin) + + %% starting initial checks + error('### this function is deprecated, use ssm/PSD or ssm/CPSD instead') + + % Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]); + + % Collect input variable names + in_names = cell(size(varargin)); + for ii = 1:nargin,in_names{ii} = inputname(ii);end + + % Collect all SSMs and plists + [sys, ssm_invars, rest] = utils.helper.collect_objects(varargin(:), 'ssm', in_names); + [pl, invars2, rest] = utils.helper.collect_objects(rest(:), 'plist'); + pl = combine(pl, plist(rest{:}) ); + plist_inputs = combine(pl, getDefaultPlist()); + + + %% retrieve system infos + if numel(sys)~=1 + error('noisespectrum needs exactly one ssm as an input') + end + if ~sys.isnumerical + error(['error because system ',sys.name,' is not numerical']); + end + + %% collecting data + noise_varnames = find(plist_inputs, 'noise variable names'); + if ischar(noise_varnames) + noise_varnames = {noise_varnames}; + end + Nnoise = numel(noise_varnames); + In_noise_spectrum = find(plist_inputs, 'spectrum'); + freq_vector = find(plist_inputs, 'f'); + return_outputs = find(plist_inputs, 'return outputs'); + if ischar(return_outputs) + return_outputs = {return_outputs}; + end + Noutputs=numel(return_outputs); + + %% verify frequency + Nspectrum=length(In_noise_spectrum); + ur=1; + diff_vec=[]; + vec=[]; + for u=1: Nspectrum + noise=In_noise_spectrum{u}; + if isa(noise,'ao')==1 + vec(ur,:)=noise.x; + ur=ur+1; + end + end + + if ~isempty(vec) && ur>=3 + for ui=1: ur-2 + diff_vec(ui,:)= vec(ui+1,:)-vec(ui,:); + end + end + + if ~isempty(diff_vec) + if any(diff_vec~=0) + freq_status=0; + error('### Please specify inputs in the same frequency range .') + else + freq_status=1; + end + end + + if isempty(vec) && isempty(freq_vector) + f1 = find(plist_inputs,'f1'); + f2 = find(plist_inputs,'f2'); + nf = find(plist_inputs,'nf'); + if isempty(f1) || isempty(f2)|| isempty(nf) + error('### Please specify frequency vector a start and stop frequency .'); + else + freq_vector = linspace(f1, f2, nf); + end + + end + + if ~isempty(freq_vector) + if ur==2 || (ur>=3 && freq_status==1) + if length(freq_vector) ~=length(vec(1,:)) || any((freq_vector - vec(1,:))~=0) + error('### Please specify inputs in asked frequency vector .'); + else + freq_vector=vec(1,:); + end + end + else + if ur==2 || (ur>=3 && freq_status==1) + freq_vector=vec(1,:); + end + end + + %% spectra inputs + if Nnoise>=1 + for u=1: Nnoise + noise=In_noise_spectrum{u}; + if isa(noise,'ao')==1 + noise_uncor{u}= In_noise_spectrum{u}.y'; + elseif isa(noise,'double')==1 + noise_uncor{u}=In_noise_spectrum{u}.*ones(1,length(freq_vector)); + elseif isa(noise,'miir')==1 + rep=resp(In_noise_spectrum{u},plist('f',freq_vector)); + noise_uncor{u}= rep.y'; + elseif isa(noise,'pzmodel')==1 + rep=resp(In_noise_spectrum{u},plist('f',freq_vector)); + noise_uncor{u}=rep.y'; + else error('spectrum should be an Ao, a double, a miir or a pzmodel') + end + end + else + error('Specify at least one input noise spectrum') + end + + %% SSM Transfer function + plist_OutputTF=plist('inputs', noise_varnames,'outputs', return_outputs, 'f',freq_vector); + if ~isempty(ver('control')) % check that control system toolbox is installed + rep_TF= sys.bodecst(plist_OutputTF); + else + rep_TF= sys.bode(plist_OutputTF); + end + + [Ninp Nout]=size(rep_TF); + if (Ninp~=Nnoise)||(Nout~=Noutputs) + error('Asked input /output does not exist. Please verify names of return outputs and noise variable names') + end + + %% Spectral density + dd=[noise_uncor{1,:}]; + noise=reshape(dd,length(freq_vector),Nnoise); + for u=1:length(freq_vector) + mat_TF=reshape(rep_TF.y(u),Noutputs,Nnoise); + for ui=1:Noutputs + mat_TFN(ui,:)= mat_TF(ui,:).* abs(noise(u,:)); + end + resu(:,:,u)=mat_TFN*conj(transpose(mat_TF)); + end + + %% saving in aos + + ao_out = ao.initObjectWithSize(Noutputs,Noutputs); + for i=1:Noutputs + + for j=1:Noutputs + if j==i + nameao=[sprintf('PSD(%s)', return_outputs{i})]; + else + nameao=[sprintf('CPD(%s)', [return_outputs{i} ',' return_outputs{j}])]; + end + for u=1:length(freq_vector) + ao_out_y(u)= resu(j,i,u); + end + ao_out(i,j) = ao(fsdata(freq_vector,ao_out_y)); + ao_out(i,j).setName(nameao); + ao_out(i,j).setXunits('Hz'); + ao_out(i,j).setYunits('arb'); + ao_out(i,j).setDescription(... + ['Cross Power Spectrum of ' , return_outputs{j} , return_outputs{i}]); + end + if nargout == numel(ao_out) + for ii = 1:numel(ao_out) + varargout{ii} = ao_out(ii); + end + else + varargout{1} = ao_out; + end + end + varargout = {ao_out }; +end + + +%-------------------------------------------------------------------------- +% Get Info Object +%-------------------------------------------------------------------------- +function ii = getInfo(varargin) + + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + else + sets = {'Default'}; + pl = getDefaultPlist; + end + % Build info object + ii = minfo(mfilename, 'ssm', 'ltpda', utils.const.categories.op, '$Id: noiseSpectrum.m,v 1.8 2011/04/08 08:56:23 hewitson Exp $', sets, pl); + +end + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function pl = getDefaultPlist() + pl = plist(); + + p = param({'noise variable names', 'A cell-array of strings specifying the desired input variable names.'}, {} ); + pl.append(p); + + p = param({'spectrum', 'The spectrum of this noise between input ports for the <i>time-continuous</i> noise model.'}, []); + pl.append(p); + + p = param({'f', 'frequency vector of output spectrum .'}, []); + pl.append(p); + + p = param({'return outputs', 'A cell-array of output ports to return.'}, {}); + pl.append(p); + +end +