0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 function varargout = fngen(varargin)
0028
0029
0030 if utils.helper.isinfocall(varargin{:})
0031 varargout{1} = getInfo(varargin{3});
0032 return
0033 end
0034
0035 import utils.const.*
0036 utils.helper.msg(msg.MNAME, 'running %s/%s', mfilename('class'), mfilename);
0037
0038
0039 in_names = cell(size(varargin));
0040 for ii = 1:nargin,in_names{ii} = inputname(ii);end
0041
0042
0043 [as, ao_invars] = utils.helper.collect_objects(varargin(:), 'ao', in_names);
0044 pl = utils.helper.collect_objects(varargin(:), 'plist', in_names);
0045
0046 if nargout == 0
0047 error('### fngen cannot be used as a modifier. Please give an output variable.');
0048 end
0049
0050
0051 pl = combine(pl, getDefaultPlist());
0052
0053
0054 Nsecs = find(pl, 'Nsecs');
0055 swin = find(pl, 'win');
0056
0057
0058 bs = [];
0059 for j=1:length(as)
0060 if ~isa(as(j).data, 'fsdata')
0061 warning('!!! %s expects ao/fsdata objects. Skipping AO %s', mfilename, as(j).name);
0062 else
0063
0064 N = 2*(length(as(j).data.y)-1);
0065 fs = as(j).data.x(end)*2;
0066
0067 Ak = sqrt(N*as(j).data.getY*fs);
0068 Ak = [Ak; Ak(end-1:-1:2)];
0069
0070 switch swin.type
0071 case 'Kaiser'
0072 swin = specwin('Kaiser', N, swin.psll);
0073 otherwise
0074 swin = specwin(swin.type, N);
0075 end
0076
0077 Olap = 1-swin.rov/100;
0078 win = [swin.win].';
0079 segLen = N/fs;
0080 if segLen > Nsecs
0081 cNsecs = 2*segLen;
0082 else
0083 cNsecs = Nsecs;
0084 end
0085 Nsegs = 1+floor(cNsecs/segLen/Olap);
0086
0087
0088 rphi = zeros(N,1);
0089 xs = zeros(fs*(cNsecs+segLen), 1);
0090 e1 = 1; e2 = segLen*fs;
0091 step = round(segLen*fs*Olap);
0092 lxs = length(xs);
0093
0094
0095 for s=1:Nsegs
0096
0097 rphi(2:N/2) = pi*rand(1,N/2-1);
0098 rphi(N/2+1) = pi*round(rand);
0099 rphi(N/2+2:N) = -rphi(N/2:-1:2);
0100
0101
0102
0103
0104
0105
0106 X = (Ak.*sqrt(chi2rnd(2)/2)) .*exp(1i.*rphi);
0107
0108 x = ifft(X, 'symmetric');
0109
0110 xs(e1:e2) = xs(e1:e2) + win.*x;
0111
0112 e1 = e1 + step;
0113 e2 = e2 + step;
0114 if e2>lxs
0115 break
0116 end
0117 end
0118
0119 e1 = fs*segLen/2;
0120 e2 = fs*(Nsecs+segLen/2)-1;
0121 b = ao(tsdata(xs(e1:e2).', fs));
0122 b.setName(sprintf('fngen(%s)', ao_invars{j}), 'internal');
0123 b.setXunits('s', 'internal');
0124
0125 b.addHistory(getInfo, pl, ao_invars(j), as(j).hist);
0126
0127 bs = [bs b];
0128 end
0129 end
0130
0131
0132 varargout{1} = bs;
0133 end
0134
0135
0136
0137
0138 function ii = getInfo(varargin)
0139 if nargin == 1 && strcmpi(varargin{1}, 'None')
0140 sets = {};
0141 pl = [];
0142 else
0143 sets = {'Default'};
0144 pl = getDefaultPlist;
0145 end
0146
0147 ii = minfo(mfilename, 'ao', '', utils.const.categories.sigproc, '$Id: fngen.m,v 1.17 2008/09/05 11:05:29 ingo Exp $', sets, pl);
0148 end
0149
0150
0151
0152
0153 function pl_default = getDefaultPlist()
0154 pl_default = plist('Nsecs', -1, 'Win', getappdata(0, 'ltpda_default_spectral_window'));
0155 end
0156