Jump to content
    

MELP (MELPe) 600

Уважаемые форумчане!

 

Мозг требует постоянных движений в динамике,сложа руки сидеть никогда и не подумывал, а доступных исходников на 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 прикрепленых архива.

В каждом: оригинал + синтезированная вокодером запись.

 

Брал голоса дикторов (женский голос).

 

Vahonina_Elvira.rar

 

Собственно вот в чём вопрос:

 

1) годится ли полученный MELP 600 бит/с в качестве вокодера для служебной радиосвязи?

2) какова разборчивость в процентах от всего звукового образца?

 

3) Помогите с векторным квантованием четырёх величин - по какому алгоритму можно проквантовать уровни громкости в 4-х соседних фреймах?

 

Звуковая иллюстрация второго диктора:

 

Baldenkova_Svetlana.part1.rar

Baldenkova_Svetlana.part2.rar

Share this post


Link to post
Share on other sites

Осмелился векторно проквантовать параметры: Pitch, Gain и BPV.

Приятно был удивлен, что векторное квантование хорошо жмет с минимальными потерями плавно меняющиеся данные.

 

Размер фрейма вернул на прежнее: 180 семплов.

 

Зато применил мультифреймовое квантование: брал 4 смежных фрейма и квантовал соответстующие параметры.

 

Биты распределены так:

 

LSF: VQ(8) + VQ(8) + VQ(8) + VQ(8) - в оригинальном MELP2400 было MSVQ(7+6+6+6)на 1 фрейм, а тут 4 фрейма по VQ(8) что снижает точность, но если со своей кодовой книгой, то нормально!

 

GAIN: VQ(9) - в оригинальном MELP было просто 8 бит(5+3) без квантования между фреймами

 

PITCH: VQ(8) - в оригинале было 7 бит без квантования между фреймами

 

BPVC: VQ(5) - в оригинале было 4 бита без межфреймового квантования

 

Итого: 8+8+8+8+9+8+5 = 54 бита на 4 фрейма, что точно соответствует 600 бит/с.

 

Результат: межфреймовое векторное квантование - отлично сжимает данные ссильной корреляцией почти без потерь качества.

 

Звуковая иллюстрация такого сета MELP 600:

melp600bps.rar

 

Если увеличить размер фрейма в 2 раза (и размеры LPC- и FFT- окон тоже в 2 раза) - то тупо получаем MELP 300 bps.

Правда это уже халтура - фрейм 360 семплов = 45 мс, параметры речи уже плохо описываются как стационарные.

Имеем местами нечленораздельное звучание - тут только говорить по-медленнее.

 

Ради любопытства прикладываю MELP 300(черновик):

melp300bps.rar

 

Кодовая книга в образцах, конечно же сделана своя под голос диктора!

 

Надо будет ещё попробовать применить векторное квантование к 40 LSF коэффициентам чтобы сжать 29 бит MSVQ.

 

Тогда:

LSF MSVQ(8+7+7+7)

PITCH VQ(9)

GAIN VQ(10)

BPVC VQ(6)

 

Те же 54 бита на 4 фрейма, но LSF более эффективно пожата,что позволяет закодировать LSF-ы 4-х фреймов сразу!

 

Проверял на чужих голосах без переделки кодовых книг - работает, на 600 бит/с разборчиво, но характер голоса становится другим.

 

У кого какой опыт возни с низкобитрейтовыми вокодерами, тема актуальна или нет?

 

Мне вот надо -133 дБм вприемнике выжать, поэтомуснижаю скорость передачи

Share this post


Link to post
Share on other sites

У кого какой опыт возни с низкобитрейтовыми вокодерами, тема актуальна или нет?

 

Мне вот надо -133 дБм вприемнике выжать, поэтомуснижаю скорость передачи

 

Просмотрите сообщения Mister_DSP в этом разделе: он ставил точно такую же задачу и в итоге пришел к решению.

 

Share this post


Link to post
Share on other sites

Мне вот надо -133 дБм вприемнике выжать, поэтомуснижаю скорость передачи

Так а может лучше совершенствовать приёмник, чем ухудшать и так похабный звук? :-))))))

Share this post


Link to post
Share on other sites

Просмотрите сообщения Mister_DSP в этом разделе: он ставил точно такую же задачу и в итоге пришел к решению.

 

