Линейное предсказательное кодирование (LPC), это мощный метод анализа и цифровой обработки сигналов, который позволяет по уже наблюденным отсчётам предсказать следующий и, тем самым, сжать данные или синтезировать речь. В основе лежит идея, что каждый отсчёт можно выразить как линейную комбинацию фиксированного числа предыдущих отсчётов, а ошибка предсказания передаётся далее вместо самого сигнала.
Содержание
- Теоретические основы
- Математическая модель
- Алгоритм расчёта коэффициентов
- Адаптивное предсказание
- Практический пример в MATLAB / Python
- Применение в кодировании речи: CELP, MELP
- Ключевые выводы
Теоретические основы
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
Автокорреляционный метод
- Разбить сигнал на кадры длиной N = 128–256 отсчётов (окно 20–30 мс).
- Для каждого кадра вычислить автокорреляцию:
R[k] = Σ x[n]·x[n-k], k = 0..p. - Решить систему уравнений Юла–Уокера:
R · a = r
где
R— симметричная Toeplitz-матрица автокорреляции,r = [R(1), R(2), …, R(p)]ᵀ. - Коэффициенты
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) — графики исходного и восстановленного сигнала совпадут с точностью до незначительной ошибки, что и демонстрирует эффективность метода.