Перейти к содержанию
    

Как правильно разместить корректор амплитудной характеристики

Возникла необходимость создать корректор амплитудной характеристики (АХ) ВЧ-усилителя. Для этого снимается реальная АХ усилителя, строится корректирующая характеристика (КХ), сигнал перед усилителем пропускается через корректор для внесения предыскажений. После прохождения усилителя АХ компенсируется и искажения снижаются.

Для анализа коррекции была создана модель (рисунок а) на несущей частоте. Когда предкоррекции подвергается модулированный ВЧ-сигнал s(t) (рисунок а), все отлично работает.

На практике коррекция на несущей частоте недоступна. Когда предкоррекция применяется к низкочастотному (модулирующему) сигналу (рисунок б отражает реальное построение тракта), коррекция перестает работать.

Пдскажите, куда правильно следует разместить модуль предкоррекции (ПК), чтобы заработала схема (б).

P.S. Обработка сигнала возможна только при нахождении сигнала внутри процессора (граница показана пунктирной линией).

x(t) - модулирующий сигнал

s(t) - модулированный ВЧ-сигнал до входа усилителя

y(t) - сигнал на выходе усилителя

i(t), q(t) - квадратурные сигналы с выхода модулятора

1560686920_.thumb.png.7ccd8f8db6b4216ea0c5cabf83a0e904.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, tankist said:

Пдскажите, куда правильно следует разместить модуль предкоррекции (ПК), чтобы заработала схема (б).

имхо, вопрос не правильно поставлен. Он должен звучать как то так: "как правильно обучить предкорректор в такой схеме"). А бы на компе завернул и что нить адаптивное замутил. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, des00 said:

имхо, вопрос не правильно поставлен. Он должен звучать как то так: "как правильно обучить предкорректор в такой схеме"). А бы на компе завернул и что нить адаптивное замутил.

Интересно что в Matlab модели каналов работают на низкой частоте, правда данные там везде комплексные.

Т.е. как-то авторы каналов в Matlab преобразорвали импирические ВЧ данные в НЧ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, _4afc_ said:

Интересно что в Matlab модели каналов работают на низкой частоте, правда данные там везде комплексные.

Т.е. как-то авторы каналов в Matlab преобразорвали импирические ВЧ данные в НЧ.

Да думаю что есть алгоритм, не интересовался, но быть такой должен. Там же по идее линейный перенос АЧХ, в квадратурный домен. ТС скорее всего просто взял АЧХ по огибающей и просто поставил его на оба компонентных канала. Естественно это работать не будет. Тут надо какое то отображение и синтез комплексного фильтра. Ну или адаптивый эквалайзер) 

ЗЫ. А вообще, если есть запас по оверсемплингу, то закинуть сигнал на Fs/4 на мультиплексорах, сделав ПЧ, там сформировать нужную АЧХ, потом опустить обратно на мультиплексорах и вперед. По идее должно сработать) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понимаю, почему вы говорите про АЧХ, если в вопросе речь идет про АХ. Это СОВЕРШЕННО разные вещи.

Вопрос не про то, как сделать алгоритм - он уже сделан. Вопрос о том, как его адаптировать для квадратурных составляющих.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, tankist said:

Не понимаю, почему вы говорите про АЧХ, если в вопросе речь идет про АХ. Это СОВЕРШЕННО разные вещи.

ааа, чорт, точно, речь же про DPD.

15 minutes ago, tankist said:

Вопрос не про то, как сделать алгоритм - он уже сделан. Вопрос о том, как его адаптировать для квадратурных составляющих.

Ну тогда покажите как вы его применяете для квадратур, что он у вас не работает ну и параметры AFE тракта ЦАП тоже не помешает привести. Вдруг вы отрезаете всё что добавляете)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

%% Исходные данные
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;

В архиве приложены файлы для запуска кода

result.thumb.png.07fd038a7bc3faaf865278890ac700cf.png

На рисунке отображен результат работы программы. Результат (уровень боковых лепестков, синий) должен стремиться к референсу (красный), но по факту ничуть не лучше результата вообще без коррекции (зеленый).

