annotate main/signal/chirp.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1 ## Copyright (C) 1999-2000 Paul Kienzle
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 ## This program is free software; you can redistribute it and/or modify
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 ## it under the terms of the GNU General Public License as published by
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 ## the Free Software Foundation; either version 2 of the License, or
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 ## (at your option) any later version.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 ## This program is distributed in the hope that it will be useful,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 ## GNU General Public License for more details.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 ## You should have received a copy of the GNU General Public License
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 ## along with this program; if not, write to the Free Software
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 ## usage: y = chirp(t [, f0 [, t1 [, f1 [, form [, phase]]]]])
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 ## Evaluate a chirp signal at time t. A chirp signal is a frequency
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 ## swept cosine wave.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 ## t: vector of times to evaluate the chirp signal
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 ## f0: frequency at time t=0 [ 0 Hz ]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 ## t1: time t1 [ 1 sec ]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 ## f1: frequency at time t=t1 [ 100 Hz ]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 ## form: shape of frequency sweep
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 ## 'linear' f(t) = (f1-f0)*(t/t1) + f0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 ## 'quadratic' f(t) = (f1-f0)*(t/t1)^2 + f0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 ## 'logarithmic' f(t) = (f1-f0)^(t/t1) + f0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 ## phase: phase shift at t=0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 ## Example
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 ## specgram(chirp([0:0.001:5])); # linear, 0-100Hz in 1 sec
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 ## specgram(chirp([-2:0.001:15], 400, 10, 100, 'quadratic'));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 ## soundsc(chirp([0:1/8000:5], 200, 2, 500, "logarithmic"),8000);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 ## If you want a different sweep shape f(t), use the following:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 ## y = cos(2*pi*integral(f(t)) + 2*pi*f0*t + phase);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 ## 2001-08-31 Paul Kienzle <pkienzle@users.sf.net>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 ## * Fix documentation for quadratic case
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 function y = chirp(t, f0, t1, f1, form, phase)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 if nargin < 1 || nargin > 6
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 usage("y = chirp(t [, f0 [, t1 [, f1 [, form [, phase]]]]])");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 if nargin < 2, f0 = []; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 if nargin < 3, t1 = []; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 if nargin < 4, f1 = []; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 if nargin < 5, form = []; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 if nargin < 6, phase = []; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 if isempty(f0), f0 = 0; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 if isempty(t1), t1 = 1; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 if isempty(f1), f1 = 100; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 if isempty(form), form = "linear"; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 if isempty(phase), phase = 0; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 phase = 2*pi*phase/360;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 if strcmp(form, "linear")
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 a = pi*(f1 - f0)/t1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 b = 2*pi*f0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 y = cos(a*t.^2 + b*t + phase);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 elseif strcmp(form, "quadratic")
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 a = (2/3*pi*(f1-f0)/t1/t1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 b = 2*pi*f0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 y = cos(a*t.^3 + b*t + phase);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 elseif strcmp(form, "logarithmic")
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 a = 2*pi*t1/log(f1-f0);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 b = 2*pi*f0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 x = (f1-f0)^(1/t1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 y = cos(a*x.^t + b*t + phase);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 error("chirp doesn't understand '%s'",form);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 endfunction
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 %!demo
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 %! specgram(chirp([0:0.001:5]),[],1000); # linear, 0-100Hz in 1 sec
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 %! %------------------------------------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 %! % Shows linear sweep of 100 Hz/sec starting at zero for 5 sec
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 %! % since the sample rate is 1000 Hz, this should be a diagonal
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 %! % from bottom left to top right.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 %!demo
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 %! specgram(chirp([-2:0.001:15], 400, 10, 100, 'quadratic'));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 %! %------------------------------------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 %! % Shows a quadratic chirp of 400 Hz at t=0 and 100 Hz at t=10
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 %! % Time goes from -2 to 15 seconds.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 %!demo
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 %! specgram(chirp([0:1/8000:5], 200, 2, 500, "logarithmic"),[],8000);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 %! %------------------------------------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 %! % Shows a logarithmic chirp of 200 Hz at t=0 and 500 Hz at t=2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 %! % Time goes from 0 to 5 seconds at 8000 Hz.