exponenta event banner

Гармонический анализ выходного сигнала передаточной функции

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

В этом примере используются следующие возможности символьного математического Toolbox™:

Мотивация

Для мотивации решения берем простой элемент из теории схем: идеальный диод (в операции прямого смещения). Текущий, I, - выходной сигнал, экспоненциально зависящий от входного сигнала, V. Диоды нашли применение при создании таких устройств, как смесители и усилители, где понимание гармонической структуры выходного сигнала может быть полезным при характеристике устройства и при выполнении проектных спецификаций.

syms Is V Vo real;
I = Is*(exp(V/Vo) - 1)
I = IseV/Vo-1Is*(exp(V/Vo) - 1)

Если 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 = c1cos(LOt)+c2cos(RFt)c1*cos(LO*t) + c2*cos(RF*t)

Определение пространства комбинаций гармонических частот

Ниже, 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 = 

(0RF2RF3RFLO-3RFLO-2RFLO-RFLOLO+RFLO+2RFLO+3RF2LO-3RF2LO-2RF2LO-RF2LO2LO+RF2LO+2RF2LO+3RF3LO-3RF3LO-2RF3LO-RF3LO3LO+RF3LO+2RF3LO+3RF)[sym(0); RF; 2*RF; 3*RF; LO - 3*RF; LO - 2*RF; LO - RF; LO; LO + RF; LO + 2*RF; LO + 3*RF; 2*LO - 3*RF; 2*LO - 2*RF; 2*LO - RF; 2*LO; 2*LO + RF; 2*LO + 2*RF; 2*LO + 3*RF; 3*LO - 3*RF; 3*LO - 2*RF; 3*LO - RF; 3*LO; 3*LO + RF; 3*LO + 2*RF; 3*LO + 3*RF]

Расширение Тейлора

Чтобы охватить интересующий частотный спектр, серия Тейлора порядка четырех для I(V) достаточно.

s = taylor(I, V, 'Order', 4)
s = 

IsV22Vo2+IsV36Vo3+IsVVo(Is*V^2)/(2*Vo^2) + (Is*V^3)/(6*Vo^3) + (Is*V)/Vo

Используйте комбинацию входных сигналов LO и RF частоты и экспресс f в терминах cos(LO*t) и cos(RF*t).

f0 = subs(s, V, input);
f = expand(f0)
f = 

Isc12σ22Vo2+Isc13cos(LOt)36Vo3+Isc22σ12Vo2+Isc23cos(RFt)36Vo3+Isc1cos(LOt)Vo+Isc2cos(RFt)Vo+Isc1c2cos(LOt)cos(RFt)Vo2+Isc1c22cos(LOt)σ12Vo3+Isc12c2σ2cos(RFt)2Vo3where  σ1=cos(RFt)2  σ2=cos(LOt)2(Is*c1^2*cos(LO*t)^2)/(2*Vo^2) + (Is*c1^3*cos(LO*t)^3)/(6*Vo^3) + (Is*c2^2*cos(RF*t)^2)/(2*Vo^2) + (Is*c2^3*cos(RF*t)^3)/(6*Vo^3) + (Is*c1*cos(LO*t))/Vo + (Is*c2*cos(RF*t))/Vo + (Is*c1*c2*cos(LO*t)*cos(RF*t))/Vo^2 + (Is*c1*c2^2*cos(LO*t)*cos(RF*t)^2)/(2*Vo^3) + (Is*c1^2*c2*cos(LO*t)^2*cos(RF*t))/(2*Vo^3)

Переписать f в терминах единичных степеней косинусов.

f = combine(f, 'sincos')
f = 

Isc124Vo2+Isc224Vo2+Isc1cos(LOt)Vo+Isc2cos(RFt)Vo+Isc12cos(2LOt)4Vo2+Isc13cos(LOt)8Vo3+Isc13cos(3LOt)24Vo3+Isc22cos(2RFt)4Vo2+Isc23cos(RFt)8Vo3+Isc23cos(3RFt)24Vo3+Isc1c22cos(LOt)4Vo3+Isc12c2cos(RFt)4Vo3+Isc1c2cos(LOt+RFt)2Vo2+Isc1c2cos(LOt-RFt)2Vo2+Isc1c22cos(LOt-2RFt)8Vo3+Isc1c22cos(LOt+2RFt)8Vo3+Isc12c2cos(2LOt+RFt)8Vo3+Isc12c2cos(2LOt-RFt)8Vo3(Is*c1^2)/(4*Vo^2) + (Is*c2^2)/(4*Vo^2) + (Is*c1*cos(LO*t))/Vo + (Is*c2*cos(RF*t))/Vo + (Is*c1^2*cos(2*LO*t))/(4*Vo^2) + (Is*c1^3*cos(LO*t))/(8*Vo^3) + (Is*c1^3*cos(3*LO*t))/(24*Vo^3) + (Is*c2^2*cos(2*RF*t))/(4*Vo^2) + (Is*c2^3*cos(RF*t))/(8*Vo^3) + (Is*c2^3*cos(3*RF*t))/(24*Vo^3) + (Is*c1*c2^2*cos(LO*t))/(4*Vo^3) + (Is*c1^2*c2*cos(RF*t))/(4*Vo^3) + (Is*c1*c2*cos(LO*t + RF*t))/(2*Vo^2) + (Is*c1*c2*cos(LO*t - RF*t))/(2*Vo^2) + (Is*c1*c2^2*cos(LO*t - 2*RF*t))/(8*Vo^3) + (Is*c1*c2^2*cos(LO*t + 2*RF*t))/(8*Vo^3) + (Is*c1^2*c2*cos(2*LO*t + RF*t))/(8*Vo^3) + (Is*c1^2*c2*cos(2*LO*t - RF*t))/(8*Vo^3)

Извлечение и отображение коэффициентов

Получить непостоянные, т.е. не-постоянные гармонические частотные члены вида 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 = 0sym(0)

Печать нелинейного переноса

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

sample_values = struct('c1',0.4,'c2',1,'LO',800,'RF',13600,'Vo',1,'Is',1);
sample_input = subs(input,sample_values)
sample_input = 

2cos(800t)5+cos(13600t)(2*cos(800*t))/5 + cos(13600*t)

sample_output = subs(f,sample_values)
sample_output = 

127cos(800t)250+cos(1600t)25+cos(2400t)375+cos(12000t)50+cos(12800t)5+233cos(13600t)200+cos(14400t)5+cos(15200t)50+cos(26400t)20+cos(27200t)4+cos(28000t)20+cos(40800t)24+29100(127*cos(800*t))/250 + cos(1600*t)/25 + cos(2400*t)/375 + cos(12000*t)/50 + cos(12800*t)/5 + (233*cos(13600*t))/200 + cos(14400*t)/5 + cos(15200*t)/50 + cos(26400*t)/20 + cos(27200*t)/4 + cos(28000*t)/20 + cos(40800*t)/24 + sym(29/100)

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'

Figure contains 4 axes. Axes 1 with title Input contains an object of type functionline. Axes 2 with title Input Frequencies contains an object of type stem. Axes 3 with title Output contains an object of type functionline. Axes 4 with title Output Frequencies contains an object of type stem.