Автор Тема: Цифровая АРУ 0...1  (Прочитано 52688 раз)

0 Пользователей и 5 Гостей просматривают эту тему.

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 20748
Re: Цифровая АРУ 0...1
« Ответ #105 : Ноябрь 08, 2020, 10:11:42 pm »
Я не про то. Кто формирует сигнал со ступенчатым перепадом? И зачем брать такие низкие частоты?  dontt44
Ничего невозможного нет

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #106 : Ноябрь 09, 2020, 11:31:36 am »
По низким в основном и происходят искажения. Это связано с там , что больше точек при оцифровки. Ну или еще по каким причинам хз .

Игорь, какие будут (схемные решения) рекомендации по выходу ЦАП?
У меня сейчас просто последовательно емкость 10.0
Да да, я знаю, у меня ничего не получится )))

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 20748
Re: Цифровая АРУ 0...1
« Ответ #107 : Ноябрь 09, 2020, 03:52:50 pm »
Игорь, какие будут (схемные решения) рекомендации по выходу ЦАП?

Поставьте 10 мкФ, после него - 1 кОм на землю. Если Ваш ЦАП такие нагрузки выдерживает.
Частота среза - 16 Гц, Вам хватит за глаза.... lol22
Ничего невозможного нет

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #108 : Ноябрь 10, 2020, 05:46:44 pm »
Ну в общем провел еще несколько тестов.
Однозначно это глючит АЦП. При серьезном скачке идет провал. Этот провал полностью отсутствует когда со звуковой на звуковую напрямик подаешь. Смоделировал синус внутри системы - этого провала тоже нет.
Вывод можно сделать один: референсное питание ацп и мои полпитания на входе ацп  - отличаются.
Нужно и реф питание ацп и полпитание на входе ацп питать от одного источника, а моем случаи между ними есть дроссель и за дросселем емкости.
« Последнее редактирование: Ноябрь 10, 2020, 05:50:16 pm от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #109 : Ноябрь 11, 2020, 11:08:32 am »
Оставлю я пока проблему ацп. Да и нет так сильно она влияет. Есть другая проблема, питчки. Они дергаю ару и как следствие систему отката и выглядит это так:

(подан белый шум макс амплитуды)
« Последнее редактирование: Ноябрь 11, 2020, 11:10:47 am от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #110 : Ноябрь 11, 2020, 11:10:16 am »
Соответственно на каждый взлет срабатывает система ару, а потом опять откат, и так в бесконечном цикле. Туда - сюда колбасит.
Нужно окно, гистерезис
« Последнее редактирование: Ноябрь 11, 2020, 11:12:24 am от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #111 : Ноябрь 11, 2020, 11:16:16 am »
Пока действует этот вариант, он значительно лучше Лайт варианта. Полностью переработана система отката ару (через поиск пика сигнала).

float32_t max = 0.5f;

