Перейти к содержанию
    

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Осмелился векторно проквантовать параметры: 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 дБм вприемнике выжать, поэтомуснижаю скорость передачи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 см диапазона

Изменено пользователем kaktus_M

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

— 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По части шума, полосы и сигналов. Использую приемник трансивера 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

 

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...