Игорь 2

Трансиверы, передатчики, РПУ => Software Defined Radio (SDR) => Тема начата: ra0ahc от Январь 01, 2022, 06:42:37 pm

Название: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 06:42:37 pm
Если интерес остался к этой теме, то почему бы не поделится ))
Как сказал Геннадий Завидовский: "Нас должно быть больше!"

Сама АРУ по сути это программа, которая выравнивает амплитуду до нормальных (по человеческим меркам) уровней. И перед тем как начать что-то рассказывать хочу объяснить основу цифрового звука на сегодня.
Сперва стоит АЦП который оцифровывает амплитуду сигнала в рамках от -1 до 1 (условно). Далее через шину i2s эти данные летят в процессор, причем скорость их константа и составляет всем известные значения(44к 48к 96к 192к  и тд) измеряемые в количествах замеров ацп в 1 секунду и чем выше эта цифра - тем более качественный сигнал, но тем больше ресурсов кушается в процессоре.
В процессоре звук обрабатывается блоками кратными 8 (у меня 512*4 байт 1 один блок, а всего их 2 блока ). Прием данных в память процессора от ацп или плис осуществляется в бесконечном цикле специальным железом внутри процессора - DMA  механизм прямого доступа к память без использования процессорного времени. Так вот, дма заполняет память замерами ацп и как только один блок памяти заканчивается, дма дает сигнал процессору "типа блок полный" и сразу начинает заполнять второй блок,  а потом опять первый и так бесконечно и всегда с одной скоростью. Таким образом нет разрывов и пропусков и звук получается стабильный и качественный - это основа i2s шины передачи звука. Когда процессор получает сигнал от дма, что блок полный то сразу начинает с ним работать. Вот здесь и работает АРУ, НОЧЬ, НБ, НР, ШИФТ - это то , что процессор успевает сделать с одним блоком пока ДМА заполняет второй бок памяти замерами ацп. После обработки блока, процессор отдает снова ДМА только теперь для передачи этого блока на ЦАП (для получения уже звука) за это отвечает еще один канал ДМА (у процессора их несколько, очень классная штука, которая ускоряет сильно работу всей системы и вывод видио инфы в том числе). Фактически работает сразу два канала дма с одной скоростью с 4 блоками (2 на прием и 2 на передачу). Вот так работают все современные трансиверы и всякие приборы типа осликов и анализаторов - в реальном времени. За это время, помимо звука нужно еще подготовить видео и еще всякую дополнительную работу с периферией (дпф, тюнеры). Вообщем процессор изрядно занят.  lllol
     
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 07:06:03 pm
Реверсивная АРУ основана на принципе плавного занижения амплитуды сигнала до "броска"  lllol Как такое может быть? Как мы можем узнать что "будет в будущем"?  lllol Да, мы не можем смотреть в будущие , зато в наших силах задержать сигнал на несколько мс , что никак не скажется на восприятие звука. Человек никак не сможет уловить такую задержку. А мы успеем обработать за это время все, что захотим т сразу выбросить в цап результат. Причем, даже если мы ничего не будем делать, то задержка все равно останется, блок просто будет ждать свой очереди для отправки в цап.
Вот (1) входной сигнал "броска" на входе АЦП. Обычная АРУ (оглайн ару) как только дойдет до первой точки начала броска (амплитуда будет выше заданного максимума) на этом синусе сразу начнет пересчет коэфф для нормализации (стандартная реакция), но (!) как только придет следующий замер больше предыдущего, то проц опять пересчитает коэфф. Но проблема в том, что это будет второй замер с той же амплитудой (!)- то есть меандр, который даст кучу гармоник, или "кряк" в наушниках. В этом и есть проблемы всех АРУ включая аналоговые - они крякают. Что делать? Я потратил несколько месяцев на решение этой проблемы и решение весьма простым оказалось  lol22 нужно просто пройтись по блоку в реверсе и плавно снизить амплитуды ацп до приемлемой, перед началом броска. Просто!!!  lol22 Работает - огонь! Может работать на ультразвуке (17 кГц) или НЧ - без разницы. Мы фактически снижаем громкость перед самым броском. По скорости - это 10-ки мкс и на слух никак не слышно. Единственное место в котором эта схема не заработала - это компрессор на передачу. Там ну никак не вяжется намеренное снижение динамики с сохранением качественного сигнала ))) . В ТХ и включенном компрессоре система реверсивной АРУ выключена.
На рис (3) как раз видно что происходит с сигналом после обработки АРУ.       
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 07:26:43 pm
И все бы было очень легко если бы это не было так сложно  adm
Проблема в том , что например 100 шагов (замеров АЦП) назад это уже выходит за рамки текущего блока. И по идеи нужно залазить в блок который отдан ДМА для отправки в ЦАП. Ситуация патовая. ДМА слепо пред значение из блока и отправляет в цап, и так с постоянной скоростью в бесконечном цикле. Я решил попробовать залезть в этот блок. Я почему-то подумал, что ДМА довольно медленная система и возможно я успею что-нибудь исправить в этом блоке. И оказалось, что процессор на столько быстрый, что я легко залазил на 100 замеров в этот блок и успевал изменить там амплитуды до того как ДМА доберется до этих ячеек памяти. Таким образом, если даже АРУ ловит бросок в самом начале блока , то я всеравно лезу в старый блок и меняю там амплитуды как описывал раньше. Потом я сделал количества этих шагов переменным. Например если пик броска уже пройден то нет необходимости ползти по всем 100 замерам АЦП и можно ограничится 50 замерами. Сильно скорость увеличилась работы АРУ. Особенно когда у тебя всего 512 замеров ацп на блок и скорость 96 кбит/сек и задержка между реальным сигналом и сигналом в наушниках всего  5.33мс  - все имеет значение.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 08:08:13 pm
Анитипитчинг построен на принципе приращения константы ко времени задержки отката усиления  АРУ. В базе или старте или покое перед всплеском (питчиком) задержка отката усиления АРУ стоит минимально возможная. Это кстати в принципе полностью обратная тема. Раньше это время отката я пытался считать пиками сигнала и если из 3 пиков только два были и последний не был пиком то я считал такой всплеск питчиком и не включал задержку. В сегодняшнем варианте, я любой сигнал считаю питчком, но (!) если сигнал долгий (например голос) то время задержки отката усиления ару будет стремительно расти во времени, но не больше максимума (который я ставлю в настройках). Я как бы натягиваю пружину. Если питчик короткий, то он не сможет натянуть пружину сильно и задержка будет минимальной, а если голос то каждый всплеска голоса (синус) будет сильнее ее натягивать пока не достигнет максималки. На практике это звучит так, что ару отрабатывает короткий питчик и тут же возвращает усиление назад  и информация не теряется (я это слышал много раз, особенно в грозу декабрьскую  lllol). И также эта система работает на отпускание. Мы либо натягиваем эту пружину либо отпускаем. Если сигнал прерывистый и  есть паузы (медленный голос) то ару посчитает его питчеком и будет вставлять шум эфира между слов. Не знаю, можно ли это назвать недостатком, всегда можно отключить эту систему или перевести ару в другой режим или загрубить систему антипитченга путем увеличения константы приращения (это, кстати, 4-й параметр регулировки ару). Антипитченг всегда переменный. Нет стабильной задержки она всегда плавает.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 08:28:27 pm
Если кому нужен код на С ...дайте знать, кину сюда.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 08:38:12 pm
А вот собственно тест с эфира. Я набросил провод на дпф и подал тон с разной длительностью и слышно как интеллект ару работает.

