Анализ LPC и синтез речи

В этом примере показано, как реализовать метод сжатия речи, известный как Кодирование линейного предсказания (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.AsyncBuffer(2*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)
    % Read audio input
    sig = audioReader();

    % Analysis
    % Note that the filter coefficients are passed in as an argument to the
    % analysisFilter System object.
    sigpreem     = preEmphasisFilter(sig);
    write(signalBuffer,sigpreem);
    sigbuf       = read(signalBuffer,2*frameSize, frameSize);
    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);

    % Play output audio
    audioWriter(sigout);

    % 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 для системных объектов, чтобы закрыть все открытые файлы и устройства.

release(audioReader);
pause(10*audioReader.SamplesPerFrame/audioReader.SampleRate); % Wait until audio finishes playing
release(audioWriter);
release(scope);

Заключение

Вы видели здесь реализацию метода сжатия речи с помощью Кодирования Линейного предсказания. Реализация использовала функциональность DSP System Toolbox, доступную в командной строке MATLAB. Код включает только вызов последовательных Системных объектов с соответствующими входными параметрами. Это не включает подверженного ошибкам ручного отслеживания состояния, которое может иметь место, например, для реализации MATLAB Буфера.