Weaver (математика)
33858 просмотров, 25 ответов
ra0ahc — 23 сентября 2020 г. в 02:55#1
База
ra0ahc — 23 сентября 2020 г. в 03:01#2
формулы
Relayer — 23 сентября 2020 г. в 07:08#3
Так это еще у Полякова 35 лет тому назад было расписано. Или я что-то пропустил? 

ra0ahc — 23 сентября 2020 г. в 07:18#4
Может быть. Я за Поляковым не следил.
Просто, вроде все понятно и все очевидно, но вот "так" нашел только это.
Просто, вроде все понятно и все очевидно, но вот "так" нашел только это.
Игорь 2 — 23 сентября 2020 г. в 07:29#5
но вот "так" нашел только это.
Да это бред сивой кобылы. Без фазовращателя не делается. Даже искать не интересно, где там ошибка, формулы тригонометрии очевидны, кто забыл, могу скинуть...

Так это еще у Полякова 35 лет тому назад было расписано.
Не, не путайте - у Полякова НЧ фазовращатель стоит. Без него схема работать не может...
Relayer — 23 сентября 2020 г. в 07:40#6
Да это бред сивой кобылы. Без фазовращателя не делается.Игорь, я вас огорчу. Эти сивые кобылы вполне ничего так себе работают. Как в аналоге так и в цифре. Вот я пару месяцев назад на ADAU1761 делал Уивера - нет фазовращателей по НЧ. Совсем. И работает зараза.
Не, не путайте - у Полякова НЧ фазовращатель стоит. Без него схема работать не может.Это в классическом фазовом методе нужен фазовращатель как по ВЧ так и по НЧ. А Уивер - это фазо-фильтровый метод. Тут нужен крутой фильтр, а фазовращатель не нужен
Качайте Полякова http://publ.lib.ru/ARCHIVES/P/POLYAKOV_Vladimir_Timofeevich/Polyakov_V.T._Transivery_pryamogo_preobrazovaniya.(1984).[doc-ocr].zip и читайте 5ю главу с 13й страницы: "5. ФАЗОФИЛЬТРОВЫЙ ТРАНСИВЕР ПРЯМОГО ПРЕОБРАЗОВАНИЯ"
r1tx — 23 сентября 2020 г. в 07:41#7
где бред ? на первом рисунке уивер классический вроде.
r1tx — 23 сентября 2020 г. в 07:43#8
в поляковской книжке был.
Игорь 2 — 23 сентября 2020 г. в 09:24#9
Тут нужен крутой фильтр
Возможно, на фильтры я внимание и не обратил, у меня вся арифметика под смесители написана с отсечкой верхней боковушки - см. картинку.
Гляну на досуге...

Игорь 2 — 23 сентября 2020 г. в 09:45#10
Блин, да там гетеродин в середине частотного диапазона сигнала ставится, вспомнил теперь.

Всерьёз почему-то никогда подобное не воспринимал, почему - уже и не вспомню, но, наверное, неспроста.
Везде чисто фазовый метод был, у меня в том же маскираторе куча однополосных формирователей/деформирователей стояла...

Всерьёз почему-то никогда подобное не воспринимал, почему - уже и не вспомню, но, наверное, неспроста.
Везде чисто фазовый метод был, у меня в том же маскираторе куча однополосных формирователей/деформирователей стояла...
r1tx — 23 сентября 2020 г. в 09:49#11
да потому что так тон по середине стоит не избавиться от него проклятого. Тот вивер с заворотом частотного спектра без переноса.
А этот на любом ультразвуке конфета. как всегда аналог дает идеи а цифра дает возможность реализовать с качеством.
А этот на любом ультразвуке конфета. как всегда аналог дает идеи а цифра дает возможность реализовать с качеством.
Relayer — 23 сентября 2020 г. в 09:57#12
там гетеродин в середине частотного диапазона сигнала ставитсяЭто он в аналоговом Уивере ставится. Потому что фильтр с крутым скатом проще сделать. А в цифре нет таких ограничений и второй гетеродин работает в области ультразвука - за пределами полосы пропускания. Но даже если делать гетеродин в полосе пропускания то в цифре он легко задавливается в ноль гребенкой режекторных IIR фильтров, что собственно я у себя и сделал. Провал в середине речевого спектра на разборчивость не влияет.
Игорь 2 — 23 сентября 2020 г. в 10:13#13
Провал в середине речевого спектра на разборчивость не влияет.
Во-во-во, вот Вы мне и напомнили, почему я эту идею сразу же отмёл - портить звук я не хотел категорически - у меня же в тракте маскирования оказывалось этих преобразователей боковушек 4 штуки последовательно...

GenaSPB — 24 сентября 2020 г. в 01:43#14
В цифровом тракте этот тон сильно за сотню децибел подавлен. И не режекторами а просто за счет идентичности трактов квадратур. Кстати целочисленка даже было бы лучше.... но теоретически. На практике правучка одинарной точности вполне.
Relayer — 24 сентября 2020 г. в 03:04#15
В цифровом тракте этот тон сильно за сотню децибел подавлен. И не режекторами а просто за счет идентичности трактов квадратур.Если первый гетеродин цифровой на фпга то да. А если он аналоговый? Тогда без режекторов никак.
GenaSPB — 24 сентября 2020 г. в 03:17#16
Да понятно. Я про fpga.
GenaSPB — 24 сентября 2020 г. в 04:14#17
Кстати, маскиратор с полностью цифровой обработкой тоже не должен свистеть.
Игорь 2 — 24 сентября 2020 г. в 05:11#18
Кстати, маскиратор с полностью цифровой обработкой тоже не должен свистеть.
У меня он был полностью аналоговый. Сто лет назад дело было...