https://drive.google.com/file/d/10yD5T4hAsA7mlhU-8LoIAzXwHtyQY6hq/view?usp=sharing
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: Игорь 2 от Январь 01, 2022, 09:19:56 pm
В общем-то, превентивное плавное снижение усиления до порога, при котором всплеск не приведёт к перегрузу выхода известен довольно давно, к примеру, на картинке функция Hard Limiting в Adobe Audition, изначально на стыке были два сигнала - -21 дБ до, и -1 дБ - после - ступенька 20 дБ.
Несложно заметить, что редактор плавно снизил уровень усиления ровно до такой степени, чтобы 20-дБ всплеск не привёл к перегрузу.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: Егм от Январь 01, 2022, 09:26:09 pm
Спасибо ! !  ! Принцип работы понятен .  33wr
 1999 1999 1999 1999

Исходники для истории и расширения кругозора надо сохранить !
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 09:26:22 pm
Я не подглядывал  cr123 дошел сам методом тыка.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: veso74 от Январь 01, 2022, 09:31:31 pm
Звучит очень хорошо! Особенно нравится, что ефир слышен ниже основного (в данном случае мешающего) сигнала, как пайлапе на одной частоте - получаеш информацию откуда можно, и скучаешь, когда привык к приему, а напр. радио поменяли, например работая по другим принципам АРУ.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 09:43:52 pm

