annotate aim-mat/tools/@signal/generatedampsinus.asv @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 74dedb26614d
children
rev   line source
tomwalters@0 1 % method of class @signal
tomwalters@0 2 % function sig=generatedampsinus(sig,carfre,modfre,amplitude,halflife)
tomwalters@0 3 % INPUT VALUES:
tomwalters@0 4 % sig: original @signal with length and samplerate
tomwalters@0 5 % carfre: carrier frequency (Hz) [1000]
tomwalters@0 6 % modfre: modulation frequency (Hz) [100]
tomwalters@0 7 % amplitude: [1]
tomwalters@0 8 % halflife: time for the envelope envelope to decrease exponentielly
tomwalters@0 9 % to 1/2
tomwalters@0 10 %
tomwalters@0 11 %
tomwalters@0 12 % RETURN VALUE:
tomwalters@0 13 % sig: @signal
tomwalters@0 14 %
tomwalters@0 15 % (c) 2003, University of Cambridge, Medical Research Council
tomwalters@0 16 % Stefan Bleeck (stefan@bleeck.de)
tomwalters@0 17 % http://www.mrc-cbu.cam.ac.uk/cnbh/aimmanual
tomwalters@0 18 % $Date: 2003/07/28 14:20:20 $
tomwalters@0 19 % $Revision: 1.6 $
tomwalters@0 20
tomwalters@0 21
tomwalters@0 22 function sig=generatedampsinus(sig,carfre,modfre,amplitude,halflife,jitter)
tomwalters@0 23 % generates a damped sinusoid, that is a carrier pure tone modulated with a
tomwalters@0 24 % exponentially decreasing envelope.
tomwalters@0 25 % sig is the signal
tomwalters@0 26 % carfre is the carrier frequency of the pure tone
tomwalters@0 27 % modfre is the modulation frequency (in Hz)
tomwalters@0 28 % amplitude is the final amplitude
tomwalters@0 29 % halflife is the time in seconds, in which the envelope drops to its half value
tomwalters@0 30 % if halflife is 'gamma', instead a gammaenvelope is used
tomwalters@0 31
tomwalters@0 32 % jitter is how regular the pulses are (0-1) 1=100%
tomwalters@0 33 % if jitter is 'repeat', only one pulse is generated and repeated
tomwalters@0 34
tomwalters@0 35
tomwalters@0 36 if nargin < 6
tomwalters@0 37 jitter=0;
tomwalters@0 38 end
tomwalters@0 39 if nargin < 5
tomwalters@0 40 halflife=0.01;
tomwalters@0 41 end
tomwalters@0 42 if nargin < 4
tomwalters@0 43 amplitude=1;
tomwalters@0 44 end
tomwalters@0 45
tomwalters@0 46 if nargin < 3
tomwalters@0 47 modfre=100;
tomwalters@0 48 end
tomwalters@0 49 if nargin < 2
tomwalters@0 50 carfre=1000;
tomwalters@0 51 end
tomwalters@0 52
tomwalters@0 53
tomwalters@0 54 if isequal(halflife,'gamma') && isequal(jitter,'repeat')
tomwalters@0 55 % code for Tom's 2010 MSc project
tomwalters@0 56
tomwalters@0 57 sinus=generatesinus(sig,carfre,amplitude,0);
tomwalters@0 58 % calculate envelope and mult both
tomwalters@0 59 envelope=sig;
tomwalters@0 60
tomwalters@0 61 env_vals=getvalues(envelope);
tomwalters@0 62 sr=getsr(envelope);
tomwalters@0 63 reprate=1/modfre;
tomwalters@0 64
tomwalters@0 65
tomwalters@0 66 sig_len=getlength(sig);
tomwalters@0 67 % when regular, all modulataions are at the same time:
tomwalters@0 68 if jitter==0
tomwalters@0 69 pulse_times=0:reprate:sig_len;
tomwalters@0 70 else
tomwalters@0 71 nr_pulses=ceil(sig_len/reprate);
tomwalters@0 72 modulation_period=1/modfre;
tomwalters@0 73 pulse_times(1)=0;
tomwalters@0 74 for n = 2:nr_pulses
tomwalters@0 75 jittering=(rand-0.5*jitter)*modulation_period;
tomwalters@0 76 pulse_times(n) = pulse_times(n-1) + modulation_period+jittering;
tomwalters@0 77 end
tomwalters@0 78 end
tomwalters@0 79
tomwalters@0 80
tomwalters@0 81
tomwalters@0 82 % oldval=0;
tomwalters@0 83 % corr=exp(1/sr/time_const);
tomwalters@0 84 % t=0;
tomwalters@0 85 next_pulse=pulse_times(1);
tomwalters@0 86 pulse_counter=1;
tomwalters@0 87
tomwalters@0 88 % for i=1:getnrpoints(envelope);
tomwalters@0 89 % oldval=oldval/corr;
tomwalters@0 90 % t=t+1/sr;
tomwalters@0 91 % if t>next_pulse
tomwalters@0 92 % oldval=1;
tomwalters@0 93 % pulse_counter=pulse_counter+1;
tomwalters@0 94 % if length(pulse_times)>=pulse_counter
tomwalters@0 95 % next_pulse=pulse_times(pulse_counter);
tomwalters@0 96 % else
tomwalters@0 97 % next_pulse=inf;
tomwalters@0 98 % end
tomwalters@0 99 % end
tomwalters@0 100 % env_vals(i)= oldval;
tomwalters@0 101 % end
tomwalters@0 102
tomwalters@0 103 % onsettimeconstant
tomwalters@0 104 %
tomwalters@0 105 t=[0:1/sr:reprate-1/sr]*500;
tomwalters@0 106 env=power(t,4).*exp(-2*pi*t/2);
tomwalters@0 107 env=env./max(env);
tomwalters@0 108
tomwalters@0 109 % e=linspace(env(length(env)-l),0,l+1);
tomwalters@0 110 % env(length(env)-l:end)=e;
tomwalters@0 111
tomwalters@0 112 % e=linspace(1,0,l+1);
tomwalters@0 113 % env(length(env)-l:end)=env(length(env)-l:end).*e.*e;
tomwalters@0 114
tomwalters@0 115 t=0;
tomwalters@0 116 ct=1;
tomwalters@0 117 for i=1:getnrpoints(envelope);
tomwalters@0 118 t=t+1/sr;
tomwalters@0 119 ct=ct+1;
tomwalters@0 120 if t>next_pulse
tomwalters@0 121 ct=1;
tomwalters@0 122 pulse_counter=pulse_counter+1;
tomwalters@0 123 if length(pulse_times)>=pulse_counter
tomwalters@0 124 next_pulse=pulse_times(pulse_counter);
tomwalters@0 125 else
tomwalters@0 126 next_pulse=inf;
tomwalters@0 127 end
tomwalters@0 128 end
tomwalters@0 129 if ct>length(env)
tomwalters@0 130 env_vals(i)= 0;
tomwalters@0 131 else
tomwalters@0 132 env_vals(i)= env(ct);
tomwalters@0 133 end
tomwalters@0 134 end
tomwalters@0 135
tomwalters@0 136
tomwalters@0 137
tomwalters@0 138 %
tomwalters@0 139 % onsettime=0;
tomwalters@0 140 % for i=1:getnrpoints(envelope);
tomwalters@0 141 % t=t+1/sr;
tomwalters@0 142 %
tomwalters@0 143 % % env_vals(i)= exp(-(time)/time_const);
tomwalters@0 144 % env_vals(i)= power(t,onsettime)*exp(-(t)/time_const);
tomwalters@0 145 % t=mod(t,reprate);
tomwalters@0 146 %
tomwalters@0 147 % end
tomwalters@0 148 envelope=setvalues(envelope,env_vals);
tomwalters@0 149 envelope=envelope/max(envelope)*amplitude;
tomwalters@0 150 envelope=setstarttime(envelope,0);
tomwalters@0 151
tomwalters@0 152 % set the envelope and the amplitude
tomwalters@0 153 sig=sinus*envelope;
tomwalters@0 154
tomwalters@0 155 sig=setname(sig,sprintf('damped sinusoid %4.2f kHz, Modulation=%4.1f Hz, halflife=%4.1f ms',carfre/1000,modfre,halflife*1000));
tomwalters@0 156
tomwalters@0 157 % plot(sig)
tomwalters@0 158
tomwalters@0 159
tomwalters@0 160
tomwalters@0 161
tomwalters@0 162 return
tomwalters@0 163 end
tomwalters@0 164
tomwalters@0 165
tomwalters@0 166
tomwalters@0 167
tomwalters@0 168
tomwalters@0 169
tomwalters@0 170
tomwalters@0 171
tomwalters@0 172
tomwalters@0 173
tomwalters@0 174
tomwalters@0 175
tomwalters@0 176
tomwalters@0 177
tomwalters@0 178
tomwalters@0 179
tomwalters@0 180
tomwalters@0 181
tomwalters@0 182 sinus=generatesinus(sig,carfre,amplitude,0);
tomwalters@0 183
tomwalters@0 184 % calculate envelope and mult both
tomwalters@0 185 envelope=sig;
tomwalters@0 186
tomwalters@0 187 time_const=halflife/0.69314718;
tomwalters@0 188
tomwalters@0 189 env_vals=getvalues(envelope);
tomwalters@0 190 sr=getsr(envelope);
tomwalters@0 191 reprate=1/modfre;
tomwalters@0 192
tomwalters@0 193
tomwalters@0 194 sig_len=getlength(sig);
tomwalters@0 195 % when regular, all modulataions are at the same time:
tomwalters@0 196 if jitter==0
tomwalters@0 197 pulse_times=0:reprate:sig_len;
tomwalters@0 198 else
tomwalters@0 199 nr_pulses=ceil(sig_len/reprate);
tomwalters@0 200 modulation_period=1/modfre;
tomwalters@0 201 pulse_times(1)=0;
tomwalters@0 202 for n = 2:nr_pulses
tomwalters@0 203 jittering=(rand-0.5*jitter)*modulation_period;
tomwalters@0 204 pulse_times(n) = pulse_times(n-1) + modulation_period+jittering;
tomwalters@0 205 end
tomwalters@0 206 end
tomwalters@0 207
tomwalters@0 208
tomwalters@0 209
tomwalters@0 210 % oldval=0;
tomwalters@0 211 % corr=exp(1/sr/time_const);
tomwalters@0 212 % t=0;
tomwalters@0 213 next_pulse=pulse_times(1);
tomwalters@0 214 pulse_counter=1;
tomwalters@0 215
tomwalters@0 216 % for i=1:getnrpoints(envelope);
tomwalters@0 217 % oldval=oldval/corr;
tomwalters@0 218 % t=t+1/sr;
tomwalters@0 219 % if t>next_pulse
tomwalters@0 220 % oldval=1;
tomwalters@0 221 % pulse_counter=pulse_counter+1;
tomwalters@0 222 % if length(pulse_times)>=pulse_counter
tomwalters@0 223 % next_pulse=pulse_times(pulse_counter);
tomwalters@0 224 % else
tomwalters@0 225 % next_pulse=inf;
tomwalters@0 226 % end
tomwalters@0 227 % end
tomwalters@0 228 % env_vals(i)= oldval;
tomwalters@0 229 % end
tomwalters@0 230
tomwalters@0 231 % onsettimeconstant
tomwalters@0 232 %
tomwalters@0 233 t=[0:1/sr:reprate-1/sr]*500;
tomwalters@0 234 env=power(t,4).*exp(-2*pi*t/2);
tomwalters@0 235 env=env./max(env);
tomwalters@0 236
tomwalters@0 237 % e=linspace(env(length(env)-l),0,l+1);
tomwalters@0 238 % env(length(env)-l:end)=e;
tomwalters@0 239
tomwalters@0 240 % e=linspace(1,0,l+1);
tomwalters@0 241 % env(length(env)-l:end)=env(length(env)-l:end).*e.*e;
tomwalters@0 242
tomwalters@0 243 t=0;
tomwalters@0 244 ct=1;
tomwalters@0 245 for i=1:getnrpoints(envelope);
tomwalters@0 246 t=t+1/sr;
tomwalters@0 247 ct=ct+1;
tomwalters@0 248 if t>next_pulse
tomwalters@0 249 ct=1;
tomwalters@0 250 pulse_counter=pulse_counter+1;
tomwalters@0 251 if length(pulse_times)>=pulse_counter
tomwalters@0 252 next_pulse=pulse_times(pulse_counter);
tomwalters@0 253 else
tomwalters@0 254 next_pulse=inf;
tomwalters@0 255 end
tomwalters@0 256 end
tomwalters@0 257 if ct>length(env)
tomwalters@0 258 env_vals(i)= 0;
tomwalters@0 259 else
tomwalters@0 260 env_vals(i)= env(ct);
tomwalters@0 261 end
tomwalters@0 262 end
tomwalters@0 263
tomwalters@0 264
tomwalters@0 265
tomwalters@0 266 %
tomwalters@0 267 % onsettime=0;
tomwalters@0 268 % for i=1:getnrpoints(envelope);
tomwalters@0 269 % t=t+1/sr;
tomwalters@0 270 %
tomwalters@0 271 % % env_vals(i)= exp(-(time)/time_const);
tomwalters@0 272 % env_vals(i)= power(t,onsettime)*exp(-(t)/time_const);
tomwalters@0 273 % t=mod(t,reprate);
tomwalters@0 274 %
tomwalters@0 275 % end
tomwalters@0 276 envelope=setvalues(envelope,env_vals);
tomwalters@0 277 envelope=envelope/max(envelope)*amplitude;
tomwalters@0 278 envelope=setstarttime(envelope,0);
tomwalters@0 279
tomwalters@0 280 % set the envelope and the amplitude
tomwalters@0 281 sig=sinus*envelope;
tomwalters@0 282
tomwalters@0 283 sig=setname(sig,sprintf('damped sinusoid %4.2f kHz, Modulation=%4.1f Hz, halflife=%4.1f ms',carfre/1000,modfre,halflife*1000));
tomwalters@0 284
tomwalters@0 285 % plot(sig)
tomwalters@0 286
tomwalters@0 287
tomwalters@0 288
tomwalters@0 289
tomwalters@0 290
tomwalters@0 291
tomwalters@0 292
tomwalters@0 293
tomwalters@0 294
tomwalters@0 295
tomwalters@0 296
tomwalters@0 297
tomwalters@0 298
tomwalters@0 299
tomwalters@0 300
tomwalters@0 301
tomwalters@0 302 %
tomwalters@0 303 %
tomwalters@0 304 %
tomwalters@0 305 % % from here on old code, might not work!
tomwalters@0 306 %
tomwalters@0 307 % sinus=generatesinus(sig,carfre,amplitude,0);
tomwalters@0 308 %
tomwalters@0 309 % % calculate envelope and mult both
tomwalters@0 310 % envelope=sig;
tomwalters@0 311 %
tomwalters@0 312 % time_const=halflife/0.69314718;
tomwalters@0 313 %
tomwalters@0 314 % env_vals=getvalues(envelope);
tomwalters@0 315 % sr=getsr(envelope);
tomwalters@0 316 % reprate=1/modfre;
tomwalters@0 317 %
tomwalters@0 318 %
tomwalters@0 319 % sig_len=getlength(sig);
tomwalters@0 320 % % when regular, all modulataions are at the same time:
tomwalters@0 321 % if jitter==0
tomwalters@0 322 % pulse_times=0:reprate:sig_len;
tomwalters@0 323 % else
tomwalters@0 324 % nr_pulses=ceil(sig_len/reprate);
tomwalters@0 325 % modulation_period=1/modfre;
tomwalters@0 326 % pulse_times(1)=0;
tomwalters@0 327 % for n = 2:nr_pulses
tomwalters@0 328 % jittering=(rand-0.5*jitter)*modulation_period;
tomwalters@0 329 % pulse_times(n) = pulse_times(n-1) + modulation_period+jittering;
tomwalters@0 330 % end
tomwalters@0 331 % end
tomwalters@0 332 %
tomwalters@0 333 %
tomwalters@0 334 %
tomwalters@0 335 % % oldval=0;
tomwalters@0 336 % % corr=exp(1/sr/time_const);
tomwalters@0 337 % % t=0;
tomwalters@0 338 % next_pulse=pulse_times(1);
tomwalters@0 339 % pulse_counter=1;
tomwalters@0 340 %
tomwalters@0 341 % % for i=1:getnrpoints(envelope);
tomwalters@0 342 % % oldval=oldval/corr;
tomwalters@0 343 % % t=t+1/sr;
tomwalters@0 344 % % if t>next_pulse
tomwalters@0 345 % % oldval=1;
tomwalters@0 346 % % pulse_counter=pulse_counter+1;
tomwalters@0 347 % % if length(pulse_times)>=pulse_counter
tomwalters@0 348 % % next_pulse=pulse_times(pulse_counter);
tomwalters@0 349 % % else
tomwalters@0 350 % % next_pulse=inf;
tomwalters@0 351 % % end
tomwalters@0 352 % % end
tomwalters@0 353 % % env_vals(i)= oldval;
tomwalters@0 354 % % end
tomwalters@0 355 %
tomwalters@0 356 % % onsettimeconstant
tomwalters@0 357 % %
tomwalters@0 358 % t=[0:1/sr:reprate-1/sr]*500;
tomwalters@0 359 % env=power(t,4).*exp(-2*pi*t/2);
tomwalters@0 360 % env=env./max(env);
tomwalters@0 361 %
tomwalters@0 362 % % e=linspace(env(length(env)-l),0,l+1);
tomwalters@0 363 % % env(length(env)-l:end)=e;
tomwalters@0 364 %
tomwalters@0 365 % % e=linspace(1,0,l+1);
tomwalters@0 366 % % env(length(env)-l:end)=env(length(env)-l:end).*e.*e;
tomwalters@0 367 %
tomwalters@0 368 % t=0;
tomwalters@0 369 % ct=1;
tomwalters@0 370 % for i=1:getnrpoints(envelope);
tomwalters@0 371 % t=t+1/sr;
tomwalters@0 372 % ct=ct+1;
tomwalters@0 373 % if t>next_pulse
tomwalters@0 374 % ct=1;
tomwalters@0 375 % pulse_counter=pulse_counter+1;
tomwalters@0 376 % if length(pulse_times)>=pulse_counter
tomwalters@0 377 % next_pulse=pulse_times(pulse_counter);
tomwalters@0 378 % else
tomwalters@0 379 % next_pulse=inf;
tomwalters@0 380 % end
tomwalters@0 381 % end
tomwalters@0 382 % if ct>length(env)
tomwalters@0 383 % env_vals(i)= 0;
tomwalters@0 384 % else
tomwalters@0 385 % env_vals(i)= env(ct);
tomwalters@0 386 % end
tomwalters@0 387 % end
tomwalters@0 388 %
tomwalters@0 389 %
tomwalters@0 390 %
tomwalters@0 391 % %
tomwalters@0 392 % % onsettime=0;
tomwalters@0 393 % % for i=1:getnrpoints(envelope);
tomwalters@0 394 % % t=t+1/sr;
tomwalters@0 395 % %
tomwalters@0 396 % % % env_vals(i)= exp(-(time)/time_const);
tomwalters@0 397 % % env_vals(i)= power(t,onsettime)*exp(-(t)/time_const);
tomwalters@0 398 % % t=mod(t,reprate);
tomwalters@0 399 % %
tomwalters@0 400 % % end
tomwalters@0 401 % envelope=setvalues(envelope,env_vals);
tomwalters@0 402 % envelope=envelope/max(envelope)*amplitude;
tomwalters@0 403 % envelope=setstarttime(envelope,0);
tomwalters@0 404 %
tomwalters@0 405 % % set the envelope and the amplitude
tomwalters@0 406 % sig=sinus*envelope;
tomwalters@0 407 %
tomwalters@0 408 % sig=setname(sig,sprintf('damped sinusoid %4.2f kHz, Modulation=%4.1f Hz, halflife=%4.1f ms',carfre/1000,modfre,halflife*1000));
tomwalters@0 409 %
tomwalters@0 410 % % plot(sig)