Этот пример извлекает решения закрытой формы для коэффициентов частот в выход сигнале. Выходной сигнал является результатом передачи входа через аналитическую нелинейную передаточную функцию.
Этот пример использует следующие возможности Symbolic Math Toolbox™:
Расширение ряда Тейлора с помощью taylor
Чтобы мотивировать решение, мы берем простой элемент из теории схем: идеальный диод (при операции прямого смещения). Ток, I
, является выходом, который зависит экспоненциально от входов, V
. Диоды нашли применение в создании устройств, таких как миксеры и усилители, где понимание гармонической структуры выхода может быть полезно для характеристики устройства и удовлетворения спецификаций проекта.
syms Is V Vo real; I = Is*(exp(V/Vo) - 1)
I =
Если V является линейной комбинацией 2 сигналов на частотах LO и RF, нелинейная передаточная функция будет смешивать LO и RF, чтобы создать выход с содержимым в комбинациях гармонических частот: freqs = {LO, 2LO, RF, 2RF, LO-RF, LO-2RF,
Цель этого примера состоит в том, чтобы определить коэффициенты freqs
в выходе.
Входной сигнал является линейной комбинацией двух косинусоидных сигналов.
syms c1 c2 t LO RF real; input = c1*cos(LO*t) + c2*cos(RF*t)
input =
Ниже, harmCombinations
является комбинаторной комбинацией целочисленных кратных входных частот LO
и RF
. Мы ограничиваем пространство интереса, заданное 3 гармониками каждый в LO
и RF
направления.
n = 3; harmCombinations = [kron((0:n)',ones(n*2+1,1)),repmat((-n:n)',n+1,1)]; freqs = harmCombinations*[LO;RF];
Первый n
частоты являются только отрицательными гармоническими частотами и поэтому избыточны, принимая во внимание, что входной сигнал действителен.
freqs = freqs(n+1:end)
freqs =
Чтобы охватить интересующий спектр частот, серия Тейлора порядка четырех для I(V)
является достаточным.
s = taylor(I, V, 'Order', 4)
s =
Используйте комбинацию входных сигналов LO
и RF
частоты и экспресс- f
с точки зрения cos(LO*t)
и cos(RF*t)
.
f0 = subs(s, V, input); f = expand(f0)
f =
Переписать f
в терминах единичных степеней косинусов.
f = combine(f, 'sincos')
f =
Получите непостоянные, т.е. не-DC гармонические частотные условия вида cos(freq*t)
.
cosFreqs = cos(expand(freqs*t)); terms = collect(setdiff(cosFreqs', sym(1)));
Извлеките коэффициенты для всех членов гармонической частоты, включая DC.
newvars = sym('x', [1,numel(terms)]); [cx, newvarsx] = coeffs(subs(f,terms,newvars), newvars); tx = sym(zeros(1,numel(cx))); for k=1:numel(newvarsx) if newvarsx(k) ~= 1 tx(k) = terms(newvars == newvarsx(k)); else tx(k) = newvarsx(k); end end cx = simplify(cx);
Отобразите коэффициенты с помощью таблицы, T
. Использование cosFreqs
как идентификатор строки.
cosFreqs = arrayfun(@char,cosFreqs,'UniformOutput',false); Frequencies = arrayfun(@char,freqs,'UniformOutput',false); Coefficients = num2cell(zeros(size(freqs))); T = table(Frequencies,Coefficients,'RowNames',cosFreqs);
Присвоение cx
к соответствующим строкам T
соответствующий косинусоидным терминам tx
.
nonzeroCosFreqs = arrayfun(@char,tx,'UniformOutput',false).'; T(nonzeroCosFreqs,'Coefficients') = arrayfun(@char,cx,'UniformOutput',false).';
Теперь удалите имена строк, так как они избыточны.
T.Properties.RowNames = {};
Заметьте, что выражения для членов симметричны в LO и RF.
T
T=25×2 table
Frequencies Coefficients
_______________ _____________________________________________
{'0' } {'(Is*(c1^2 + c2^2))/(4*Vo^2)' }
{'RF' } {'(Is*c2*(8*Vo^2 + 2*c1^2 + c2^2))/(8*Vo^3)'}
{'2*RF' } {'(Is*c2^2)/(4*Vo^2)' }
{'3*RF' } {'(Is*c2^3)/(24*Vo^3)' }
{'LO - 3*RF' } {[ 0]}
{'LO - 2*RF' } {'(Is*c1*c2^2)/(8*Vo^3)' }
{'LO - RF' } {'(Is*c1*c2)/(2*Vo^2)' }
{'LO' } {'(Is*c1*(8*Vo^2 + c1^2 + 2*c2^2))/(8*Vo^3)'}
{'LO + RF' } {'(Is*c1*c2)/(2*Vo^2)' }
{'LO + 2*RF' } {'(Is*c1*c2^2)/(8*Vo^3)' }
{'LO + 3*RF' } {[ 0]}
{'2*LO - 3*RF'} {[ 0]}
{'2*LO - 2*RF'} {[ 0]}
{'2*LO - RF' } {'(Is*c1^2*c2)/(8*Vo^3)' }
{'2*LO' } {'(Is*c1^2)/(4*Vo^2)' }
{'2*LO + RF' } {'(Is*c1^2*c2)/(8*Vo^3)' }
⋮
Как показано ниже, форма выходного сигнала восстанавливается из коэффициентов и имеет точное соответствие с выходом.
simplify(f0 - (dot(tx,cx)))
ans =
Ниже показана конкретная нелинейная передаточная функция, проанализированная выше, во временных и частотных диапазонах для определенных значений частот и коэффициентов напряжения. Сначала извлеките данные.
sample_values = struct('c1',0.4,'c2',1,'LO',800,'RF',13600,'Vo',1,'Is',1); sample_input = subs(input,sample_values)
sample_input =
sample_output = subs(f,sample_values)
sample_output =
sample_freqs = zeros(size(tx)); for k=1:numel(tx) cosTerm = subs(tx(k),sample_values); freq = simplify(acos(cosTerm),'IgnoreAnalyticConstraints',true)/t; sample_freqs(k) = double(freq); end sample_heights = double(subs(cx,sample_values));
Затем используйте fplot
и stem
для построения графика функций и их гармонических частот.
subplot(2,2,1); fplot(sample_input,[0,0.01]) title Input subplot(2,2,3); stem([sample_values.LO, sample_values.RF],[sample_values.c1,sample_values.c2]); title 'Input Frequencies' subplot(2,2,2); fplot(sample_output,[0,0.01]) title Output subplot(2,2,4); stem(sample_freqs,sample_heights) title 'Output Frequencies'