ra0ahc — 3 октября 2020 г. в 05:39#19
ЛАБА
Смеситель
freq = 400;//сигнал герц
freqOpora = 2000;// несушка
Заполнение буферов выглядит так:
float32_t amp = 600;//амплитуда, макс 2048 для 12бит
for (int i = 0; i < FRAME_SIZE; i++) {
float32_t opora = arm_sin_f32(phaseOpora);
float32_t signal = arm_sin_f32(phase);
pOutDac[dacTxBankNawNumber][i ] = ((uint32_t) (amp + signal*opora * amp));
phase += delta;
if (phase >= pp) phase -= pp;
phaseOpora += deltaOpora;
if (phaseOpora >= pp) phaseOpora -= pp;
opora = arm_sin_f32(phaseOpora);
signal = arm_sin_f32(phase);
pOutDac[dacTxBankNawNumber][i ] |= (((uint32_t) (amp + signal*opora *amp))) << 16;
phase += delta;
if (phase >= pp) phase -= pp;
phaseOpora += deltaOpora;
if (phaseOpora >= pp) phaseOpora -= pp;
}
Смеситель
freq = 400;//сигнал герц
freqOpora = 2000;// несушка
Заполнение буферов выглядит так:
float32_t amp = 600;//амплитуда, макс 2048 для 12бит
for (int i = 0; i < FRAME_SIZE; i++) {
float32_t opora = arm_sin_f32(phaseOpora);
float32_t signal = arm_sin_f32(phase);
pOutDac[dacTxBankNawNumber][i ] = ((uint32_t) (amp + signal*opora * amp));
phase += delta;
if (phase >= pp) phase -= pp;
phaseOpora += deltaOpora;
if (phaseOpora >= pp) phaseOpora -= pp;
opora = arm_sin_f32(phaseOpora);
signal = arm_sin_f32(phase);
pOutDac[dacTxBankNawNumber][i ] |= (((uint32_t) (amp + signal*opora *amp))) << 16;
phase += delta;
if (phase >= pp) phase -= pp;
phaseOpora += deltaOpora;
if (phaseOpora >= pp) phaseOpora -= pp;
}
ra0ahc — 3 октября 2020 г. в 05:42#20
а вот тоже самое, но для сигнала 645Гц
ra0ahc — 3 октября 2020 г. в 08:28#21
После запуска FIR фильтра на 3кГц + шум
Получился на выходе цап такой сигнал
Получился на выходе цап такой сигнал
ra0ahc — 3 октября 2020 г. в 09:08#22
Интересный феномен я нашел. Не знаю что это за глюк в математике. Но вот смотрите (вопрос к математикам)
амплитуду умножаю на 10. (все числа float)
float32_t amp = 199*10;
.
.
дальше перемножаю сигналы (они тоже float) и делю на теже 10. цифра от -1 до +1
arrDac[i ] = (signal* opora)/10; //цифра от -1 до +1
дальше формирую амплитуду для цап от 0...4000
умножаю на амплитуду и смещаю на эту же амплитуду, убираю отрицательный значения.
pOutDac[dacTxBankNawNumber][y] = (uint32_t) (amp + firOutDac[i ] * amp);
И получается вот такая красивая картинка....
(все дальше 3кГц это перегруз звуковой платы, в программе работает фир фильтр со срезом 3кГц)
амплитуду умножаю на 10. (все числа float)
float32_t amp = 199*10;
.
.
дальше перемножаю сигналы (они тоже float) и делю на теже 10. цифра от -1 до +1
arrDac[i ] = (signal* opora)/10; //цифра от -1 до +1
дальше формирую амплитуду для цап от 0...4000
умножаю на амплитуду и смещаю на эту же амплитуду, убираю отрицательный значения.
pOutDac[dacTxBankNawNumber][y] = (uint32_t) (amp + firOutDac[i ] * amp);
И получается вот такая красивая картинка....
(все дальше 3кГц это перегруз звуковой платы, в программе работает фир фильтр со срезом 3кГц)
ra0ahc — 3 октября 2020 г. в 09:10#23
А теперь убираю умножения 10 и деление на 10
и получается вот такая картинка
и получается вот такая картинка
ra0ahc — 3 октября 2020 г. в 09:55#24
ачх FIR
ra0ahc — 4 октября 2020 г. в 01:14#25
Нашел причину 
Программер фигов. А всего то надо было выспаться.
Смещение амплитуды надо делать константой.
pOutDac[dacTxBankNawNumber][y ] = (uint32_t) (2048 + firOutDac[i-1] * amp);
Программер фигов. А всего то надо было выспаться.
Смещение амплитуды надо делать константой.
pOutDac[dacTxBankNawNumber][y ] = (uint32_t) (2048 + firOutDac[i-1] * amp);