Похоже это и есть реинкарнация того самого мистера.

 

Так а может лучше совершенствовать приёмник, чем ухудшать и так похабный звук? :-))))))

 

Это тяжко, исходников на порчу нет.

Share this post


Link to post
Share on other sites

petrov, Вы правы, M_DSP это я... :) Пришлось зарегаться по-новой так как забыл пароль и ящик на который регистрировался ранее...

 

Милливольт, большой Вам привет и велкам! :)

 

Эксперименты показали, что 8 бит на кодовую книгу не хватает, чтобы охватить все голоса. Оптимально 12 бит или ещё с запасом- 13 бит.

Сделал нарезку из 10 звуковых файлов мужских голосов + 10 женских голосов.

Из этой нарезки сделал 2 кодовые 13-бит:

 

1) Одноуровневое векторное квантование 2^13 = 8192 наборов LSF

 

2) Двух-уровневое векторное квантование 7+6 => 2^7 + 2^6 = 192 наборов LSF

 

Вариант 2 быстрее и экономичнее, но искажения больше, чем в варианте 1.

 

Первый вариант с кодовой книгой VQ(13):

vq13.rar

 

Второй вариант с MSVQ(7+6) - звучит хуже:

msvq76.rar

 

В этих двух пробах 1 фрейм = 30 мс и 29 бит на фрейм.

 

Очень приятно удивило, что 20 дикторов хватило, чтобы вокодер мог корректно воспроизводить звук других людей.

 

Так что скорее всего американский акцент кодека MELP связан с тем что кодовая книга там под граждан США:)

 

Получившийся битрейт 966,666666... бит/с - радиотракт моего приёмника оптимально прокачивается пакетом с достижением чутья -130 дБм.

При этом качество звука намного лучше, чем в прошлой конфе(тема M_DSP) на 975 бит/с.

 

Так а может лучше совершенствовать приёмник, чем ухудшать и так похабный звук? :-))))))

:)

Использую готовый модуль LORA1278F30, дальность радиосвязи там хоть отбавляй. С мощностью 1 Вт и чутьем -124 дБм

Но есть соблазн всегда получить больше: цель сделать -130дБм.

 

Есть ли в природе приемник дающий чутье более -133 дБм на скорости 1 кбит/с ? Частоты 70 см диапазона

Edited by kaktus_M

Share this post


Link to post
Share on other sites

Так а может лучше совершенствовать приёмник, чем ухудшать и так похабный звук? :-))))))

Есть ли в природе приемник дающий чутье более -133 дБм на скорости 1 кбит/с ? Частоты 70 см диапазона

-133дБм при паре кГц полосы это, если правильно посчитал, грубо говоря - около 1нВ/Гц, что уже недалеко от температурного шума 50 Ом, так что пожалуй только ухудшать похабный звук.

 

да кстати, вопрос, а насколько хуже (а может и лучше?) будет разборчивость речи у аналогового канала АМ/ЧМ с полосой, допустим в пару кГц, и с таким же с/ш чтобы туда 1кБит/с для melp600 влез?

Share this post


Link to post
Share on other sites

Есть ли в природе приемник дающий чутье более -133 дБм на скорости 1 кбит/с ? Частоты 70 см диапазона

Конечно есть, только его придётся делать самому.

 

-133дБм при паре кГц полосы это, если правильно посчитал, грубо говоря - около 1нВ/Гц, что уже недалеко от температурного шума 50 Ом, так что пожалуй только ухудшать похабный звук.

Вы вообще считаете непонятно что.

Предел Шеннона для -133 дБм в тепловом шуме это 12600 бит/с.

(Полосу я принял 1 Гц на каждый бит/с, что удобно. То есть полоса 12600 Гц.)

На 10 дБ приблизиться к Шеннону это не вопрос вообще (а можно и гораздо ближе, всё зависит от допустимой задержки),

и тогда получится скорость 1260 бит/с.

Share this post


Link to post
Share on other sites

я сварщик не настоящий,

но 5E-17Вт на входных 50Омах это 50нВ, в полосе 1кГц это 1.6nV/rtHz, что в 1.75раз больше чем тепловой шум этих же 50Ом, соответственно 1кГц*log2(1+1.75) = 1.4кБит/с.

