Mercurial > hg > ltpda
diff m-toolbox/test/diagnostics/test_ltpda_arma_freq.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/test/diagnostics/test_ltpda_arma_freq.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,138 @@ +function test_ltpda_arma_freq() +% A test script for the ltpda_arma_freq function +% +% miquel 25-02-08 +% +% $Id: test_ltpda_arma_freq.m,v 1.1 2008/03/04 12:55:05 miquel Exp $ +% + +%% Make test AOs + +fs=1; +nsecs=10000; + +pl = plist(); +pl = append(pl, param('nsecs',nsecs)); +pl = append(pl, param('fs',fs)); +pl = append(pl,param('tsfcn','(heaviside(t-1000.5)).*(1-(exp(-(t-1000.5)/300))+(exp(-(t-1000.5)/500)-1))')); + +ain = ao(pl); + +% Filter input time-series +pl = append(pl, param('type', 'highpass')); +pl = append(pl, param('ripple', 5e-1)); +pl = append(pl, param('order', 1)); +pl = append(pl, param('gain', 1e-1)); +pl = append(pl, param('fc', 1e-3)); + +f = miir(pl); +[aout, fout] = filter(ain,plist(param('filter',f))); + +% Add independent noise to both channels +pn1 = plist('waveform', 'noise','type','Uniform','fs', fs, 'nsecs', nsecs); +an1 = ao(pn1); + +ain = ain + 1e-4*an1; + +pn2 = plist('waveform', 'noise','type','Uniform','fs', fs, 'nsecs', nsecs); +an2 = ao(pn2); + +aout = aout + 1e-4*an2; + + +%% Fourier transform input varialbles + +% Initialise variables +in=ain.data.y; +out=aout.data.y; + +% Fourier Transform +L=length(in); +NFFT = 2^nextpow2(L); % Next power of 2 from length of y +NFFT=length(in); + +x_ = fft(in,NFFT)/L; +y_ = fft(out,NFFT)/L; + +x = 2*abs(x_(1:NFFT/2)); % single-sided amplitude spectrum. +y = 2*abs(y_(1:NFFT/2)); % single-sided amplitude spectrum. + +f = fs/2*linspace(0,1,NFFT/2)'; + +Px=ao(fsdata(f,x,fs)); +Py=ao(fsdata(f,y,fs)); + +%% Find ARMA parameters for the transfer function + +% Parameter list for ltpda_arma_freq +pl = append(pl, param('MaxIter',1e3)); +pl = append(pl, param('MaxFunEvals',1e3)); +pl = append(pl, param('TolX',1e-7)); +pl = append(pl, param('TolFun',1e-7)); +pl = append(pl, param('ARMANum',2)); +pl = append(pl, param('ARMADen',1)); + +% Use ltpda_arma_freq +ao_arma = ltpda_arma_freq(ain, aout, pl); +% +disp(sprintf('\r! Filter parameters:\r')) +disp(sprintf('%d\t', fout.a,fout.b(2:length(fout.b)))) +disp(sprintf('\r! Estimated parameters:\r')) +disp(sprintf('%d\t',ao_arma.data.y(1:length(ao_arma.data.y)-1))) + +%% Compute fitted output +p = find(pl, 'ARMANum'); +q = find(pl, 'ARMADen'); + +% Compute time domain fit +flt = miir([ao_arma.data.y(1:p)],[1 ao_arma.data.y(p+1:p+q)],find(pl,'fs')); +[afit, ffit] = filter(ain,plist(param('filter',flt))); + +% Compute frequency domain fit +% [Pfit, Pf] = filter(Px,plist(param('filter',f))); % problems with ao.filter +yfit= freqfun([ao_arma.data.y(1:p)],[1 ao_arma.data.y(p+1:p+q)],x,f,fs); % using adhoc function +Pfit=ao(fsdata(f,yfit,fs)); + +% Plot time domain +iplot(ain,aout,afit,plist('Legends', {'Input','Output','Fit'})) + +% Plot frequency domain +iplot(Px,Py,Pfit,plist('Legends', {'Input','Output','Fit'})) + + +% Plot history +figure +plot(ao_arma.hist) + +%% Reproduce from history + +% Write an m-file from AO +ao2m(ao_arma, 'ltpda_test.m'); + +% now run it +clear all; +a_out = ltpda_test; + +% iplot(a_out) + +figure +plot(a_out.hist) + +%% Delete test files +delete('ltpda_test.m'); + + +% Compute filter +function F= freqfun(ps,qs,xdata,f,fs) +Hnum=0; +Hden=0; +for j = 1:length(ps) +Hnum = Hnum+ps(j)*exp(-(j-1)*i*2*pi*f/fs); +end +for j = 1:length(qs) +Hden = Hden+qs(j)*exp(-(j-1)*i*2*pi*f/fs); +end +F=abs(Hnum./Hden).*xdata; + + +