Исходники для истории и расширения кругозора надо сохранить !

Завтра допишу коменты и скину сюда
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 09:45:30 pm
Звучит очень хорошо! Особенно нравится, что ефир слышен ниже основного (в данном случае мешающего) сигнала, как пайлапе на одной частоте - получаеш информацию откуда можно, и скучаешь, когда привык к приему, а напр. радио поменяли, например работая по другим принципам АРУ.
Спасибо. Тон значительно громче чем шум эфира. Вопрос только на сколько быстро ару вернет усиление после помехи импульсной.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: veso74 от Январь 01, 2022, 09:49:01 pm
Да, то же самое происходит с аналоговой АРУ с полевым высокоомным входом (без "умных" цепей) - энергия от пиков (напр. трески ефира) не полностью активирует полное время (есть амплитуда, но время мало => площади енергии нет), опр. от RC-группы. Емулировали хорошо. Ефир прозрачный. Не похоже на АРУ ​​(детекция) по НЧ. Нравится.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 09:52:17 pm
Да, то же самое происходит с аналоговой АРУ с полевым высокоомным входом - энергия от пиков (напр. трески ефира) не полностью активирует полное время, опр. от RC-группы. Емулировали хорошо. Ефир прозрачный. Не похоже на АРУ ​​(детекция) по НЧ.
А, я понял.  Если задержки нет, то сигнал будет испорчен. В цифровой АРУ даже при самых малых задержках , задержка есть и динамика не портится. Модулирование шума сигналом не происходит.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 01, 2022, 09:58:47 pm
Я показывал уже эти записи, но пусть здесь будет тоже

Вот как на станциях новая ару работает. Тональник 59+30дб. Антипитчинг.

https://drive.google.com/file/d/1XlU3B8sqNlbWSRCQGDUjvzb_KeLQ6Rxt/view?usp=sharing
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: VA7KL от Январь 01, 2022, 11:21:56 pm
Спасибо Сергей за отличный новогодний подарок всем ! (главное вовремя напроситься  8) )

Хоть каждый и собирает свое, все равно необходимо знать общие Правильные подходы к элементам АРУ. У меня сейчас работает STM32H747 c квадратурным полумонстром Игоря, без АРУ, с децибельником - ужас! Я пока фокусировался на формировании SSB, уже сделал, теперь АРУ...

А насколько далеко в миллисекундах надо идти в прошлое от точки реверса, чтобы заранее ослабить сигнал ?
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 02, 2022, 03:48:08 pm
Последняя версия АРУ