как получилось 12600?

Share this post


Link to post
Share on other sites

А теперь со всем этим барахлом мы попытаемсо взлететь :-)))))))))))

— 50 Ом

— 50 нВ

— 1 кГц

— 1.6 nV

— rtHz

 

всё это здесь ненужный хлам.

 

Если уж так хочется в ваттах, то ладно.

-133 дБм вы прально посчитали: 5е-17 Вт,

теперь произведём ещё одно столь же бесполезное действие и узнаем,

что мощность теплового шума в ваттах есть 4е-21 Вт/Гц (а по праздникам вообще-то -174 дБм/Гц)

 

Далее. С какой стати вы заранее задали полосу в 1 кГц? Ну ладно, будь по-вашему.

Ошибка-то в другом месте, так что оставим.

Значит шум в этой полосе будет 4е-18 Вт. Итого у нас сигнал сильнее в 12.5 раз, а вовсе не в 1.75.

 

1кГц*log2(1+12.5) = 3755 бит/c

 

Если примете полосу численно равной скорости

(которая заранее не известна при вашем методе расчёта, но я уже посчитал 12600),

то шум окажется равным 4е-21 * 12600 = 5е-17 Вт, то есть равен сигналу.

 

Ну и 12600 * log2 (1 + 1) = 12600

Share this post


Link to post
Share on other sites

По части шума, полосы и сигналов. Использую приемник трансивера LORA1278F30 в режиме LoRa, SNR детектора в выбранных конфигурациях ниже 0 дБ.

 

Экспериментально ещё раз подтвердился тот факт, что нет смысла делать MELP именно на 600 или кпримеру на 300 бит/с.

Потому что неоптимально по качеству сигнала или по длине(времени) пакета.

 

Если провозиться с Semtech Lora Calculator или курить матан в даташитах (формула длительности пакета в эфире), то можно заметить , что по мере заполнения Payload время пакета меняется скачками. Причем это зависит от остальных параметров приемного тракта.

 

Поэтому в качестве отправной точки брал приоритеты: максимальное чутье, максимально заполненный Payload без скачка по времени пакета в эфире, минимальное число фреймов, разборчивость речи, максимальный коэффициент коррекции ошибок (убивает полезный битрейт в 2 раза, у нас не космос c АБГШ, а мегаполис с релеевской моделью).

 

Вместо MELP 600 вывел под радиотракт MELP 711,111... бит/с - это 32 бита на 2 фрейма (все параметры фреймов векторно проквантованы) и длина фрейма 22,5 мс (180 семплов).

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

 

Итого радиотракт:

SF=10

BW=250 kHz

CR = 4 (FEC 2:1)

чутье -130 дБм --- что на+6 дБ больше чем конфа с оригинальным MELP2400 c чутьем приемника -124 дБм. Дальность связи в 2 раза больше.

Payload = 14байт (7 фреймов по 2 байта)

Preamble=10байт (37% от времени всего пакета в эфире) - более 1/3 всего пакета под преамбулу. Длинная преамбула повышает надежность в радиосвязи.

Tair=156.67 ms < 157.5 ms (7Frame * 22,5 ms)

Вывод пролазим! И лучше чем MELP 600 !!!

Задержка распостранения звукового сигнала между приемником и передатчиком: 2*7*tFr = 14*22.5 = 0,315 sec.

 

Следующий шаг: чутье -133дБм

SF=10

BW=125 кгц

CR=4

Для достижения такой чувствительности был выведен MELP 355,555 бит/с. А не MELP 300.

Тут уже векторно проквантованы параметры 4-х смежных фреймов и занимает те же 32 бита, но на 4 фрейма.

Payload=14 байт

Preamble = 10 байт (37% от времени всего пакета)

Tair = 313.34 ms< 315 ms (14F* 22.5 ms)

Тоже пролезаем! И лучше чем MELP300bps

Задержка распостранения звукового сигнала между приемником и передатчиком: 2*14*tFr = 28*22.5 = 0,63 sec.

 

А вот если взять уже пакет с Payload не 14 байт, а 15 кпримеру, - то резко возрастет время пакета в эфире, которое превысит время N фреймов.

 

И это все не голая теория, а практические результаты и данные, у меня есть возможность проверить.

 

