⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 synlpc.m

📁 语音信号分析软件
💻 M
字号:
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;      endelse  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;endfor 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -