diff toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/synlpc.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/AuditoryToolbox/synlpc.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,130 @@
+function synWave = synlpc(aCoeff,source,sr,G,fr,fs,preemp)
+% USAGE: synWave = synlpc(aCoeff,source,sr,G,fr,fs,preemp);
+%
+% This function synthesizes a (speech) signal based on a LPC (linear-
+% predictive coding) model of the signal.  The LPC coefficients are a 
+% short-time measure of the speech signal which describe the signal as the 
+% output of an all-pole filter.  This all-pole filter provides a good 
+% description of the speech articulators; thus LPC analysis is often used in 
+% speech recognition and speech coding systems.  The LPC analysis is done
+% using the proclpc routine.  This routine can be used to verify that the 
+% LPC analysis produces the correct answer, or as a synthesis stage after
+% first modifying the LPC model.
+%
+% The results of LPC analysis are a new representation of the signal
+%	s(n) = G e(n) - sum from 1 to L a(i)s(n-i)
+% where s(n) is the original data.  a(i) and e(n) are the outputs of the LPC 
+% analysis with a(i) representing the LPC model. The e(n) term represents 
+% either the speech source's excitation, or the residual: the details of the 
+% signal that are not captured by the LPC coefficients.  The G factor is a
+% gain term.
+%
+% LPC synthesis produces a monaural sound vector (synWave) which is 
+% sampled at a sampling rate of "sr".  The following parameters are mandatory
+% aCoeff - The LPC analysis results, a(i).  One column of L+1 numbers for each
+%	frame of data.  The number of rows of aCoeff determines L.
+% source - The LPC residual, e(n).  One column of sr*fs samples representing
+%	the excitation or residual of the LPC filter.
+% G - The LPC gain for each frame.
+%
+% The following parameters are optional and default to the indicated values.
+% fr - Frame time increment, in ms.  The LPC analysis is done starting every
+% 	fr ms in time.  Defaults to 20ms (50 LPC vectors a second)
+% fs - Frame size in ms.  The LPC analysis is done by windowing the speech
+% 	data with a rectangular window that is fs ms long.  Defaults to 30ms
+% preemp - This variable is the epsilon in a digital one-zero filter which 
+%	serves to preemphasize the speech signal and compensate for the 6dB
+%	per octave rolloff in the radiation function.  Defaults to .9378.
+%
+% This code was graciously provided by:
+% 	Delores Etter (University of Colorado, Boulder) and 
+%	Professor Geoffrey Orsak (Southern Methodist University) 
+% It was first published in
+%	Orsak, G.C. et al. "Collaborative SP education using the Internet and
+%	MATLAB" IEEE SIGNAL PROCESSING MAGAZINE  Nov. 1995. vol.12, no.6, pp.
+%	23-32.
+% Modified and debugging plots added by Kate Nguyen and Malcolm Slaney
+
+% (c) 1998 Interval Research Corporation  
+% A more complete set of routines for LPC analysis can be found at
+%	http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
+   
+
+
+if (nargin < 5), fr = 20; end;
+if (nargin < 6), fs = 30; end;
+if (nargin < 7), preemp = .9378; end;
+
+msfs = round(sr*fs/1000);
+msfr = round(sr*fr/1000);
+msoverlap = msfs - msfr;
+ramp = [0:1/(msoverlap-1):1]';
+[L1 nframe] = size(aCoeff); 			% L1 = 1+number of LPC coeffs 
+
+[row col] = size(source);
+if(row==1 | col==1)				% continous stream; must be 
+						% windowed
+  postFilter = 0; duration = length(source); frameIndex = 1;
+  for sampleIndex=1:msfr:duration-msfs+1
+    resid(:,frameIndex) = source(sampleIndex:(sampleIndex+msfs-1))';
+    frameIndex = frameIndex+1;    
+  end
+else
+  postFilter = 1; resid = source;
+end
+
+[row col] = size(resid);
+%if ~(col==nframe)
+%  error('synLPC: numbers of LPC frames and source frames do not match');
+if col<nframe  
+  nframe=col;
+end
+
+for frameIndex=1:nframe
+ 						% Calculate the filter response
+						% by evaluating the z-transform
+%  if 1
+%    gain=0;
+%    cft=0:(1/255):1;
+%    for index=1:L1-1
+%      gain = gain + aCoeff(index,frameIndex)*exp(-i*2*pi*cft).^index;
+%    end
+%    gain = abs(1./gain);
+%    spec(:,frameIndex) = 20*log10(gain(1:128))';
+    % plot(20*log10(gain));
+    % title(frameIndex);
+    % drawnow;
+%  end
+
+						% Calculate the filter response
+						% from the filter's impulse
+						% response (to check above).
+%  if 0
+%    impulseResponse = filter(1, aCoeff(:,frameIndex), [1 zeros(1,255)]);
+%    freqResp = 20*log10(abs(fft(impulseResponse)));
+%    plot(freqResp);
+%  end
+
+
+  A = aCoeff(:,frameIndex);
+  residFrame = resid(:,frameIndex)*G(frameIndex);
+  synFrame = filter(1, A', residFrame);		% synthesize speech from LPC 
+						% coeffs
+  if(frameIndex==1)				% add synthesize frames using a
+    synWave = synFrame(1:msfr);			% trapezoidal window
+  else
+    synWave = [synWave; overlap+synFrame(1:msoverlap).*ramp; ...
+			synFrame(msoverlap+1:msfr)];
+  end
+  if(frameIndex==nframe)
+    synWave = [synWave; synFrame(msfr+1:msfs)];
+  else
+    overlap = synFrame(msfr+1:msfs).*flipud(ramp);	
+  end	
+  %length(synWave)						
+end;
+
+if(postFilter)
+  synWave = filter(1, [1 -preemp], synWave);
+end
+