http://www.mathworks.com/help//dsp/examples/lpc-analysis-and-synthesis-of-speech.html
LPC Analysis and Synthesis of Speech
Here you implement a speech compression technique known as Linear Prediction Coding (LPC) using DSP System Toolbox™ functionality available at the MATLAB command line. This demo is supported only on Windows platforms.
Introduction
In
this demo you implement LPC analysis and synthesis (LPC coding) of a
speech signal. This process consists of two steps; analysis and
synthesis. In the analysis section, you extract the reflection
coefficients from the signal and use it to compute the residual signal.
In the synthesis section, you reconstruct the signal using the residual
signal and reflection coefficients. The residual signal and reflection
coefficients require less number of bits to code than the original
speech signal.The block diagram below shows the system you will implement.
In this simulation, the speech signal is divided into frames of size 320 samples, with an overlap of 160 samples. Each frame is windowed using a Hamming window. Twelfth-order autocorrelation coefficients are found, and then the reflection coefficients are calculated from the autocorrelation coefficients using the Levinson-Durbin algorithm. The original speech signal is passed through an analysis filter, which is an all-zero filter with coefficients as the reflection coefficients obtained above. The output of the filter is the residual signal. This residual signal is passed through a synthesis filter which is the inverse of the analysis filter. The output of the synthesis filter is the original signal.
This demo is supported only on Windows platforms.
if ~ispc error(message('dsp:dspLinearPredictiveCoder:windowsOnly')); end
Initialization
Here
you initialize some of the variables like the frame size and also
instantiate the System objects used in your processing. These objects
also pre-compute any necessary variables or tables resulting in
efficient processing calls later inside a loop.Initialize variables.
frameSize = 160; fftLen = 256;Here you create a System object to read from an audio file and determine the file's audio sampling rate.
hfileIn = dsp.AudioFileReader('speech_dft.wav', ... 'SamplesPerFrame', frameSize, ... 'PlayCount', Inf, ... 'OutputDataType', 'double'); fileInfo = info(hfileIn); Fs = fileInfo.SampleRate;Create an FIR digital filter System object used for pre-emphasis.
hpreemphasis = dsp.DigitalFilter(... 'TransferFunction', 'FIR (all zeros)', ... 'Numerator', [1 -0.95]);Create a buffer System object and set its properties such that you get an output of twice the length of the frameSize with an overlap length of frameSize.
hbuf = dsp.Buffer(2*frameSize, frameSize);Create a window System object. Here you will use the default window which is Hamming.
hwindow = dsp.Window;Create an autocorrelator System object and set its properties to compute the lags in the range [0:12] scaled by the length of input.
hacf = dsp.Autocorrelator( ... 'MaximumLagSource', 'Property', ... 'MaximumLag', 12, ... 'Scaling', 'Biased');Create a System object which computes the reflection coefficients from auto-correlation function using the Levinson-Durbin recursion. You configure it to output both polynomial coefficients and reflection coefficients. The polynomial coefficients are used to compute and plot the LPC spectrum.
hlevinson = dsp.LevinsonSolver( ... 'AOutputPort', true, ... 'KOutputPort', true);Create an FIR digital filter System object used for analysis. Also create two all-pole digital filter System objects used for synthesis and de-emphasis.
hanalysis = dsp.DigitalFilter(... 'TransferFunction', 'FIR (all zeros)', ... 'CoefficientsSource', 'Input port', ... 'Structure', 'Lattice MA'); hsynthesis = dsp.DigitalFilter( ... 'TransferFunction', 'IIR (all poles)', ... 'CoefficientsSource', 'Input port', ... 'Structure', 'Lattice AR'); hdeemphasis = dsp.DigitalFilter( ... 'TransferFunction', 'IIR (all poles)', ... 'Denominator', [1 -0.95]);Create a System object to play the resulting audio.
haudioOut = dsp.AudioPlayer( ... 'SampleRate', Fs, ... 'QueueDuration', 1.0); % Setup plots for visualization. s = hfigslpc('setup',Fs,frameSize,fftLen);
Stream Processing Loop
Here
you call your processing loop where you do the LPC analysis and
synthesis of the input audio signal using the System objects you have
instantiated.The loop is stopped when you reach the end of the input file, which is detected by the AudioFileReader System object.
while ~isDone(hfileIn) sig = step(hfileIn); % Read audio input % Analysis % Note that the filter coefficients are passed in as an argument to the % step method of the hanalysis filter System object. sigpreem = step(hpreemphasis, sig); % Pre-emphasis sigwin = step(hwindow, step(hbuf, sigpreem) );% Buffer and Window sigacf = step(hacf, sigwin); % Autocorrelation [sigA, sigK] = step(hlevinson, sigacf); % Levinson-Durbin siglpc = step(hanalysis, sigpreem, sigK); % Analysis filter % Synthesis sigsyn = step(hsynthesis, siglpc, sigK); % Synthesis filter sigout = step(hdeemphasis, sigsyn); % De-emphasis step(haudioOut, sigout); % Play output audio % Update plots s = plotlpcdata(s, sigA, sigwin); end
Release
Here you call the release method on the System objects to close any open files and devices.release(hfileIn); pause(haudioOut.QueueDuration); % Wait until audio finishes playing release(haudioOut); hfigslpc('cleanup',s);
Conclusion
You
have seen here the implementation of speech compression technique using
Linear Prediction Coding. The implementation used the DSP System
Toolbox functionality available at the MATLAB command line. The code
involves only calling of the successive System objects with appropriate
input arguments. This involves no error prone manual state tracking
which may be the case for instance for a MATLAB implementation of
Buffer.
Appendix
The following helper functions are used in this demo.
No hay comentarios:
Publicar un comentario