void agcDo(float32_t *buffer) {

    float32_t agcMetrTemp = 0;

    if (tim > 0)tim--; //уменьшение задержки


    for (uint16_t i = 0; i < FRAME_SIZE; i++) {
        float32_t a;
        //a = (buffer[i] < 0.0f) ? -1.0f * buffer[i] : buffer[i];// adc V
        a = fabsf(buffer[i]);


        // seach min

        if (a > 0)nowAgc = max / a; //coeff --> 1, nowAgc=чем меньше - тем сильнее загибаем pOutLms, 1 макс усиление.
        else nowAgc = max / 0.00005f;


        if (nowAgc < agcLevel) { // всплеск V
            tim = 10;//задежка отпускания
            uint16_t downIdx = i;
            uint16_t upIdx = i;
            uint16_t exit = 1;
            int direction = 0;//напрвление вниз (отрицательная синусоида)

            if (buffer[i] > 0) direction = 1;//напрвление вверх (положительная синусоида)

            while (exit) {
                exit = 0;//выходим
                if (direction) {//++
                    //going up

                    if (buffer[upIdx] <= buffer[upIdx + 1] && upIdx + 1 < FRAME_SIZE) {
                        upIdx++;
                        exit = 1;//не выходим
                    }
                    //go down

//                    if (((buffer[downIdx] >= buffer[downIdx - 1] && buffer[downIdx] > 0) || buffer[downIdx - 1] < 0) && downIdx - 1 >= 0) {//&& buffer[downIdx - 1] >= 0
                   if (buffer[downIdx - 1] >= 0 && downIdx - 1 >= 0) {//&& buffer[downIdx - 1] >= 0
                        downIdx--;
                        exit = 1;//не выходим
                    }

                } else { //--
                    //going up
                    if (buffer[upIdx] >= buffer[upIdx + 1] && upIdx + 1 < FRAME_SIZE) {
                        upIdx++;
                        exit = 1;//не выходим
                    }
                    //go down
//                    if (((buffer[downIdx] <= buffer[downIdx - 1] && buffer[downIdx] < 0) || buffer[downIdx - 1] > 0) &&  downIdx - 1 >= 0) {// && buffer[downIdx - 1] <= 0
                   if (buffer[downIdx - 1] <= 0 && downIdx - 1 >= 0) {// && buffer[downIdx - 1] <= 0
                        downIdx--;
                        exit = 1;//не выходим
                    }
                }
            }//while

            if ((upIdx > downIdx) && i > 0 && i < FRAME_SIZE - 1) {
                if (buffer[upIdx] != 0) {
                    nowAgc = max / fabsf(buffer[upIdx]);//максимальное значение
                } else nowAgc = max / max;


                for (uint16_t z = downIdx; z <= upIdx; z++) {
                    if (z < i) buffer[z] *= nowAgc / agcLevel; //там уже применен коэфф
                    else buffer[z] *= nowAgc;//применить новый коэфф
                }

                i = upIdx;
            } else {

                float32_t f = a * nowAgc;

                if (f > max) {//out
                    if (buffer[i] >= 0) buffer[i] = max;//max
                    else buffer[i] = -max;//max
                    nowAgc = 1;
                }else  buffer[i] *= nowAgc;

            }
            agcLevel = nowAgc;


        } else {//если спад V
            float32_t f = fabsf(buffer[i + 1]);


            if(tim == 0 && a < f && f >= fabsf(buffer[i + 2]) && i < FRAME_SIZE - 2 ) {
                float32_t cc = agcLevel + 0.005f;
                if ( f * cc < max ) {
                    agcLevel = cc;
                } else {
                    cc = agcLevel + 0.0005f;
                    if ( f * cc < max ) {
                        agcLevel = cc;
                    }
                }
            }
            if( a < f && f >= fabsf(buffer[i + 2]) && i < FRAME_SIZE - 2 )
                agcLevel += 0.00001f;

            if (a * agcLevel <= max)
                buffer[i] *= agcLevel;
            else {
                if (buffer[i] >= 0) buffer[i] = max;//max
                else buffer[i] = -max;//max
                agcLevel = max;
            }


        }
        if (a > agcMetrTemp) agcMetrTemp = a; //s-meter макс V
    }
    agcMetr = agcMetrTemp; //s-meter
}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #112 : Ноябрь 12, 2020, 09:04:10 am »
Всё удалил. Делаю новый алгоритм.  cr123
Да да, я знаю, у меня ничего не получится )))

Оффлайн r1tx

  • Hero Member
  • *****
  • Сообщений: 502
Re: Цифровая АРУ 0...1
« Ответ #113 : Ноябрь 12, 2020, 10:10:13 am »
Соответственно на каждый взлет срабатывает система ару, а потом опять откат, и так в бесконечном цикле. Туда - сюда колбасит.
Нужно окно, гистерезис
А скорость атаки и скорость отпускания регулируется?

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #114 : Ноябрь 12, 2020, 10:16:38 am »
Скорость атаки понятие отсутствует, а отпускание и угол отпускания само сабой.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #115 : Ноябрь 12, 2020, 10:17:12 am »
Сейчас воюю над этим (белый шум макс уровня на входе)
фото
 с ару
и без ару
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #116 : Ноябрь 12, 2020, 10:28:11 am »
Думаю над питчиками  cr123

Да да, я знаю, у меня ничего не получится )))

Оффлайн r1tx

  • Hero Member
  • *****
  • Сообщений: 502
Re: Цифровая АРУ 0...1
« Ответ #117 : Ноябрь 12, 2020, 09:15:44 pm »
Скорость атаки в моем понимании скорость реакции на входной импульс. В компрессорах ее так называют.
И еще вы фазу сигнала рвете при регулировании? птички от разрыва фазы могут быть.
ФЧХ посмотрите Во время регулирования.
Спектр при zerospan у анализатора передний фронт при атаке на выходе АРУ какой? ...если можно конечно посмотреть на нем так...

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #118 : Ноябрь 12, 2020, 10:09:48 pm »
В цифре такого нет . В цифре сперва обрабатывается данные и только потом они воспроизводятся. Поэтому всегда задержка есть. И понятие атаки нет, либо ее можно сделать так как захочешь. Пока есть над чем подумать и сделать.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #119 : Ноябрь 12, 2020, 10:11:28 pm »
И еще вы фазу сигнала рвете при регулировании?
так об этом и речь, что я работаю со скатом целиком, а сейчас вообще с полупериодом  как раз чтобы сигнал не портить.
Да да, я знаю, у меня ничего не получится )))