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) |