Линейного предсказания lpc

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

Содержание

  1. Теоретические основы
  2. Математическая модель
  3. Алгоритм расчёта коэффициентов
  4. Адаптивное предсказание
  5. Практический пример в MATLAB / Python
  6. Применение в кодировании речи: CELP, MELP
  7. Ключевые выводы

Теоретические основы

LPC является естественным расширением W-отводных кодеров с предсказанием. Если коэффициенты фильтра периодически пересчитываются по оптимальному алгоритму, то предсказание оказывается настолько точным, что передавать приходится только ошибку предсказания — её энергия минимальна. Это и обеспечивает высокую степень сжатия.

Главные преимущества LPC:

  • Низкая битовая скорость (речь — до 2,4 кбит/с).
  • Хорошее качество синтеза при малом объёме данных.
  • Простая реализация как в аппаратуре, так и в ПО.

Математическая модель

Пусть x[n] — отсчёты исследуемого сигнала (чаще всего речь). Модель линейного предсказания вперёд задаётся:

x̂[n] = ⸺ Σ (a_i · x[n-i]) для i = 1..p

где p — порядок предсказания (обычно 10–16 для речи при Fs = 8–11 кГц), a_i, коэффициенты LPC. Ошибка предсказания:

e[n] = x[n] — x̂[n]

Цель — найти такие a_i, чтобы минимизировать среднеквадратичную ошибку E{e²[n]}.

Алгоритм расчёта коэффициентов LPC

Автокорреляционный метод

  1. Разбить сигнал на кадры длиной N = 128–256 отсчётов (окно 20–30 мс).
  2. Для каждого кадра вычислить автокорреляцию:
    R[k] = Σ x[n]·x[n-k], k = 0..p.
  3. Решить систему уравнений Юла–Уокера:
    R · a = r
     

    где R — симметричная Toeplitz-матрица автокорреляции, r = [R(1), R(2), …, R(p)]ᵀ.

  4. Коэффициенты a = [a₁, a₂, …, aₚ] хранятся или передаются вместе с gain.

Ковариационный и решетчатый (lattice) методы

Для более устойчивых решений используются алгоритмы Levinson-Durbin (O(p²)) и Burg (обеспечивает минимальную фазу).

Адаптивное предсказание

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

  • Лучше отслеживать нестационарность речи.
  • Дополнительно сжимать данные (передавать только изменения коэффициентов).

Практический пример (MATLAB и Python)

MATLAB

Fs = 11025; % Частота дискретизации
x = audioread('speech.wav'); % Входная речь
p = 12; % Порядок LPC

% Оконная обработка
frameSize = 128;
for k = 1:frameSize:length(x)-frameSize
 frame = x(k:k+frameSize-1);
 a = lpc(frame, p); % Коэффициенты LPC
 residual = filter(a, 1, frame);
 % residual теперь содержит ошибку предсказания (excitation)
end

Python (SciPy / librosa)

import librosa, numpy as np
from scipy.signal import lfilter

x, Fs = librosa.load('speech.wav', sr=11025)
p = 12
frame = x[:128]

A = librosa.lpc(frame, order=p)
residual = lfilter(A, 1, frame)

Применение в кодировании речи

  • CELP (Code-Excited Linear Prediction, 1985) — кодирует residual векторно-кодовой книгой → 4–16 кбит/с.
  • MELP (Mixed Excitation LPC, MIL-STD-3005) — военный стандарт США, использует 5-полосное смешанное возбуждение → 2,4 кбит/с.
  • AMR, EVS в мобильной связи тоже опираются на LPC-подобные кодеры.

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

Ключевые выводы

  • LPC — это оптимальный линейный фильтр, минимизирующий среднеквадратичную ошибку.
  • Коэффициенты вычисляются по автокорреляции (Levinson-Durbin).
  • Ошибка предсказания легко кодируется, обеспечивая высокое сжатие.
  • Современные стандарты речевой связи (CELP, MELP, EVS) опираются на LPC-ядро.

На практике достаточно задать порядок 10–16, разбить речь на 20–30 мс кадры и использовать lpc (MATLAB) или librosa.lpc (Python) — графики исходного и восстановленного сигнала совпадут с точностью до незначительной ошибки, что и демонстрирует эффективность метода.