Уважаемые форумчане!
Мозг требует постоянных движений в динамике,сложа руки сидеть никогда и не подумывал, а доступных исходников на MELP 600 бит/с я не видел.
Научные статьи на эту тему, которые довелось мне видеть, содержат финальные результаты и в кратце то, что было проделано.
Никакой конкретики нет и не было.
Поэтому осмелился восполнить пробел и сделать MELP 600 бит/с самому.
За основу были взяты исходники от MELP 2400 бит/с (референтный код, с плавающей точкой).
Заставив его собираться в GCC, начал эксперименты.
Как известно, исходный фрейм в MELP 2400 - это 22,5 мс, что соответствует 180 одноканальным семплам.
Биты фрейма расписываются так:
Линейно-спектральные частоты - 7+6+6+6 бит = 25 бит (10 LSF частот типа float(4 байта) векторно квантуются в 4 стадии)
Магнитуды Фурье: 10 бит
Энергия фрейма: 5 + 3 бита - квантуется по половине фрейма
Основной тон - 7 бит
Фильтры по 4-м полосам: 4 бита
Джиттер: 1бит
Синхробит - 1 бит
Путём экспериментов выяснил, несколько важных моментов:
1) Магнитуды Фурье можно выкинуть, вместо них домножить на 1.0
2) Синхробит- вообще не нужен
3) Джиттер - информация тривиальная и получается вычислением других данных
Получается, вместо 56 бит можно использовать только 44 бита без заметного ухудшения качества и распознаемости речи.
Далее, известно, что параметры человеческой речи могут быть описаны стационарно без потерь разборчивости на фреймах длительностью не более 40 мс.
Что соответствует 320 семплам при Fs=8кГц.
Именно фреймы такой длины используются в кодеке Codec2 (опции с малыми битрейтами).
Выбор между Codec2 и MELP2400 в качестве отправной точки тоже неслучаен.
Эксперименты показали, что Codec2 крайне не поддается шумоподавлению с помощью адаптивных фильтров - флуктуации помехи на фоне полезного сигнала сохраняются и ведут к резкому падению речевой разборчивости.
Зато MELP2400 отлично работает с адаптивным шумоподавителем, речь без дополнительных фоновых звуков.
Основная трудность: создание своей собственной кодовой книги путём векторного квантования.
Нужно из речевых фрагментов получать 10 LSP коэффициентов, затем их преобразовывать в LSF-коэффициенты.
Всё это отражено в исходниках MELP2400.
Проблема возникла на этапе векторного квантования LSF - было непонятно, как из векторов LSF оставить только те, которые нетривиальныпо отношению друг к другу.
Читал про LGB-алгоритми про центроиды: кроме теории практических примеров - ноль, не говоряуже о том что квантование должно быть мульти-стадийным.
Завершилась эпопея с кодовой книгой - путем скачивания с pudn.com программы одного китайского гражданина, которая после допиливанияделала то что надо!
А именно: из LSF-векторов строила кодовую книгу - оставляла нетривиальные вектора, да и причем уровень разрядности и количество стадий можно кастомно задать!
Не буду напрягать промежуточными изысканиями, скажу что данного битового распределения хватает чтобы получить MELP600:
LSF: 8 бит - одноуровневое векторное квантование (256 элементов кодовой книги из голоса конкретного диктора)
Gain: 5 бит - усиление усредняетсяза2 полуфрейма и квантуется скалярно 32 значениями
Pitch: 7 бит- тут без изменений
BPV: 4 бит- тоже без изменений
Итого 24 бита- ровно 3 байта на 1 фрейм.
Фрейм взят 40 мс - 320 семплов.
При таком раскладе получаем MELP со скоростью 600 бит/с.
Сделал несколько наглядных иллюстраций : 2 прикрепленых архива.
В каждом: оригинал + синтезированная вокодером запись.
Брал голоса дикторов (женский голос).
Нажмите для просмотра прикрепленного файла
Собственно вот в чём вопрос:
1) годится ли полученный MELP 600 бит/с в качестве вокодера для служебной радиосвязи?
2) какова разборчивость в процентах от всего звукового образца?
3) Помогите с векторным квантованием четырёх величин - по какому алгоритму можно проквантовать уровни громкости в 4-х соседних фреймах?
Звуковая иллюстрация второго диктора:
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла