Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirzerocross.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirzerocross.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,72 @@ +function varargout = mirzerocross(orig,varargin) +% mirzeroscross(x) computes the sign-changes rate along the signal x, +% i.e., how many time the waveform crosses the X-axis. When applied on +% an audio waveform, gives a notion of noise. +% Optional argument: +% mirzerocross(...,'Per',p) precises the temporal reference for the +% rate computation. +% Possible values: +% p = 'Second': number of sign-changes per second (Default). +% p = 'Sample': number of sign-changes divided by the total +% number of samples. +% The 'Second' option returns a result equal to the one returned +% by the 'Sample' option multiplied by the sampling rate. +% mirzerocross(...,'Dir',d) precises the definition of sign change. +% Possible values: +% d = 'One': number of sign-changes from negative to positive +% only (or, equivalently, from positive to negative only). +% (Default) +% d = 'Both': number of sign-changes in both ways. +% The 'Both' option returns a result equal to twice the one +% returned by the 'One' option. + + + per.key = 'Per'; + per.type = 'String'; + per.choice = {'Second','Sample'}; + per.default = 'Second'; + option.per = per; + + dir.key = 'Dir'; + dir.type = 'String'; + dir.choice = {'One','Both'}; + dir.default = 'One'; + option.dir = dir; + +specif.option = option; + +varargout = mirfunction(@mirzerocross,orig,varargin,nargout,specif,@init,@main); + + +function [x type] = init(x,option) +if not(isamir(x,'mirdata')) + x = miraudio(x); +end +type = 'mirscalar'; + + +function z = main(a,option,postoption) +if iscell(a) + a = a{1}; +end +d = get(a,'Data'); +f = get(a,'Sampling'); +v = cell(1,length(d)); +for h = 1:length(d) + v{h} = cell(1,length(d{h})); + for i = 1:length(d{h}) + di = d{h}{i}; + nc = size(di,2); + nf = size(di,3); + nl = size(di,1); + zc = sum( di(2:end,:,:).*di(1:(end-1),:,:) < 0 ) /nl; + if strcmp(option.per,'Second') + zc = zc*f{h}; + end + if strcmp(option.dir,'One') + zc = zc/2; + end + v{h}{i} = zc; + end +end +z = mirscalar(a,'Data',v,'Title','Zero-crossing rate'); \ No newline at end of file