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

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

Оффлайн VA7KL

  • Administrator
  • *****
  • Сообщений: 142
  • ex-VA7FFT
Re: Цифровая АРУ 0...1
« Ответ #180 : Декабрь 02, 2020, 11:14:35 am »
по скату правому+ и смежному ему  левому
я строил правильную синусоиду между отрицательным и положительным экстремумами, пренебрегая где там уровень нуля. Получалось очень гладко, потому что сшивалось там где производная ноль - в плагине Адоба Аудишена. Сейчас надо бы в СТМ32 попробовать...

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

  • Administrator
  • *****
  • Сообщений: 20749
Re: Цифровая АРУ 0...1
« Ответ #181 : Декабрь 02, 2020, 11:30:30 am »
сшивалось там где производная ноль

Кстати, правильный ход - минимум мусора на сшивке. А при переходе через ноль производная максимальна... 1yep 1999 lol22
« Последнее редактирование: Декабрь 02, 2020, 11:34:26 am от Игорь 2 »
Ничего невозможного нет

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #182 : Декабрь 02, 2020, 12:06:44 pm »
Очень интересно. Простым нарастанием коэффициента не получилось  всё равно ломается синус.
Там блин скаты по нарастание у полупериода не симметричны. А идея просто заново нарисовать скат осень хорошая. Математику Не подкинете  ?  cr123
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #183 : Декабрь 02, 2020, 01:54:15 pm »
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;
  }
       
« Последнее редактирование: Декабрь 02, 2020, 02:07:15 pm от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #184 : Декабрь 02, 2020, 03:19:02 pm »
Пока так ....
Один скат выровнял, но еще что то есть ..
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #185 : Декабрь 02, 2020, 05:02:40 pm »
О! восстановил

На фотках то один фронт восстанавливается, то другой. (все в центре)
Та просто 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;
                        }
« Последнее редактирование: Декабрь 02, 2020, 05:05:30 pm от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #186 : Декабрь 02, 2020, 05:16:47 pm »
Вот так музыка.... уже диких всплесков нету  lol22
маленький успех.
Да да, я знаю, у меня ничего не получится )))

Оффлайн VA7KL

  • Administrator
  • *****
  • Сообщений: 142
  • ex-VA7FFT
Re: Цифровая АРУ 0...1
« Ответ #187 : Декабрь 02, 2020, 09:36:15 pm »
Математику Не подкинете
на самом деле если подвигать точку пересечения нуля вправо/влево, там обязательно существует точка где обе синусоиды (разного периода!) сшиваются гладко - с равными односторонними производными. Поскриплю мозгами вспомню. А пока более простой вариант: как провести косинусоиду если известны оба соседних экстремума и время между ними. Когда оба экстремума одинаковы а = в то вырождается в обычный косинус.
« Последнее редактирование: Декабрь 02, 2020, 09:45:53 pm от VA7FFT »

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #188 : Декабрь 02, 2020, 09:47:56 pm »
Спасибо, вы тоже самое написали что и я до чего допер.  lol22
Сшивается идеально!
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #189 : Декабрь 02, 2020, 09:51:41 pm »
Сейчас сижу думаю....у меня один скат восстанавливает синус, а потом всё... а надо бы еще следующий тоже причесать, но не могу условие подобрать по которому будет запускаться алгоритм именно "этого" ската, ведь АРУ уже отработало и следующий пик не является новым максимумом.
Короче надо поспать с этой мыслью...хотя направление я уже понял куда топать.
Да да, я знаю, у меня ничего не получится )))

Оффлайн VA7KL

  • Administrator
  • *****
  • Сообщений: 142
  • ex-VA7FFT
Re: Цифровая АРУ 0...1
« Ответ #190 : Декабрь 02, 2020, 09:52:13 pm »
по моему опыту, ловить точку пересечения нуля бесполезно - там шум всегда вырубает любой навороченный алгоритм. А экстремумы почти  всегда торчат из шума и легко определяются. Их достаточно чтобы восстановить любую кривую между ними. Даже не синусоиду а степенные функции проводил - на слух (мой) почти без разницы.

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #191 : Декабрь 02, 2020, 09:57:34 pm »
Да так и есть. Так и сделано.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #192 : Декабрь 02, 2020, 09:58:49 pm »
Вот восстановленный скат
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

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

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Цифровая АРУ 0...1
« Ответ #194 : Декабрь 02, 2020, 10:27:56 pm »
О! я ваааще огонь алгоритм придумал! Там вообще без разницы шум не шум.

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

Вот так работать будет !
Да да, я знаю, у меня ничего не получится )))