Форум Радиолюбителей

Цифровая АРУ 0...1

243433 просмотров, 284 ответов — стр. 8 из 19

Игорь 2
Сообщений: 21288
8 ноября 2020 г. в 10:11#106
Я не про то. Кто формирует сигнал со ступенчатым перепадом? И зачем брать такие низкие частоты?
ra0ahcra0ahc
Сообщений: 4868
9 ноября 2020 г. в 11:31#107
По низким в основном и происходят искажения. Это связано с там , что больше точек при оцифровки. Ну или еще по каким причинам хз .

Игорь, какие будут (схемные решения) рекомендации по выходу ЦАП?
У меня сейчас просто последовательно емкость 10.0
Игорь 2
Сообщений: 21288
9 ноября 2020 г. в 03:52#108
Игорь, какие будут (схемные решения) рекомендации по выходу ЦАП?

Поставьте 10 мкФ, после него - 1 кОм на землю. Если Ваш ЦАП такие нагрузки выдерживает.
Частота среза - 16 Гц, Вам хватит за глаза....
ra0ahcra0ahc
Сообщений: 4868
10 ноября 2020 г. в 05:46#109
Ну в общем провел еще несколько тестов.
Однозначно это глючит АЦП. При серьезном скачке идет провал. Этот провал полностью отсутствует когда со звуковой на звуковую напрямик подаешь. Смоделировал синус внутри системы - этого провала тоже нет.
Вывод можно сделать один: референсное питание ацп и мои полпитания на входе ацп - отличаются.
Нужно и реф питание ацп и полпитание на входе ацп питать от одного источника, а моем случаи между ними есть дроссель и за дросселем емкости.


ra0ahcra0ahc
Сообщений: 4868
11 ноября 2020 г. в 11:08#110
Оставлю я пока проблему ацп. Да и нет так сильно она влияет. Есть другая проблема, питчки. Они дергаю ару и как следствие систему отката и выглядит это так:

(подан белый шум макс амплитуды)


ra0ahcra0ahc
Сообщений: 4868
11 ноября 2020 г. в 11:10#111
Соответственно на каждый взлет срабатывает система ару, а потом опять откат, и так в бесконечном цикле. Туда - сюда колбасит.
Нужно окно, гистерезис
ra0ahcra0ahc
Сообщений: 4868
11 ноября 2020 г. в 11:16#112
Пока действует этот вариант, он значительно лучше Лайт варианта. Полностью переработана система отката ару (через поиск пика сигнала).

Код: [Выделить]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
}
ra0ahcra0ahc
Сообщений: 4868
12 ноября 2020 г. в 09:04#113
Всё удалил. Делаю новый алгоритм.
r1tx
Сообщений: 503
12 ноября 2020 г. в 10:10#114
Соответственно на каждый взлет срабатывает система ару, а потом опять откат, и так в бесконечном цикле. Туда - сюда колбасит.
Нужно окно, гистерезис
А скорость атаки и скорость отпускания регулируется?
ra0ahcra0ahc
Сообщений: 4868
12 ноября 2020 г. в 10:16#115
Скорость атаки понятие отсутствует, а отпускание и угол отпускания само сабой.
ra0ahcra0ahc
Сообщений: 4868
12 ноября 2020 г. в 10:17#116
Сейчас воюю над этим (белый шум макс уровня на входе)
фото
с ару
и без ару


ra0ahcra0ahc
Сообщений: 4868
12 ноября 2020 г. в 10:28#117
Думаю над питчиками


r1tx
Сообщений: 503
12 ноября 2020 г. в 09:15#118
Скорость атаки в моем понимании скорость реакции на входной импульс. В компрессорах ее так называют.
И еще вы фазу сигнала рвете при регулировании? птички от разрыва фазы могут быть.
ФЧХ посмотрите Во время регулирования.
Спектр при zerospan у анализатора передний фронт при атаке на выходе АРУ какой? ...если можно конечно посмотреть на нем так...
ra0ahcra0ahc
Сообщений: 4868
12 ноября 2020 г. в 10:09#119
В цифре такого нет . В цифре сперва обрабатывается данные и только потом они воспроизводятся. Поэтому всегда задержка есть. И понятие атаки нет, либо ее можно сделать так как захочешь. Пока есть над чем подумать и сделать.
ra0ahcra0ahc
Сообщений: 4868
12 ноября 2020 г. в 10:11#120
Цитата: r1tx
И еще вы фазу сигнала рвете при регулировании?

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