Этот пример показывает, как реализовать метод сжатия речи, известный как Кодирование линейного предсказания (LPC) с помощью функциональности DSP System Toolbox™, доступной в командной строке MATLAB®.
В этом примере вы реализуете анализ LPC и синтез (кодирование LPC) речевого сигнала. Этот процесс состоит из двух шагов: анализ и синтез. В аналитическом разделе вы извлекаете отражательные коэффициенты от сигнала и используете его, чтобы вычислить остаточный сигнал. В разделе синтеза вы восстанавливаете сигнал с помощью остаточных и отражательных коэффициентов сигнала. Остаточные и отражательные коэффициенты сигнала требуют меньшего количества количества битов к коду, чем исходный речевой сигнал.
Блок-схема ниже показов система вы реализуете.
В этой симуляции речевой сигнал разделен на кадры размера 3 200 выборок с перекрытием 1 600 выборок. Каждый кадр является оконным использованием Окна Хэмминга. Коэффициенты автокорреляции двенадцатого порядка найдены, и затем отражательные коэффициенты вычисляются от коэффициентов автокорреляции с помощью алгоритма Левинсона-Дербина. Исходный речевой сигнал передается через аналитический фильтр, который является все-нулевым фильтром с коэффициентами как отражательные коэффициенты, полученные выше. Вывод фильтра является остаточным сигналом. Этот остаточный сигнал передается через фильтр синтеза, который является инверсией аналитического фильтра. Вывод фильтра синтеза является исходным сигналом.
Здесь вы инициализируете некоторые переменные как формат кадра и также инстанцируете Системных объектов, используемых в вашей обработке. Эти объекты также предварительно вычисляют любые необходимые переменные, или таблицы, приводящие к эффективной обработке, вызывает позже в цикле.
Инициализируйте переменные.
frameSize = 1600; fftLen = 2048;
Здесь вы создаете Системный объект, чтобы читать из звукового файла и определить аудио выборку файла уровня.
audioReader = dsp.AudioFileReader('SamplesPerFrame', frameSize, ... 'OutputDataType', 'double'); fileInfo = info(audioReader); Fs = fileInfo.SampleRate;
Создайте КИХ цифровой Системный объект фильтра, используемый для предварительного акцента.
preEmphasisFilter = dsp.FIRFilter(... 'Numerator', [1 -0.95]);
Создайте буферный Системный объект и установите его свойства, таким образом, что вы получаете вывод дважды длины frameSize с длиной перекрытия frameSize.
signalBuffer = dsp.Buffer(2*frameSize, frameSize);
Создайте объект оконной системы. Здесь вы будете использовать окно по умолчанию, которое является Хэммингом.
hammingWindow = dsp.Window;
Создайте Системный объект автокоррелятора и установите его свойства вычислить задержки в области значений [0:12] масштабируемый длиной входа.
autoCorrelator = dsp.Autocorrelator( ... 'MaximumLagSource', 'Property', ... 'MaximumLag', 12, ... 'Scaling', 'Biased');
Создайте Системный объект, который вычисляет отражательные коэффициенты из автокорреляционной функции с помощью рекурсии Левинсона-Дербина. Вы конфигурируете его, чтобы вывести и полиномиальные коэффициенты и отражательные коэффициенты. Полиномиальные коэффициенты используются, чтобы вычислить и построить спектр LPC.
levSolver = dsp.LevinsonSolver( ... 'AOutputPort', true, ... 'KOutputPort', true);
Создайте КИХ цифровой Системный объект фильтра, используемый для анализа. Также создайте два, все-подпирают шестами цифровые Системные объекты фильтра, используемые для синтеза и de-акцента.
analysisFilter = dsp.FIRFilter(... 'Structure','Lattice MA',... 'ReflectionCoefficientsSource', 'Input port'); synthesisFilter = dsp.AllpoleFilter('Structure','Lattice AR'); deEmphasisFilter = dsp.AllpoleFilter('Denominator',[1 -0.95]);
Создайте Системный объект, чтобы проигрывать получившееся аудио.
audioWriter = audioDeviceWriter('SampleRate', Fs); % Setup plots for visualization. scope = dsp.SpectrumAnalyzer('SampleRate', Fs, ... 'PlotAsTwoSidedSpectrum', false, 'YLimits', [-140, 0], ... 'FrequencyResolutionMethod', 'WindowLength', 'WindowLength', fftLen,... 'FFTLengthSource', 'Property', 'FFTLength', fftLen, ... 'Title', 'Linear Prediction of Speech', ... 'ShowLegend', true, 'ChannelNames', {'Signal', 'LPC'});
Здесь вы вызываете свой цикл обработки, где вы делаете анализ LPC и синтез входного звукового сигнала с помощью Системных объектов, вы инстанцировали.
Цикл останавливается, когда вы достигаете конца входного файла, который обнаруживается Системным объектом AudioFileReader
.
while ~isDone(audioReader) sig = audioReader(); % Read audio input % Analysis % Note that the filter coefficients are passed in as an argument to the % analysisFilter System object. sigpreem = preEmphasisFilter(sig); sigbuf = signalBuffer(sigpreem); sigwin = hammingWindow(sigbuf); sigacf = autoCorrelator(sigwin); [sigA, sigK] = levSolver(sigacf); % Levinson-Durbin siglpc = analysisFilter(sigpreem, sigK); % Synthesis synthesisFilter.ReflectionCoefficients = sigK.'; sigsyn = synthesisFilter(siglpc); sigout = deEmphasisFilter(sigsyn); audioWriter(sigout); % Play output audio % Update plots sigA_padded = zeros(size(sigwin), 'like', sigA); % Zero-padded to plot sigA_padded(1:size(sigA,1), :) = sigA; scope([sigwin, sigA_padded]); end
Здесь вы вызываете метод релиза на Системных объектах, чтобы закрыть любые открытые файлы и устройства.
release(audioReader);
pause(10*audioReader.SamplesPerFrame/audioReader.SampleRate); % Wait until audio finishes playing
release(audioWriter);
release(scope);
Вы видели здесь реализацию метода сжатия речи с помощью Кодирования Линейного предсказания. Реализация использовала функциональность DSP System Toolbox, доступную в командной строке MATLAB. Код включает только вызов последовательных Системных объектов с соответствующими входными параметрами. Это не включает подверженного ошибкам ручного отслеживания состояния, которое может иметь место, например, для реализации MATLAB Буфера.