void AGC_do_digi(void) {
    //main circle
    for (int i = 0; i < FRAME_SIZE; i += 8) {
        float32_t a = fabsf(saiRxBank[saiRxBankNowNumber][i]); // модуль замера
        //сильный
        if (a * agcd.val > agcd.max) {//сюда если сигнал превысил максималку

            agcd.delayNow = 0;
            agcd.delay = 5; //мин задержка отката сразу
            agcd.val = agcd.max / a;  //расчет нового множителя
           
            //переменный степ от 250...100 шагов назад
            uint16_t steps = 100;
            steps = (uint16_t) ((float32_t) steps * agcd.oldVal / agcd.val);
            if (steps > 250)steps = 250;
           
            float32_t step = (agcd.oldVal - agcd.val) / (float32_t) (steps);//шаг изменения амплитуды

            uint8_t nn = saiTxBankNowNumber ? 0 : 1;//выбор банки которая уже отдана дма
            uint16_t vv = 0;
            for (int loc = 1; loc < steps; loc++) {
                int32_t ii = i - loc * 8;
                if (ii >= 0) {//если еще не вышли за текущий блок приема
                    saiRxBank[saiRxBankNowNumber][ii] /= agcd.oldVal;//сперва вернем старое значение
                    saiRxBank[saiRxBankNowNumber][ii] *= (agcd.val + step * (float32_t) loc);//а теперь умножим на новый множитель
                } else {//сюда зашли если уже вышли с текущего блока и зашли в старый блок
                    uint16_t x = (FRAME_SIZE - 8) - vv * 8;//адрес в слотах
                    float32_t tx = (float32_t) saiTxBank[nn][x] / 0x1p24f;//специфика адау 1647
                    vv++;
                    tx /= agcd.oldVal;////сперва вернем старое значение
                    tx *= (agcd.val + step * (float32_t) loc);//а теперь умножим на новый множитель
                    saiTxBank[nn][x] = (int32_t) (tx * 0x1p24f);//особенность адау
                    SCB_CleanDCache_by_Addr((uint32_t *) &saiTxBank[nn][x], 4); //сброс кэша в память
                }
            }

        } else {//сюда если сигнал меньше чем максималка (начало алгоритма отката)
            //антипитченг
            //если задержка не достигла максимального 
            if (agcd.delay < agcd.delayMax) agcd.delay += agcd.speedPitchingRise;// добавим приращение к задержки

            if (!agcd.delayNow) { //если счетчик задержки закончился и нужно возвращать усиление
                if (a * agcd.val * agcd.speed <= agcd.max) //если можем еще поднять усиление
                    agcd.val *= agcd.speed; //то подымаем
                else agcd.val = agcd.max / a;//если не можем понять то берем максимально возможное усиление
            }
        }

        saiRxBank[saiRxBankNowNumber][i] *= agcd.val;// фиксируем усиление в каждой ячейки блока
       
        //ворота
        //если сигнал не падает то отодвигаем задержку 
        if (saiRxBank[saiRxBankNowNumber][i] >= agcd.max / agcd.gate) {//продолжаем задержку
            agcd.delayNow = agcd.delay>2.0f?(uint16_t) agcd.delay:2;
        }
        agcd.oldVal = agcd.val; //сохраним старый коэфф

    }
    if (agcd.delayNow)agcd.delayNow--; //уменьшим счетчик задержки если он не пустой

}

Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 02, 2022, 03:49:34 pm
ини

void AGC_ini(void) {
    HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);//для аналогового ару
    HAL_ADC_Start(&hadc1);//для аналогового ару
    HAL_TIM_Base_Start_IT(&htim6);//для аналогового ару
    tmp = (uint32_t) hdac1.Instance + DAC_DHR12R1_ALIGNMENT(0); // DAC address
   
   
    // rx agc digi ini
    agcd.val = 0.5f;
    agcd.max = 0.3f;

    agcd.delay = 5;
    agcd.delayNow = 0;
    agcd.delayMax = 100;
    agcd.delayMax_max = 150;
    agcd.delayMax_min = 10;

    agcd.speed = 1.0003f;
    agcd.speed_max = 1.0006f;
    agcd.speed_min = 1.00002f;

    agcd.gate = 3.0f;
    agcd.gate_max = 4.0f;
    agcd.gate_min = 1.1f;

    agcd.speedPitchingRise = 0.001f;
    agcd.speedPitchingRise_max = 0.1f;
    agcd.speedPitchingRise_min = 0.0001f;
    agcd.oldVal = 0.0000001f;
    agcd.needToChange = YES;
    agcd.windowYN = NO;
    agcd.needToDrawWindow = NO;

    //analog
    agcd.dacMax = 3000.0f;
    agcd.dacMin = 200.0f;
    agcd.dacAnalog = (uint16_t) agcd.dacMax;
    *(__IO uint32_t *) tmp =1700;// DAC


}

void AGC_load_default_setting(void) {


    for (uint8_t rx = 0; rx < 2; rx++)
        for (uint8_t mode = 0; mode < 3; mode++)
            for (uint8_t variant = 0; variant < 3; variant++) {
                agcd.e.loadedVariantNN[rx][mode] = 0;
                agcd.e.var[rx][mode][variant].gate = 3.0f;
                agcd.e.var[rx][mode][variant].delayMax = 100.0f;
                agcd.e.var[rx][mode][variant].speed = 1.0003f;
                agcd.e.var[rx][mode][variant].speedPitch = 0.001f;
            }

}

Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 02, 2022, 04:56:02 pm
Ворота в АРУ