Конфигурации 711,111 и 355,555 бит/с были получены путём векторного квантования параметров -2х и -4х соответственно:

 

LSF: VQ(13)- такой кодовой книги на 8192 слова хватает, чтобы обеспечить разборчивость голосов, которых нет в кодовой книге и без заметных искажений.

Pitch: VQ(7)

Gain: VQ (8)

BPV: VQ (4)

-----------------

Итого: 32 бита на 2 или 4 фрейма соответственно. Или 4 байт/суперкадр. При этом размер 1 фрейма без изменений - 180 семплов = 22,5 мс

 

Архив с иллюстрациями прилагаю (оригинал , 712 бит/с и 356 бит/с). При этом кодовая книга не содержит этих голосов:

356bps_712bps_orig.rar

 

ИМХО недурно, за счет сохранения короткой длины фреймов вытянута слоговая разборчивость в словах!

 

Пора наверное научную степень давать! :biggrin:

Share this post


Link to post
Share on other sites

курить матан в даташитах

 

И это все не голая теория, а практические результаты и данные, у меня есть возможность проверить.

 

Пора наверное научную степень давать! :biggrin:

"матан" это математический анализ, его там нет.

 

Вы поставили перед собой очень-очень скромные цели и их добились, так что оснований даже для жырного шрифта нет :-)))))) не говоря уж о степени :-))))))))))

 

Для сравнения, древний GSM/GPRS качает 171200 бит/с в полосе 200 кГц, при этом чувствительность базовой станции по стандарту не хуже (!!) -110 дБм,

то есть система даже не пройдёт сертификацию если будет работать дальше 12 дБ от Шеннона. Реальные станции наверняка сегодня работают ближе.

 

А вы пока в 17 дБ от Шеннона, так что до степени придётся ещё немного поработать :-)))))

Share this post


Link to post
Share on other sites

16.04.2017 в 14:17, kaktus_M сказал:

За основу были взяты исходники от MELP 2400 бит/с (референтный код, с плавающей точкой).

А где брали ? Нашел целочисленное решение, но не нравится реализация ( да и быстродействие страдает )

Share this post


Link to post
Share on other sites

On 5/27/2022 at 12:28 AM, megajohn said:

А где брали ? Нашел целочисленное решение, но не нравится реализация ( да и быстродействие страдает )

Возился с MELP.  Дошёл до составления собственных кодовых  книг (нарезка голосов русскоязычных дикторов + прогон через векторный квантователь).

Пошёл дальше:  объединил несколько смежных фреймов в один мульти-фрейм. Параметры смежных фреймов тоже мульти-проквантовал.

Упёрся в лимит по скорости STM32F405 и в недостаток ПЗУ на кодовую книгу.

Финально сделал MELP800 и меньше.  Разборчивость на грани.

В качестве трансивера использовал  LoRa1278F30 на низких битрейтах, диапазон 70 см("433 МГц"). Дальность выше 8 км по прямой в условиях города. Антенна - китайская фабричная со SMA-разъёмом, "мизинец".

Из статей рекомендую почитать статью Бабикова про MELP.

Рабочее устройство и разные конфигурации можно посмотреть здесь: https://vrtp.ru/index.php?act=categories&CODE=article&article=3660

Последние версии с объединением в мультифрейм -  c поста: https://vrtp.ru/index.php?showtopic=27904&view=findpost&p=734924

 

Сейчас смотрю в сторону передачи LowRes видео + звук по радио-каналу. Пока всё сыро.

Из аудиокодеков кандидаты на использование: CELP4800, Silk 6-40 kbps, CELT >24 kbps. Последний хорошо передаёт не только голос, но и музыку. И время кодирования очень маленькое.

Edited by repstosw

Share this post


Link to post
Share on other sites

On 9/17/2022 at 7:36 AM, repstosw said:

CELT >24 kbps. Последний хорошо передаёт не только голос, но и музыку

Для таких битрейтов очень понравился g.722.1. Алгоритм по стандарту поддерживает 24,32,48кБит. По эталонным исходникам: 16..48кБит с шагом 800 бит. Без оптимизаций 16кГц 16кБит расход производительности кодера на arm926 ~30МГц. На сравнимых битрейтах мне качество понравилось намного больше, чем MP3.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...