В этом примере извлекаются решения замкнутой формы для коэффициентов частот в выходном сигнале. Выходной сигнал является результатом прохождения входного сигнала через аналитическую нелинейную передаточную функцию.
В этом примере используются следующие возможности символьного математического Toolbox™:
Расширение серии Taylor с использованием 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 =
Получить непостоянные, т.е. не-постоянные гармонические частотные члены вида cos(freq*t).
cosFreqs = cos(expand(freqs*t)); terms = collect(setdiff(cosFreqs', sym(1)));
Извлеките коэффициенты для всех членов гармонических частот, включая постоянный ток.
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'
