exponenta event banner

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

В этом примере показано, как реализовать метод сжатия речи, известный как кодирование с линейным предсказанием (LPC), используя функциональные возможности DSP System Toolbox™, доступные в командной строке MATLAB ®.

Введение

В этом примере вы реализуете LPC анализ и синтез (LPC кодирование) речевого сигнала. Этот процесс состоит из двух этапов: анализ и синтез. В разделе анализа коэффициенты отражения извлекаются из сигнала и используются для вычисления остаточного сигнала. В разделе синтеза выполняется реконструкция сигнала с использованием остаточного сигнала и коэффициентов отражения. Остаточный сигнал и коэффициенты отражения требуют меньшего количества битов для кодирования, чем исходный речевой сигнал.

На приведенной ниже блок-схеме показана система, которая будет внедрена.

В этом моделировании речевой сигнал делится на кадры размером 3200 выборок с перекрытием 1600 выборок. Каждый кадр отображается в окне Хэмминга. Находят коэффициенты автокорреляции двенадцатого порядка, а затем вычисляют коэффициенты отражения из коэффициентов автокорреляции с использованием алгоритма Левинсона-Дурбина. Исходный речевой сигнал пропускают через фильтр анализа, который представляет собой фильтр с нулевыми коэффициентами в качестве коэффициентов отражения, полученных выше. Выходной сигнал фильтра является остаточным сигналом. Этот остаточный сигнал проходит через синтезирующий фильтр, который является обратным фильтру анализа. Выходной сигнал синтезирующего фильтра является исходным сигналом.

Инициализация

Здесь инициализируются некоторые переменные, такие как размер кадра, а также создаются экземпляры системных объектов, используемых при обработке. Эти объекты также предварительно вычисляют любые необходимые переменные или таблицы, что приводит к эффективной обработке вызовов позже внутри цикла.

Инициализация переменных.

frameSize = 1600;
fftLen = 2048;

Здесь создается системный объект для чтения из аудиофайла и определения частоты дискретизации аудиофайла.

audioReader = dsp.AudioFileReader('SamplesPerFrame', frameSize, ...
            'OutputDataType', 'double');

fileInfo = info(audioReader);
Fs = fileInfo.SampleRate;

Создайте объект системы цифровых фильтров FIR, используемый для предварительного выделения.

preEmphasisFilter = dsp.FIRFilter(...
        'Numerator', [1 -0.95]);

Создайте объект buffer System и задайте его свойства таким образом, чтобы получить вывод, вдвое превышающий длину frameSize с длиной перекрытия frameSize.

signalBuffer = dsp.AsyncBuffer(2*frameSize);

Создайте окно Системный объект. Здесь используется окно по умолчанию Hamming.

hammingWindow = dsp.Window;

Создайте системный объект автокоррелятора и задайте его свойства для вычисления лагов в диапазоне [0:12], масштабированном по длине ввода.

autoCorrelator = dsp.Autocorrelator( ...
            'MaximumLagSource', 'Property', ...
            'MaximumLag', 12, ...
            'Scaling', 'Biased');

Создайте объект System, который вычисляет коэффициенты отражения из функции автокорреляции с помощью рекурсии Левинсона-Дурбина. Он настраивается для вывода как полиномиальных коэффициентов, так и коэффициентов отражения. Полиномиальные коэффициенты используются для вычисления и построения графика спектра LPC.

levSolver = dsp.LevinsonSolver( ...
                'AOutputPort', true, ...
                'KOutputPort', true);

Создайте объект системы цифровых фильтров FIR, используемый для анализа. Также создайте два полнополюсных цифровых фильтра System объектов, используемых для синтеза и снятия акцента.

analysisFilter = dsp.FIRFilter(...
                    'Structure','Lattice MA',...
                    'ReflectionCoefficientsSource', 'Input port');

synthesisFilter = dsp.AllpoleFilter('Structure','Lattice AR');

deEmphasisFilter = dsp.AllpoleFilter('Denominator',[1 -0.95]);

Создайте объект System для воспроизведения результирующего звука.

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

Выпуск

Здесь вызывается метод деблокирования объектов System для закрытия всех открытых файлов и устройств.

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

Заключение

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