MakeSignal

PURPOSE ^

MakeSignal -- Make artificial signal

SYNOPSIS ^

function sig = MakeSignal(Name,n)

DESCRIPTION ^

 MakeSignal -- Make artificial signal
  Usage
    sig = MakeSignal(Name,n)
  Inputs
    Name string: 'HeaviSine', 'Bumps', 'Blocks',
            'Doppler', 'Ramp', 'Cusp', 'Sing', 'HiSine',
            'LoSine', 'LinChirp', 'TwoChirp', 'QuadChirp',
            'MishMash', 'WernerSorrows' (Heisenberg),
            'Leopold' (Kronecker), 'Piece-Regular' (Piece-Wise Smooth),
         'Riemann','HypChirps','LinChirps', 'Chirps', 'Gabor'
         'sineoneoverx','Cusp2','SmoothCusp','Gaussian'
         'Piece-Polynomial' (Piece-Wise 3rd degree polynomial)
    n      desired signal length
  Outputs
    sig    1-d signal

  References
    Various articles of D.L. Donoho and I.M. Johnstone

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function sig = MakeSignal(Name,n)
0002 % MakeSignal -- Make artificial signal
0003 %  Usage
0004 %    sig = MakeSignal(Name,n)
0005 %  Inputs
0006 %    Name string: 'HeaviSine', 'Bumps', 'Blocks',
0007 %            'Doppler', 'Ramp', 'Cusp', 'Sing', 'HiSine',
0008 %            'LoSine', 'LinChirp', 'TwoChirp', 'QuadChirp',
0009 %            'MishMash', 'WernerSorrows' (Heisenberg),
0010 %            'Leopold' (Kronecker), 'Piece-Regular' (Piece-Wise Smooth),
0011 %         'Riemann','HypChirps','LinChirps', 'Chirps', 'Gabor'
0012 %         'sineoneoverx','Cusp2','SmoothCusp','Gaussian'
0013 %         'Piece-Polynomial' (Piece-Wise 3rd degree polynomial)
0014 %    n      desired signal length
0015 %  Outputs
0016 %    sig    1-d signal
0017 %
0018 %  References
0019 %    Various articles of D.L. Donoho and I.M. Johnstone
0020 %
0021    if nargin > 1,
0022     t = (1:n) ./n;
0023    end
0024     if strcmp(Name,'HeaviSine'),
0025         sig = 4.*sin(4*pi.*t);
0026         sig = sig - sign(t - .3) - sign(.72 - t);
0027     elseif strcmp(Name,'Bumps'),
0028         pos = [ .1 .13 .15 .23 .25 .40 .44 .65  .76 .78 .81];
0029         hgt = [ 4  5   3   4  5  4.2 2.1 4.3  3.1 5.1 4.2];
0030         wth = [.005 .005 .006 .01 .01 .03 .01 .01  .005 .008 .005];
0031         sig = zeros(size(t));
0032         for j =1:length(pos)
0033            sig = sig + hgt(j)./( 1 + abs((t - pos(j))./wth(j))).^4;
0034         end 
0035     elseif strcmp(Name,'Blocks'),
0036         pos = [ .1 .13 .15 .23 .25 .40 .44 .65  .76 .78 .81];
0037         hgt = [4 (-5) 3 (-4) 5 (-4.2) 2.1 4.3  (-3.1) 2.1 (-4.2)];
0038         sig = zeros(size(t));
0039         for j=1:length(pos)
0040             sig = sig + (1 + sign(t-pos(j))).*(hgt(j)/2) ;
0041         end
0042     elseif strcmp(Name,'Doppler'),
0043         sig = sqrt(t.*(1-t)).*sin((2*pi*1.05) ./(t+.05));
0044     elseif strcmp(Name,'Ramp'),
0045         sig = t - (t >= .37);
0046     elseif strcmp(Name,'Cusp'),
0047         sig = sqrt(abs(t - .37));
0048     elseif strcmp(Name,'Sing'),
0049         k = floor(n * .37);
0050         sig = 1 ./abs(t - (k+.5)/n);
0051     elseif strcmp(Name,'HiSine'),
0052         sig = sin( pi * (n * .6902) .* t);
0053     elseif strcmp(Name,'LoSine'),
0054         sig = sin( pi * (n * .3333) .* t);
0055     elseif strcmp(Name,'LinChirp'), 
0056         % SAL comment: linear chirp with frequency sweep from 0 to n/2 Hz,
0057         % sampled at critical frequency of n samples per second
0058         % Matlab chrip command is cos(2*pi*[f0 t + k/2 t^2])
0059         sig = sin(pi .* t .* ((n .* .500) .* t));
0060     elseif strcmp(Name,'TwoChirp'),
0061         sig = sin(pi .* t .* (n .* t)) + sin((pi/3) .* t .* (n .* t));
0062     elseif strcmp(Name,'QuadChirp'),
0063         sig = sin( (pi/3) .* t .* (n .* t.^2));
0064     elseif strcmp(Name,'MishMash'),  % QuadChirp + LinChirp + HiSine
0065         sig = sin( (pi/3) .* t .* (n .* t.^2)) ;
0066         sig = sig +  sin( pi * (n * .6902) .* t);
0067         sig = sig +  sin(pi .* t .* (n .* .125 .* t));
0068     elseif strcmp(Name,'WernerSorrows'),
0069         sig = sin( pi .* t .* (n/2 .* t.^2)) ;
0070         sig = sig +  sin( pi * (n * .6902) .* t);
0071         sig = sig +  sin(pi .* t .* (n .* t));
0072         pos = [ .1 .13 .15 .23 .25 .40 .44 .65  .76 .78 .81];
0073         hgt = [ 4  5   3   4  5  4.2 2.1 4.3  3.1 5.1 4.2];
0074         wth = [.005 .005 .006 .01 .01 .03 .01 .01  .005 .008 .005];
0075         for j =1:length(pos)
0076            sig = sig + hgt(j)./( 1 + abs((t - pos(j))./wth(j))).^4;
0077         end 
0078     elseif strcmp(Name,'Leopold'),
0079         sig = (t == floor(.37 * n)/n);  % Kronecker
0080     elseif strcmp(Name,'Riemann'),
0081         sqn = round(sqrt(n));
0082         sig = t .* 0;  % Riemann's Non-differentiable Function
0083         sig((1:sqn).^2) = 1. ./ (1:sqn);
0084         sig = real(ifft(sig));
0085     elseif strcmp(Name,'HypChirps'), % Hyperbolic Chirps of Mallat's book
0086         alpha    = 15*n*pi/1024;
0087         beta    = 5*n*pi/1024;
0088         t      = (1.001:1:n+.001)./n; 
0089         f1      = zeros(1,n);
0090         f2      = zeros(1,n);    
0091         f1      = sin(alpha./(.8-t)).*(0.1<t).*(t<0.68);
0092         f2      = sin(beta./(.8-t)).*(0.1<t).*(t<0.75);
0093         M      = round(0.65*n);
0094         P     = floor(M/4);
0095         enveloppe = ones(1,M); % the rising cutoff function
0096             enveloppe(1:P) = (1+sin(-pi/2+((1:P)-ones(1,P))./(P-1)*pi))/2;
0097             enveloppe(M-P+1:M) = fliplr(enveloppe(1:P));
0098           env     = zeros(1,n);
0099           env(ceil(n/10):M+ceil(n/10)-1) = enveloppe(1:M);
0100         sig     = (f1+f2).*env;
0101     elseif strcmp(Name,'LinChirps'), % Linear Chirps of Mallat's book
0102         b     = 100*n*pi/1024;
0103         a     = 250*n*pi/1024;
0104         t     = (1:n)./n; 
0105         A1     = sqrt((t-1/n).*(1-t));
0106         sig    = A1.*(cos((a*(t).^2)) + cos((b*t+a*(t).^2)));
0107     elseif strcmp(Name,'Chirps'), % Mixture of Chirps of Mallat's book
0108         t     = (1:n)./n.*10.*pi;  
0109           f1     = cos(t.^2*n/1024);
0110         a     = 30*n/1024;
0111           t     = (1:n)./n.*pi;  
0112           f2     = cos(a.*(t.^3));
0113           f2     = fliplr(f2);
0114         ix     = (-n:n)./n.*20;
0115          g     = exp(-ix.^2*4*n/1024);
0116         i1     = (n/2+1:n/2+n);
0117         i2     = (n/8+1:n/8+n);
0118         j      = (1:n)/n;
0119             f3     = g(i1).*cos(50.*pi.*j*n/1024);
0120         f4     = g(i2).*cos(350.*pi.*j*n/1024);
0121         sig     = f1+f2+f3+f4;
0122         enveloppe = ones(1,n); % the rising cutoff function
0123        enveloppe(1:n/8) = (1+sin(-pi/2+((1:n/8)-ones(1,n/8))./(n/8-1)*pi))/2;
0124        enveloppe(7*n/8+1:n) = fliplr(enveloppe(1:n/8));
0125          sig     = sig.*enveloppe;
0126         elseif strcmp(Name,'Gabor'), % two modulated Gabor functions in
0127                      % Mallat's book
0128         N = 512;    
0129            t = (-N:N)*5/N;
0130             j = (1:N)./N;
0131         g = exp(-t.^2*20);
0132         i1 = (2*N/4+1:2*N/4+N);
0133         i2 = (N/4+1:N/4+N);
0134         sig1 = 3*g(i1).*exp(i*N/16.*pi.*j);
0135         sig2 = 3*g(i2).*exp(i*N/4.*pi.*j);
0136            sig = sig1+sig2;
0137     elseif strcmp(Name,'sineoneoverx'), % sin(1/x) in Mallat's book
0138         N = 1024;
0139         i1 = (-N+1:N);
0140         i1(N) = 1/100;
0141         i1 = i1./(N-1);
0142         sig = sin(1.5./(i1));
0143         sig = sig(513:1536);
0144     elseif strcmp(Name,'Cusp2'),
0145         N = 64;
0146         i1 = (1:N)./N;
0147         x = (1-sqrt(i1)) + i1/2 -.5;
0148         M = 8*N;
0149         sig = zeros(1,M);
0150         sig(M-1.5.*N+1:M-.5*N) = x;
0151         sig(M-2.5*N+2:M-1.5.*N+1) = fliplr(x);
0152         sig(3*N+1:3*N + N) = .5*ones(1,N);
0153     elseif strcmp(Name,'SmoothCusp'),
0154         sig = MakeSignal('Cusp2');
0155         N = 64;
0156         M = 8*N;
0157         t = (1:M)/M;
0158         sigma = 0.01;
0159         g = exp(-.5.*(abs(t-.5)./sigma).^2)./sigma./sqrt(2*pi);
0160         g = fftshift(g);
0161         sig2 = iconv(g',sig)'/M; 
0162        elseif strcmp(Name,'Piece-Regular'),
0163         sig1=-15*MakeSignal('Bumps',n);
0164         t = (1:fix(n/12)) ./fix(n/12);
0165         sig2=-exp(4*t);
0166         t = (1:fix(n/7)) ./fix(n/7);
0167         sig5=exp(4*t)-exp(4);
0168         t = (1:fix(n/3)) ./fix(n/3);
0169         sigma=6/40;
0170         sig6=-70*exp(-((t-1/2).*(t-1/2))/(2*sigma^2));
0171         sig(1:fix(n/7))= sig6(1:fix(n/7));
0172         sig((fix(n/7)+1):fix(n/5))=0.5*sig6((fix(n/7)+1):fix(n/5));
0173         sig((fix(n/5)+1):fix(n/3))=sig6((fix(n/5)+1):fix(n/3));
0174         sig((fix(n/3)+1):fix(n/2))=sig1((fix(n/3)+1):fix(n/2));
0175         sig((fix(n/2)+1):(fix(n/2)+fix(n/12)))=sig2;
0176         sig((fix(n/2)+2*fix(n/12)):-1:(fix(n/2)+fix(n/12)+1))=sig2;
0177 sig(fix(n/2)+2*fix(n/12)+fix(n/20)+1:(fix(n/2)+2*fix(n/12)+3*fix(n/20)))=...
0178 -ones(1,fix(n/2)+2*fix(n/12)+3*fix(n/20)-fix(n/2)-2*fix(n/12)-fix(n/20))*25;
0179         k=fix(n/2)+2*fix(n/12)+3*fix(n/20);
0180         sig((k+1):(k+fix(n/7)))=sig5;
0181         diff=n-5*fix(n/5);
0182         sig(5*fix(n/5)+1:n)=sig(diff:-1:1);
0183         % zero-mean
0184         bias=sum(sig)/n;
0185         sig=bias-sig;
0186        elseif strcmp(Name,'Piece-Polynomial'),
0187         t = (1:fix(n/5)) ./fix(n/5);
0188         sig1=20*(t.^3+t.^2+4);
0189         sig3=40*(2.*t.^3+t) + 100;
0190         sig2=10.*t.^3 + 45;
0191         sig4=16*t.^2+8.*t+16;
0192         sig5=20*(t+4);
0193         sig6(1:fix(n/10))=ones(1,fix(n/10));
0194         sig6=sig6*20;
0195         sig(1:fix(n/5))=sig1;
0196         sig(2*fix(n/5):-1:(fix(n/5)+1))=sig2;
0197         sig((2*fix(n/5)+1):3*fix(n/5))=sig3;
0198         sig((3*fix(n/5)+1):4*fix(n/5))=sig4;
0199         sig((4*fix(n/5)+1):5*fix(n/5))=sig5(fix(n/5):-1:1);
0200         diff=n-5*fix(n/5);
0201         sig(5*fix(n/5)+1:n)=sig(diff:-1:1);
0202         %sig((fix(n/20)+1):(fix(n/20)+fix(n/10)))=-ones(1,fix(n/10))*20;
0203         sig((fix(n/20)+1):(fix(n/20)+fix(n/10)))=ones(1,fix(n/10))*10;
0204         sig((n-fix(n/10)+1):(n+fix(n/20)-fix(n/10)))=ones(1,fix(n/20))*150;
0205         % zero-mean
0206         bias=sum(sig)/n;
0207         sig=sig-bias;
0208        elseif strcmp(Name,'Gaussian'),
0209         sig=GWN(n,beta);
0210         g=zeros(1,n);
0211         lim=alpha*n;
0212         mult=pi/(2*alpha*n);
0213         g(1:lim)=(cos(mult*(1:lim))).^2;
0214         g((n/2+1):n)=g((n/2):-1:1);
0215         g = rnshift(g,n/2);
0216         g=g/norm(g);
0217         sig=iconv(g,sig);
0218        else
0219         disp(sprintf('MakeSignal: I don*t recognize <<%s>>',Name))
0220         disp('Allowable Names are:')
0221            disp('HeaviSine'),
0222            disp('Bumps'),
0223            disp('Blocks'),
0224            disp('Doppler'),
0225            disp('Ramp'),
0226            disp('Cusp'),
0227            disp('Crease'),
0228            disp('Sing'),
0229            disp('HiSine'),
0230            disp('LoSine'),
0231            disp('LinChirp'),
0232            disp('TwoChirp'),
0233            disp('QuadChirp'),
0234            disp('MishMash'),
0235            disp('WernerSorrows'),
0236            disp('Leopold'),
0237            disp('Sing'),
0238            disp('HiSine'),
0239            disp('LoSine'),
0240            disp('LinChirp'),
0241            disp('TwoChirp'),
0242            disp('QuadChirp'),
0243            disp('MishMash'),
0244            disp('WernerSorrows'),
0245            disp('Leopold'),
0246            disp('Riemann'),
0247            disp('HypChirps'),
0248            disp('LinChirps'),
0249            disp('Chirps'),
0250            disp('sineoneoverx'),
0251            disp('Cusp2'),
0252            disp('SmoothCusp'),
0253            disp('Gabor'),
0254            disp('Piece-Regular');
0255            disp('Piece-Polynomial');
0256            disp('Gaussian');
0257     end
0258     
0259 %
0260 % Originally made by David L. Donoho.
0261 % Function has been enhanced.
0262     
0263  
0264  
0265 %
0266 %  Part of Wavelab Version 850
0267 %  Built Tue Jan  3 13:20:39 EST 2006
0268 %  This is Copyrighted Material
0269 %  For Copying permissions see COPYING.m
0270 %  Comments? e-mail wavelab@stat.stanford.edu

Generated on Mon 10-Jun-2013 23:03:23 by m2html © 2005