X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fsignal-1.1.3%2Fchirp.m;fp=octave_packages%2Fsignal-1.1.3%2Fchirp.m;h=ef43255fdd772287a04c453d48c5ad4928dc6060;hp=0000000000000000000000000000000000000000;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/signal-1.1.3/chirp.m b/octave_packages/signal-1.1.3/chirp.m new file mode 100644 index 0000000..ef43255 --- /dev/null +++ b/octave_packages/signal-1.1.3/chirp.m @@ -0,0 +1,94 @@ +## Copyright (C) 1999-2000 Paul Kienzle +## +## This program is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free Software +## Foundation; either version 3 of the License, or (at your option) any later +## version. +## +## This program is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +## details. +## +## You should have received a copy of the GNU General Public License along with +## this program; if not, see . + +## usage: y = chirp(t [, f0 [, t1 [, f1 [, form [, phase]]]]]) +## +## Evaluate a chirp signal at time t. A chirp signal is a frequency +## swept cosine wave. +## +## t: vector of times to evaluate the chirp signal +## f0: frequency at time t=0 [ 0 Hz ] +## t1: time t1 [ 1 sec ] +## f1: frequency at time t=t1 [ 100 Hz ] +## form: shape of frequency sweep +## 'linear' f(t) = (f1-f0)*(t/t1) + f0 +## 'quadratic' f(t) = (f1-f0)*(t/t1)^2 + f0 +## 'logarithmic' f(t) = (f1-f0)^(t/t1) + f0 +## phase: phase shift at t=0 +## +## Example +## specgram(chirp([0:0.001:5])); # linear, 0-100Hz in 1 sec +## specgram(chirp([-2:0.001:15], 400, 10, 100, 'quadratic')); +## soundsc(chirp([0:1/8000:5], 200, 2, 500, "logarithmic"),8000); +## +## If you want a different sweep shape f(t), use the following: +## y = cos(2*pi*integral(f(t)) + 2*pi*f0*t + phase); + +function y = chirp(t, f0, t1, f1, form, phase) + + if nargin < 1 || nargin > 6 + print_usage; + endif + if nargin < 2, f0 = []; endif + if nargin < 3, t1 = []; endif + if nargin < 4, f1 = []; endif + if nargin < 5, form = []; endif + if nargin < 6, phase = []; endif + + if isempty(f0), f0 = 0; endif + if isempty(t1), t1 = 1; endif + if isempty(f1), f1 = 100; endif + if isempty(form), form = "linear"; endif + if isempty(phase), phase = 0; endif + + phase = 2*pi*phase/360; + + if strcmp(form, "linear") + a = pi*(f1 - f0)/t1; + b = 2*pi*f0; + y = cos(a*t.^2 + b*t + phase); + elseif strcmp(form, "quadratic") + a = (2/3*pi*(f1-f0)/t1/t1); + b = 2*pi*f0; + y = cos(a*t.^3 + b*t + phase); + elseif strcmp(form, "logarithmic") + a = 2*pi*t1/log(f1-f0); + b = 2*pi*f0; + x = (f1-f0)^(1/t1); + y = cos(a*x.^t + b*t + phase); + else + error("chirp doesn't understand '%s'",form); + endif + +endfunction + +%!demo +%! specgram(chirp([0:0.001:5]),[],1000); # linear, 0-100Hz in 1 sec +%! %------------------------------------------------------------ +%! % Shows linear sweep of 100 Hz/sec starting at zero for 5 sec +%! % since the sample rate is 1000 Hz, this should be a diagonal +%! % from bottom left to top right. + +%!demo +%! specgram(chirp([-2:0.001:15], 400, 10, 100, 'quadratic')); +%! %------------------------------------------------------------ +%! % Shows a quadratic chirp of 400 Hz at t=0 and 100 Hz at t=10 +%! % Time goes from -2 to 15 seconds. + +%!demo +%! specgram(chirp([0:1/8000:5], 200, 2, 500, "logarithmic"),[],8000); +%! %------------------------------------------------------------ +%! % Shows a logarithmic chirp of 200 Hz at t=0 and 500 Hz at t=2 +%! % Time goes from 0 to 5 seconds at 8000 Hz.