Важный параметр! Этот параметр отвечает за продление задержки отката усиления. Станция говорит и делает паузы между слов и если пауза не вышла за рамки максимальной задержки отката ару и следующая слово или фраза стали меньше по уровню, но не вышли за ворота (в дб), то задержка отодвинется на максималку - обновится без коррекции усиления. А вот если сигнал ушел в qsb и вышел за рамки ворот (уменьшился на критичные дБ) то АРУ откорректирует усиление и примет эту "фразу" как новый нормальный уровень и выставит опять задержку отката. 
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: VA7KL от Январь 05, 2022, 04:19:00 am
a = fabsf(saiRxBank[saiRxBankNowNumber]); // модуль замера

это сигнал прямо с АЦП, или уже както обработанный? На последней картинке это тот же сигнал, или его огибающая?
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 05, 2022, 08:39:39 am
Хороший вопрос.
В процессоре с ацп идут только положительные значения. В ацп серьёзных с плис  уже сделана средняя точка  и значения уже от -1 до 1 (средняя точка это пол питания ) . В плис системах там сразу вводят среднюю точку и берут ее за 0 и значения летят от -1 до 1 (условно) . Теперь ещё один момент это тип данных, нужен float32_t . Все мат процессоры работают с float типом данных.
В строчке я беру модуль замеров и работаю только с положительными значениями. Название массива говорит само за себя - это один из двух блоков заполненных значениями , которые прилетели с шины i2s (не важно от куда).
Я ответил на вопрос ?
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: VA7KL от Январь 06, 2022, 07:50:15 am
почти... Хотелось бы уточнить: по i2s прилетают положительные и отрицательные значения. Вы берете их абсолютные значения, то есть все отсчеты становятся положительными, и только на них и работает АРУ ?

На последней картинке с воротами вот те горбы с пичками и есть положительные отсчеты?

Я подумал вдруг у вас там вычисляется огибающая аудио сигнала, (например через преобразование Гильберта) и по ней работает АРУ. Для АРУ такие сложности наверное излишни. Я огибающую находил в процессе определения фазы речевого сигнала, но это совсем другая история.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 06, 2022, 09:57:06 am
Да, это другая история.
Да все просто )) модули значений мне нужны для расчёта коэффициента (множителя) ару. Там же все время все значения умножаются на какой-то коэффициент, который мы рассчитываем. В этом есть программный смысл ару - просто умножить на коэффициент каждый замер. А так как я ищу всегда максимум сигнала то мне надо смотреть как положительные полуволны так и отрицательные (всплеск может в любой части полуволны) и чтобы не путаться со знаком потом и не проверять каждый раз на знак, то лучше сразу взять модуль и не парится да и его надо взять один раз. По i2s с плис летят -1 по 1 float32 замеры. Огибающую не надо вычислять (я пробовал залазить в сигнал - это был капец) ее ацп стробирует. По фильтрам и гильбертам … я отдал в е адау1467 - это серьезный звуковой процессор с очень простым программированием. И фильтра и формирование ssb сигнала всё в ней. Я серьезно разгрузил процессор отдав всю фильтрацию в адау . За счёт такого тандема мне удалось сделать очень качественный звук с минимальной задержкой. 96к 24 бита довёл до наушников! Это реально круто.
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: ra0ahc от Январь 06, 2022, 10:07:27 am
Если есть желание то я могу выложить проект по адау с комментами и программным кодом внешней загрузки коэффициентов в фильтра. Единственное , я так и не научился расчитывать коэффициенты на лету под фильтра, и пришлось дампы коэффициентов сохранять с шагом 100 гц ))
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: r1tx от Январь 07, 2022, 01:32:36 am
Я уже год жду когда...  lol22
Название: Re: Реверсивная цифровая АРУ с антипитченгом.
Отправлено: VA7KL от Январь 07, 2022, 02:56:45 am
всегда интересуюсь что вы делаете с Адау, хотя сам вряд ли за нее возьмусь - глубоко влез в свой проект   8)