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

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

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

VA7KLVA7KL
Сообщений: 158
2 декабря 2020 г. в 11:14#181
Цитата: ra0ahc
по скату правому+ и смежному ему левому

я строил правильную синусоиду между отрицательным и положительным экстремумами, пренебрегая где там уровень нуля. Получалось очень гладко, потому что сшивалось там где производная ноль - в плагине Адоба Аудишена. Сейчас надо бы в СТМ32 попробовать...
Игорь 2
Сообщений: 21288
2 декабря 2020 г. в 11:30#182
Цитата: VA7FFT
сшивалось там где производная ноль


Кстати, правильный ход - минимум мусора на сшивке. А при переходе через ноль производная максимальна...
ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 12:06#183
Очень интересно. Простым нарастанием коэффициента не получилось всё равно ломается синус.
Там блин скаты по нарастание у полупериода не симметричны. А идея просто заново нарисовать скат осень хорошая. Математику Не подкинете ?
ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 01:54#184
t= 2*(pikIdxPlus-pikIdxMinus)
-------------------------------
24000

f=1/t ;// частота синуса , который надо нарисовать

амплитуды не симметричные.

А=|pikVPlus| + |pikVMinus| ; //amplituda sin

//смещение амплитуды относительно 0 вверх вниз, потом просто добавить к результату
Smeschenie= (|pikVPlus| - |pikVMinus|)/2 ;

рисовать синус надо будет от PI/2 до 3PI/4 те от -1 до 1 фаза

Шаг
delta = (float32_t) ((2 * 3.14159265359 *f) / 24000);

float32_t phase=PI/2;
for (int i = pikIdxPlus; i <= pikIdxMinus; i += 1) {
saiTxBank[saiTxBankNowNumber][ i ] =A * arm_sin_f32(phase)+Smeschenie;
phase += delta;
}

ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 03:19#185
Пока так ....
Один скат выровнял, но еще что то есть ..


ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 05:02#186
О! восстановил

На фотках то один фронт восстанавливается, то другой. (все в центре)
Та просто 4 вариант прихода полуволн:
#define mP 1 //minus PLUS
#define pM 2 //plus MINUS
#define Mp 3 //MINUS plus
#define Pm 4 //PLUS minus

Два я сделал остались еще 2 самых сложных

..один из вариантов
if (variant == mP) {
if (z < uPikIxxMinus) {
buffer[z] *= locPik;
}
if (z >= uPikIxxMinus && z<=uPikIxxPlus ) {
float32_t rate = 24000.0f;
float32_t t = 2.0f * (uPikIxxPlus - uPikIxxMinus -0.0f) / rate;
float32_t freqS = 1.0f / t;
float32_t Am = (uPikVPlus*locNowAgc + uPikVMinus*locPik)/2.0f;
float32_t Sm = (uPikVPlus*locNowAgc - uPikVMinus*locPik) / 2.0f;
float32_t deltaFreq = (2.0f * PI * freqS) / rate;
float32_t phase = PI / 2.0f;
uint16_t ii;
for ( ii = uPikIxxMinus; ii <= uPikIxxPlus; ii += 1) {
buffer[ii] = -Am * arm_sin_f32(phase) - Sm;
phase += deltaFreq;
}
z=ii;
}
if (z>uPikIxxPlus) {//пиковая полуволна
buffer[z] *= locNowAgc;
}


ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 05:16#187
Вот так музыка.... уже диких всплесков нету
маленький успех.


VA7KLVA7KL
Сообщений: 158
2 декабря 2020 г. в 09:36#188
Математику Не подкинете
на самом деле если подвигать точку пересечения нуля вправо/влево, там обязательно существует точка где обе синусоиды (разного периода!) сшиваются гладко - с равными односторонними производными. Поскриплю мозгами вспомню. А пока более простой вариант: как провести косинусоиду если известны оба соседних экстремума и время между ними. Когда оба экстремума одинаковы а = в то вырождается в обычный косинус.


ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 09:47#189
Спасибо, вы тоже самое написали что и я до чего допер.
Сшивается идеально!
ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 09:51#190
Сейчас сижу думаю....у меня один скат восстанавливает синус, а потом всё... а надо бы еще следующий тоже причесать, но не могу условие подобрать по которому будет запускаться алгоритм именно "этого" ската, ведь АРУ уже отработало и следующий пик не является новым максимумом.
Короче надо поспать с этой мыслью...хотя направление я уже понял куда топать.
VA7KLVA7KL
Сообщений: 158
2 декабря 2020 г. в 09:52#191
по моему опыту, ловить точку пересечения нуля бесполезно - там шум всегда вырубает любой навороченный алгоритм. А экстремумы почти всегда торчат из шума и легко определяются. Их достаточно чтобы восстановить любую кривую между ними. Даже не синусоиду а степенные функции проводил - на слух (мой) почти без разницы.
ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 09:57#192
Да так и есть. Так и сделано.
ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 09:58#193
Вот восстановленный скат


ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 10:12#194
Если завтра время будет переделаю весь алгоритм в очередной раз.
Направление однозначно правильное.
Я сейчас прыгаю по полному периоду, а завтра попробую скакать только от пика до пика.
ra0ahcra0ahc
Сообщений: 4868
2 декабря 2020 г. в 10:27#195
О! я ваааще огонь алгоритм придумал! Там вообще без разницы шум не шум.

...берем два полупериода (включая шум внутри, который не пересекает 0). Ищем Максимум. И если надо занижать - занижаем полностью полупериод и бросаем его. Смотрим следующий полупериод...если он опять требует занижения - занижаем и восстанавливаем левый скат. Потом опять берем полупериод и его не надо уже занижать, то просто восстанавливаем опять левый скат. И так далее
Особенность этого подхода в том что нужно искать два ближайших к краю пика, и пофиг что между ними.

Вот так работать будет !