В нижней боковой полосе на частотах 3,498 МГц и 3,499 МГц расположен полезный двухтоновый сигнал. Шкала на рисунке в Гц (по горизонтали), дБm (по вертикали).

Необходимый результат: разница уровней полезного сигнала и максимальной гармоники > 40 дБ.

 

media.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote
i_cor = useCharacteristic(i, Kcorr);
q_cor = useCharacteristic(q, Kcorr);

 

ИМХО применять коррекцию надо не к квадратурам, а к комплексной огибающей. Т.е. уйти в полярные координаты, провести коррекцию АМ/АМ, АМ/PM, потом обратно в квадратуры и на модулятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы имеете в виду высчитать модуль, провести его коррекцию, а потом обратно перевести в арифметический вид?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

информация в выложенных файлах и выложенный код позволяют построить и посмотреть АХ и КХ

plot(K);
hold on;
plot(Kcorr);
hold off;
grid on;
legend K K\_corr;

image.thumb.png.939aebcd7efa198d25c977e8b3300d26.png

если внимательно приглядеться к АХ,

image.thumb.png.498cd9800cf5b48ae143be9c3f0b5576.png

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

у КХ есть участок,

image.thumb.png.12685c4b21e6e0d0a488e37f83c058fd.pngimage.thumb.png.25b416c2ee65ec8e2cbb34eea88c5bac.png

который, как будто бы вносит только больше искажений в сигнал, чем что-то корректирует. На сколько хорошо такая КХ работала на модулированном ВЧ-сигнале?

 

в функции, вычисляющей прохождение сигнала через АХ и КХ (useCharacteristic), после поиска значений по таблице, результат ограничивается значениями [32767] и [-32768]

plot(K);
hold on;
plot(Kcorr);
plot(xlim,[32767,32767]);
hold off;
grid on;
legend K K\_corr limit;

если посмотреть этот предел на графиках,

image.thumb.png.5e73ff98a1c582275de61602e1a24d92.png

то можно увидеть что тактая функция (useCharacteristic) будет ограничивать значения у сигналов с полным размахом (в тесте используется именно сигнал с полным размахом), что вносит дополнительные искажения в сигнал

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, tankist said:

Вы имеете в виду высчитать модуль, провести его коррекцию, а потом обратно перевести в арифметический вид?

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

Добавлю к @stealthisname а как модифицировать ваш скрипт, что бы увидеть коррекцию на ПЧ? Сделал так, но чувствую что, что-то не то.

y_dpd = useCharacteristic(int16(y_id), Kcorr);
y_cor = useCharacteristic(int16(y_dpd), K);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, stealthisname said:

можно увидеть что тактая функция (useCharacteristic) будет ограничивать значения у сигналов с полным размахом

Я понимаю, что усилитель ограничивает сигнал. Собственно, характеристика снята с реального усилителя. И поэтому я хочу рассмотреть, как будет работать алгоритм в самых плохих ситуациях.

10 hours ago, stealthisname said:

у КХ есть участок

Я думаю, что на данном этапе на эти "мелочи" можно закрыть глаза. Попробую разобраться потом. Сейчас мне важнее вставить корректор правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, des00 said:

Сделал так, но чувствую что, что-то не то

Все правильно сделали. На самом деле, выигрыш хоть и получается, но небольшой. В первой модели выигрыш был 9 дБ. Разница между полезной и наибольшей побочной составляющей достигла 30 дБ, что со скрипом, но входило в допустимые рамки. В этой модели я взял наихудшие условия, возможно, это повлияло и на конечный выигрыш.

К сожалению, после коррекции модуля квадратур результат стал еще хуже.

result_02.thumb.png.ebe1082e982acf63a41533c387386bdc.png

В скрипте вместо блока "%% Предкоррекция" вставил блок

%% Предкоррекция модуля амплитуды
% Переводим квадратуры в комплексные числа
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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

tankist

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 minutes ago, petrov said:

tankist

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

Спасибо за совет, но мне бы разобраться со статическим компенсатором.

И да, симулинка нет.

Изменено пользователем tankist

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...