tankist 0 19 июня, 2023 Опубликовано 19 июня, 2023 · Жалоба Возникла необходимость создать корректор амплитудной характеристики (АХ) ВЧ-усилителя. Для этого снимается реальная АХ усилителя, строится корректирующая характеристика (КХ), сигнал перед усилителем пропускается через корректор для внесения предыскажений. После прохождения усилителя АХ компенсируется и искажения снижаются. Для анализа коррекции была создана модель (рисунок а) на несущей частоте. Когда предкоррекции подвергается модулированный ВЧ-сигнал s(t) (рисунок а), все отлично работает. На практике коррекция на несущей частоте недоступна. Когда предкоррекция применяется к низкочастотному (модулирующему) сигналу (рисунок б отражает реальное построение тракта), коррекция перестает работать. Пдскажите, куда правильно следует разместить модуль предкоррекции (ПК), чтобы заработала схема (б). P.S. Обработка сигнала возможна только при нахождении сигнала внутри процессора (граница показана пунктирной линией). x(t) - модулирующий сигнал s(t) - модулированный ВЧ-сигнал до входа усилителя y(t) - сигнал на выходе усилителя i(t), q(t) - квадратурные сигналы с выхода модулятора Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 июня, 2023 Опубликовано 19 июня, 2023 · Жалоба 6 minutes ago, tankist said: Пдскажите, куда правильно следует разместить модуль предкоррекции (ПК), чтобы заработала схема (б). имхо, вопрос не правильно поставлен. Он должен звучать как то так: "как правильно обучить предкорректор в такой схеме"). А бы на компе завернул и что нить адаптивное замутил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 19 июня, 2023 Опубликовано 19 июня, 2023 · Жалоба 1 hour ago, des00 said: имхо, вопрос не правильно поставлен. Он должен звучать как то так: "как правильно обучить предкорректор в такой схеме"). А бы на компе завернул и что нить адаптивное замутил. Интересно что в Matlab модели каналов работают на низкой частоте, правда данные там везде комплексные. Т.е. как-то авторы каналов в Matlab преобразорвали импирические ВЧ данные в НЧ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 июня, 2023 Опубликовано 19 июня, 2023 · Жалоба 22 minutes ago, _4afc_ said: Интересно что в Matlab модели каналов работают на низкой частоте, правда данные там везде комплексные. Т.е. как-то авторы каналов в Matlab преобразорвали импирические ВЧ данные в НЧ. Да думаю что есть алгоритм, не интересовался, но быть такой должен. Там же по идее линейный перенос АЧХ, в квадратурный домен. ТС скорее всего просто взял АЧХ по огибающей и просто поставил его на оба компонентных канала. Естественно это работать не будет. Тут надо какое то отображение и синтез комплексного фильтра. Ну или адаптивый эквалайзер) ЗЫ. А вообще, если есть запас по оверсемплингу, то закинуть сигнал на Fs/4 на мультиплексорах, сделав ПЧ, там сформировать нужную АЧХ, потом опустить обратно на мультиплексорах и вперед. По идее должно сработать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 20 июня, 2023 Опубликовано 20 июня, 2023 · Жалоба Не понимаю, почему вы говорите про АЧХ, если в вопросе речь идет про АХ. Это СОВЕРШЕННО разные вещи. Вопрос не про то, как сделать алгоритм - он уже сделан. Вопрос о том, как его адаптировать для квадратурных составляющих. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 июня, 2023 Опубликовано 20 июня, 2023 · Жалоба 15 minutes ago, tankist said: Не понимаю, почему вы говорите про АЧХ, если в вопросе речь идет про АХ. Это СОВЕРШЕННО разные вещи. ааа, чорт, точно, речь же про DPD. 15 minutes ago, tankist said: Вопрос не про то, как сделать алгоритм - он уже сделан. Вопрос о том, как его адаптировать для квадратурных составляющих. Ну тогда покажите как вы его применяете для квадратур, что он у вас не работает ну и параметры AFE тракта ЦАП тоже не помешает привести. Вдруг вы отрезаете всё что добавляете) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 20 июня, 2023 Опубликовано 20 июня, 2023 · Жалоба %% Исходные данные fs = 30e6; % Частота дискретизации, Гц fc = 3.5e6; % Частота ВЧ несущей, Гц fc1 = 1e3; % Частота 1-ого модулирующего тона, Гц fc2 = 2e3; % Частота 2-ого модулирующего тона, Гц dur = 0.01; % Длительность сигнала, с AmpMax = 32767; % Амплитуда сигнала %% Загружаем файлы % Загружаем реальную передаточную характеристику усилителя K = importdata("media/real_corr_big.txt"); % Загружаем рассчитанную корректирующую характеристику Kcorr = importdata("media/generatedPredcorrection.txt"); Kcorr = Kcorr'; %% Генерируем испытательный двухтоновый сигнал % Создаем шкалу времени t = 0:1/fs:dur - 1/fs; % Генерируем НЧ тона x1 = AmpMax * sin(2*pi*fc1*t); x2 = AmpMax * sin(2*pi*fc2*t); % Генерируем суммарный испытательный двухтоновый сигнал x = (x1 + x2) / 2; %% SSB-модуляция i = int16(x); q = int16(imag(hilbert(x))); %% Предкоррекция % Корректируем каждую квадратуру по отдельности i_cor = useCharacteristic(i, Kcorr); q_cor = useCharacteristic(q, Kcorr); %% Квадратурная модуляция % Сигналы гетеродина x_sin = AmpMax * sin(2*pi*fc*t); x_cos = AmpMax * cos(2*pi*fc*t); % Собственно квадратурная модуляция temp1 = int32(i_cor) .* int32(x_cos); temp2 = int32(q_cor) .* int32(x_sin); y = (temp1 + temp2) / 32768; %% Прохождение сигнала через усилитель y_um = useCharacteristic(int16(y), K); %% Генерируем референсную идеальную характеристику y_id = (int32(i) .* int32(x_cos) + int32(q) .* int32(x_sin)) / 32768; %% Генерируем сигнал вообще без коррекции для сравнения y_nonecor = useCharacteristic(int16(y_id), K); %% Отображение результатов hold on; showSpeccy(y_nonecor, fs, fc, 20e3, true, 'g', 1000); showSpeccy(y_um, fs, fc, 20e3, true, 'b', 1000); showSpeccy(y_id, fs, fc, 20e3, true, 'r', 1000); legend('Без коррекции','С коррекцией квадратур', 'Идеальный (референсный)'); hold off; В архиве приложены файлы для запуска кода На рисунке отображен результат работы программы. Результат (уровень боковых лепестков, синий) должен стремиться к референсу (красный), но по факту ничуть не лучше результата вообще без коррекции (зеленый). В нижней боковой полосе на частотах 3,498 МГц и 3,499 МГц расположен полезный двухтоновый сигнал. Шкала на рисунке в Гц (по горизонтали), дБm (по вертикали). Необходимый результат: разница уровней полезного сигнала и максимальной гармоники > 40 дБ. media.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 июня, 2023 Опубликовано 20 июня, 2023 · Жалоба Quote i_cor = useCharacteristic(i, Kcorr); q_cor = useCharacteristic(q, Kcorr); ИМХО применять коррекцию надо не к квадратурам, а к комплексной огибающей. Т.е. уйти в полярные координаты, провести коррекцию АМ/АМ, АМ/PM, потом обратно в квадратуры и на модулятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 20 июня, 2023 Опубликовано 20 июня, 2023 · Жалоба Вы имеете в виду высчитать модуль, провести его коррекцию, а потом обратно перевести в арифметический вид? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stealthisname 7 20 июня, 2023 Опубликовано 20 июня, 2023 · Жалоба информация в выложенных файлах и выложенный код позволяют построить и посмотреть АХ и КХ plot(K); hold on; plot(Kcorr); hold off; grid on; legend K K\_corr; если внимательно приглядеться к АХ, то можно увидеть участки, которые действительно не просто скомпенсировать предыскажением, так как для подобной функции не существует однозначной обратной функции у КХ есть участок, который, как будто бы вносит только больше искажений в сигнал, чем что-то корректирует. На сколько хорошо такая КХ работала на модулированном ВЧ-сигнале? в функции, вычисляющей прохождение сигнала через АХ и КХ (useCharacteristic), после поиска значений по таблице, результат ограничивается значениями [32767] и [-32768] plot(K); hold on; plot(Kcorr); plot(xlim,[32767,32767]); hold off; grid on; legend K K\_corr limit; если посмотреть этот предел на графиках, то можно увидеть что тактая функция (useCharacteristic) будет ограничивать значения у сигналов с полным размахом (в тесте используется именно сигнал с полным размахом), что вносит дополнительные искажения в сигнал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 21 июня, 2023 Опубликовано 21 июня, 2023 · Жалоба 18 hours ago, tankist said: Вы имеете в виду высчитать модуль, провести его коррекцию, а потом обратно перевести в арифметический вид? да, ведь когда вы делаете коррекцию на ПЧ, вы применяете это к огибающей сигнала. Так и тут применять надо к ней. Добавлю к @stealthisname а как модифицировать ваш скрипт, что бы увидеть коррекцию на ПЧ? Сделал так, но чувствую что, что-то не то. y_dpd = useCharacteristic(int16(y_id), Kcorr); y_cor = useCharacteristic(int16(y_dpd), K); Ну и еще момент, коррекция УМ по вашему полиному, она валидна только в одной рабочей точке этого усилитлея. Чтобы корректно перенести ее на квадратуры, надо как то эту рабочую точку согласовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 21 июня, 2023 Опубликовано 21 июня, 2023 · Жалоба 10 hours ago, stealthisname said: можно увидеть что тактая функция (useCharacteristic) будет ограничивать значения у сигналов с полным размахом Я понимаю, что усилитель ограничивает сигнал. Собственно, характеристика снята с реального усилителя. И поэтому я хочу рассмотреть, как будет работать алгоритм в самых плохих ситуациях. 10 hours ago, stealthisname said: у КХ есть участок Я думаю, что на данном этапе на эти "мелочи" можно закрыть глаза. Попробую разобраться потом. Сейчас мне важнее вставить корректор правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 21 июня, 2023 Опубликовано 21 июня, 2023 · Жалоба 43 minutes ago, des00 said: Сделал так, но чувствую что, что-то не то Все правильно сделали. На самом деле, выигрыш хоть и получается, но небольшой. В первой модели выигрыш был 9 дБ. Разница между полезной и наибольшей побочной составляющей достигла 30 дБ, что со скрипом, но входило в допустимые рамки. В этой модели я взял наихудшие условия, возможно, это повлияло и на конечный выигрыш. К сожалению, после коррекции модуля квадратур результат стал еще хуже. В скрипте вместо блока "%% Предкоррекция" вставил блок %% Предкоррекция модуля амплитуды % Переводим квадратуры в комплексные числа z = double(complex(i, q)); % Перводим числа в геометрическое представление A = abs(z); Ph = angle(z); % Производим коррекцию модуля A_cor = double(useCharacteristic(A, Kcorr)); % Собираем числа назад z_cor = A_cor .* exp(1i*Ph); % Переводим числа в алгебраическое представление i_cor = real(z_cor); q_cor = imag(z_cor); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 7 21 июня, 2023 Опубликовано 21 июня, 2023 · Жалоба tankist Для начала в симулинке сделать простенькую модельку, нелинейность с квадратичным членом, с выхода нелинейности перносим обратно в ноль, адаптивный фильтр Вольтерра компенсирует разницу с исходным комплексным сигналом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tankist 0 21 июня, 2023 Опубликовано 21 июня, 2023 (изменено) · Жалоба 34 minutes ago, petrov said: tankist Для начала в симулинке сделать простенькую модельку, нелинейность с квадратичным членом, с выхода нелинейности перносим обратно в ноль, адаптивный фильтр Вольтерра компенсирует разницу с исходным комплексным сигналом. Спасибо за совет, но мне бы разобраться со статическим компенсатором. И да, симулинка нет. Изменено 21 июня, 2023 пользователем tankist Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться