Трансиверы, передатчики, РПУ > Software Defined Radio (SDR)

Реверсивная цифровая АРУ с антипитченгом.

(1/6) > >>

ra0ahc:
Если интерес остался к этой теме, то почему бы не поделится ))
Как сказал Геннадий Завидовский: "Нас должно быть больше!"

Сама АРУ по сути это программа, которая выравнивает амплитуду до нормальных (по человеческим меркам) уровней. И перед тем как начать что-то рассказывать хочу объяснить основу цифрового звука на сегодня.
Сперва стоит АЦП который оцифровывает амплитуду сигнала в рамках от -1 до 1 (условно). Далее через шину i2s эти данные летят в процессор, причем скорость их константа и составляет всем известные значения(44к 48к 96к 192к  и тд) измеряемые в количествах замеров ацп в 1 секунду и чем выше эта цифра - тем более качественный сигнал, но тем больше ресурсов кушается в процессоре.
В процессоре звук обрабатывается блоками кратными 8 (у меня 512*4 байт 1 один блок, а всего их 2 блока ). Прием данных в память процессора от ацп или плис осуществляется в бесконечном цикле специальным железом внутри процессора - DMA  механизм прямого доступа к память без использования процессорного времени. Так вот, дма заполняет память замерами ацп и как только один блок памяти заканчивается, дма дает сигнал процессору "типа блок полный" и сразу начинает заполнять второй блок,  а потом опять первый и так бесконечно и всегда с одной скоростью. Таким образом нет разрывов и пропусков и звук получается стабильный и качественный - это основа i2s шины передачи звука. Когда процессор получает сигнал от дма, что блок полный то сразу начинает с ним работать. Вот здесь и работает АРУ, НОЧЬ, НБ, НР, ШИФТ - это то , что процессор успевает сделать с одним блоком пока ДМА заполняет второй бок памяти замерами ацп. После обработки блока, процессор отдает снова ДМА только теперь для передачи этого блока на ЦАП (для получения уже звука) за это отвечает еще один канал ДМА (у процессора их несколько, очень классная штука, которая ускоряет сильно работу всей системы и вывод видио инфы в том числе). Фактически работает сразу два канала дма с одной скоростью с 4 блоками (2 на прием и 2 на передачу). Вот так работают все современные трансиверы и всякие приборы типа осликов и анализаторов - в реальном времени. За это время, помимо звука нужно еще подготовить видео и еще всякую дополнительную работу с периферией (дпф, тюнеры). Вообщем процессор изрядно занят.  lllol
     

ra0ahc:
Реверсивная АРУ основана на принципе плавного занижения амплитуды сигнала до "броска"  lllol Как такое может быть? Как мы можем узнать что "будет в будущем"?  lllol Да, мы не можем смотреть в будущие , зато в наших силах задержать сигнал на несколько мс , что никак не скажется на восприятие звука. Человек никак не сможет уловить такую задержку. А мы успеем обработать за это время все, что захотим т сразу выбросить в цап результат. Причем, даже если мы ничего не будем делать, то задержка все равно останется, блок просто будет ждать свой очереди для отправки в цап.
Вот (1) входной сигнал "броска" на входе АЦП. Обычная АРУ (оглайн ару) как только дойдет до первой точки начала броска (амплитуда будет выше заданного максимума) на этом синусе сразу начнет пересчет коэфф для нормализации (стандартная реакция), но (!) как только придет следующий замер больше предыдущего, то проц опять пересчитает коэфф. Но проблема в том, что это будет второй замер с той же амплитудой (!)- то есть меандр, который даст кучу гармоник, или "кряк" в наушниках. В этом и есть проблемы всех АРУ включая аналоговые - они крякают. Что делать? Я потратил несколько месяцев на решение этой проблемы и решение весьма простым оказалось  lol22 нужно просто пройтись по блоку в реверсе и плавно снизить амплитуды ацп до приемлемой, перед началом броска. Просто!!!  lol22 Работает - огонь! Может работать на ультразвуке (17 кГц) или НЧ - без разницы. Мы фактически снижаем громкость перед самым броском. По скорости - это 10-ки мкс и на слух никак не слышно. Единственное место в котором эта схема не заработала - это компрессор на передачу. Там ну никак не вяжется намеренное снижение динамики с сохранением качественного сигнала ))) . В ТХ и включенном компрессоре система реверсивной АРУ выключена.
На рис (3) как раз видно что происходит с сигналом после обработки АРУ.       

ra0ahc:
И все бы было очень легко если бы это не было так сложно  adm
Проблема в том , что например 100 шагов (замеров АЦП) назад это уже выходит за рамки текущего блока. И по идеи нужно залазить в блок который отдан ДМА для отправки в ЦАП. Ситуация патовая. ДМА слепо пред значение из блока и отправляет в цап, и так с постоянной скоростью в бесконечном цикле. Я решил попробовать залезть в этот блок. Я почему-то подумал, что ДМА довольно медленная система и возможно я успею что-нибудь исправить в этом блоке. И оказалось, что процессор на столько быстрый, что я легко залазил на 100 замеров в этот блок и успевал изменить там амплитуды до того как ДМА доберется до этих ячеек памяти. Таким образом, если даже АРУ ловит бросок в самом начале блока , то я всеравно лезу в старый блок и меняю там амплитуды как описывал раньше. Потом я сделал количества этих шагов переменным. Например если пик броска уже пройден то нет необходимости ползти по всем 100 замерам АЦП и можно ограничится 50 замерами. Сильно скорость увеличилась работы АРУ. Особенно когда у тебя всего 512 замеров ацп на блок и скорость 96 кбит/сек и задержка между реальным сигналом и сигналом в наушниках всего  5.33мс  - все имеет значение.

ra0ahc:
Анитипитчинг построен на принципе приращения константы ко времени задержки отката усиления  АРУ. В базе или старте или покое перед всплеском (питчиком) задержка отката усиления АРУ стоит минимально возможная. Это кстати в принципе полностью обратная тема. Раньше это время отката я пытался считать пиками сигнала и если из 3 пиков только два были и последний не был пиком то я считал такой всплеск питчиком и не включал задержку. В сегодняшнем варианте, я любой сигнал считаю питчком, но (!) если сигнал долгий (например голос) то время задержки отката усиления ару будет стремительно расти во времени, но не больше максимума (который я ставлю в настройках). Я как бы натягиваю пружину. Если питчик короткий, то он не сможет натянуть пружину сильно и задержка будет минимальной, а если голос то каждый всплеска голоса (синус) будет сильнее ее натягивать пока не достигнет максималки. На практике это звучит так, что ару отрабатывает короткий питчик и тут же возвращает усиление назад  и информация не теряется (я это слышал много раз, особенно в грозу декабрьскую  lllol). И также эта система работает на отпускание. Мы либо натягиваем эту пружину либо отпускаем. Если сигнал прерывистый и  есть паузы (медленный голос) то ару посчитает его питчеком и будет вставлять шум эфира между слов. Не знаю, можно ли это назвать недостатком, всегда можно отключить эту систему или перевести ару в другой режим или загрубить систему антипитченга путем увеличения константы приращения (это, кстати, 4-й параметр регулировки ару). Антипитченг всегда переменный. Нет стабильной задержки она всегда плавает.

ra0ahc:
Если кому нужен код на С ...дайте знать, кину сюда.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии