V_DISTCHAR calculates the cosh spectral distance between AR coefficients D=(AR1,AR2,MODE) Inputs: AR1,AR2 AR coefficient sets to be compared. Each row contains a set of coefficients. AR1 and AR2 must have the same number of columns. MODE Character string selecting the following options: 'x' Calculate the full distance matrix from every row of AR1 to every row of AR2 'd' Calculate only the distance between corresponding rows of AR1 and AR2 The default is 'd' if AR1 and AR2 have the same number of rows otherwise 'x'. Output: D If MODE='d' then D is a column vector with the same number of rows as the shorter of AR1 and AR2. If MODE='x' then D is a matrix with the same number of rows as AR1 and the same number of columns as AR2'. The COSH spectral distance is the average over +ve and -ve frequency of cosh(log(p1/p2))-1 = (p1-p2)^2/(2p1*p2) = (p1/p2 + p2/p1)/2 - 1 Where p1 and p2 are the power spectra corresponding to the AR coefficient sets AR1 and AR2. The COSH distance is a symmetrical version of the Itakura-Saito distance: v_distchar(x,y)=(v_distisar(x,y)+v_distisar(y,x))/2
0001 function d=v_distchar(ar1,ar2,mode) 0002 %V_DISTCHAR calculates the cosh spectral distance between AR coefficients D=(AR1,AR2,MODE) 0003 % 0004 % Inputs: AR1,AR2 AR coefficient sets to be compared. Each row contains a set of coefficients. 0005 % AR1 and AR2 must have the same number of columns. 0006 % 0007 % MODE Character string selecting the following options: 0008 % 'x' Calculate the full distance matrix from every row of AR1 to every row of AR2 0009 % 'd' Calculate only the distance between corresponding rows of AR1 and AR2 0010 % The default is 'd' if AR1 and AR2 have the same number of rows otherwise 'x'. 0011 % 0012 % Output: D If MODE='d' then D is a column vector with the same number of rows as the shorter of AR1 and AR2. 0013 % If MODE='x' then D is a matrix with the same number of rows as AR1 and the same number of columns as AR2'. 0014 % 0015 % The COSH spectral distance is the average over +ve and -ve frequency of 0016 % 0017 % cosh(log(p1/p2))-1 = (p1-p2)^2/(2p1*p2) = (p1/p2 + p2/p1)/2 - 1 0018 % 0019 % Where p1 and p2 are the power spectra corresponding to the AR coefficient sets AR1 and AR2. 0020 % The COSH distance is a symmetrical version of the Itakura-Saito distance: v_distchar(x,y)=(v_distisar(x,y)+v_distisar(y,x))/2 0021 0022 % Since the power spectrum is the fourier transform of the autocorrelation, we can calculate 0023 % the average value of p1/p2 by taking the 0'th order term of the convolution of the autocorrelation 0024 % functions associated with p1 and 1/p2. Since 1/p2 corresponds to an FIR filter, this convolution is 0025 % a finite sum even though the autocorrelation function of p1 is infinite in extent. 0026 0027 % The Cosh distance can also be calculated directly from the power spectra; providing np is large 0028 % enough, the values of d0 and d1 in the following will be very similar: 0029 % 0030 % np=255; d0=v_distchar(ar1,ar2); d1=v_distchpf(v_lpcar2pf(ar1,np),v_lpcar2pf(ar2,np)) 0031 % 0032 0033 % Ref: A.H.Gray Jr and J.D.Markel, "Distance measures for speech processing", IEEE ASSP-24(5): 380-391, Oct 1976 0034 % L. Rabiner abd B-H Juang, "Fundamentals of Speech Recognition", Section 4.5, Prentice-Hall 1993, ISBN 0-13-015157-2 0035 0036 0037 % Copyright (C) Mike Brookes 1997 0038 % Version: $Id: v_distchar.m 10865 2018-09-21 17:22:45Z dmb $ 0039 % 0040 % VOICEBOX is a MATLAB toolbox for speech processing. 0041 % Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html 0042 % 0043 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0044 % This program is free software; you can redistribute it and/or modify 0045 % it under the terms of the GNU General Public License as published by 0046 % the Free Software Foundation; either version 2 of the License, or 0047 % (at your option) any later version. 0048 % 0049 % This program is distributed in the hope that it will be useful, 0050 % but WITHOUT ANY WARRANTY; without even the implied warranty of 0051 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0052 % GNU General Public License for more details. 0053 % 0054 % You can obtain a copy of the GNU General Public License from 0055 % http://www.gnu.org/copyleft/gpl.html or by writing to 0056 % Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA. 0057 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0058 0059 [nf1,p1]=size(ar1); 0060 nf2=size(ar2,1); 0061 p2=p1+1; 0062 m1=zeros(nf1,2*p1); 0063 m2=zeros(nf2,2*p1); 0064 m1(:,1:p1)=v_lpcar2rr(ar1); 0065 m1(:,p2:end)=v_lpcar2ra(ar1); 0066 m1(:,1)=m1(:,1)*0.5; 0067 m1(:,p2)=m1(:,p1+1)*0.5; 0068 m2(:,p2:end)=v_lpcar2rr(ar2); 0069 m2(:,1:p1)=v_lpcar2ra(ar2); 0070 0071 if nargin<3 | isempty(mode) mode='0'; end 0072 if any(mode=='d') | (mode~='x' & nf1==nf2) 0073 nx=min(nf1,nf2); 0074 d=sum(m1(1:nx,:).*m2(1:nx,:),2)-1; 0075 else 0076 d=m1*m2'-1; 0077 end