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

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

Этот пример использует следующие возможности Symbolic Math Toolbox™:

Мотивация

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

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

Если V будет линейная комбинация 2 сигналов в LO частот и РФ, нелинейная передаточная функция смешает LO и РФ, чтобы создать вывод с содержимым в комбинаторных гармонических комбинациях частоты: freqs = {LO, 2LO, РФ, 2RF, LO-RF, LO-2RF...}.

Цель этого примера состоит в том, чтобы определить коэффициенты freqs в выводе.

Задайте входной сигнал

Входной сигнал является линейной комбинацией двух сигналов косинуса.

syms c1 c2 t LO RF real;
input = c1*cos(LO*t) + c2*cos(RF*t)
input = c1потому что(LOt)+c2потому что(РФt)

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

Ниже, harmCombinations является комбинаторной комбинацией целочисленных множителей входных частот LO и RF. Мы ограничиваем пробел интереса, заданного 3 гармониками каждый в направлениях RF и LO.

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 = 

(0РФ2РФ3РФLO-3РФLO-2РФLO-РФLOLO+РФLO+2РФLO+3РФ2LO-3РФ2LO-2РФ2LO-РФ2LO2LO+РФ2LO+2РФ2LO+3РФ3LO-3РФ3LO-2РФ3LO-РФ3LO3LO+РФ3LO+2РФ3LO+3РФ)

Разложение Тейлора

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

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

V22Vo2+V36Vo3+VVo

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

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

c12σ22Vo2+c13потому что(LOt)36Vo3+c22σ12Vo2+c23потому что(РФt)36Vo3+c1потому что(LOt)Vo+c2потому что(РФt)Vo+c1c2потому что(LOt)потому что(РФt)Vo2+c1c22потому что(LOt)σ12Vo3+c12c2σ2потому что(РФt)2Vo3где  σ1=потому что(РФt)2  σ2=потому что(LOt)2

Перепишите f с точки зрения одной степеней косинусов.

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

c124Vo2+c224Vo2+c1потому что(LOt)Vo+c2потому что(РФt)Vo+c12потому что(2LOt)4Vo2+c13потому что(LOt)8Vo3+c13потому что(3LOt)24Vo3+c22потому что(2РФt)4Vo2+c23потому что(РФt)8Vo3+c23потому что(3РФt)24Vo3+c1c22потому что(LOt)4Vo3+c12c2потому что(РФt)4Vo3+c1c2потому что(LOt+РФt)2Vo2+c1c2потому что(LOt-РФt)2Vo2+c1c22потому что(LOt-2РФt)8Vo3+c1c22потому что(LOt+2РФt)8Vo3+c12c2потому что(2LOt+РФt)8Vo3+c12c2потому что(2LOt-РФt)8Vo3

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

Получите непостоянное т.е. условия частоты гармоники не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 и РФ.

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 = 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 = 

2потому что(800t)5+потому что(13600t)

sample_output = subs(f,sample_values)
sample_output = 

127потому что(800t)250+потому что(1600t)25+потому что(2400t)375+потому что(12000t)50+потому что(12800t)5+233потому что(13600t)200+потому что(14400t)5+потому что(15200t)50+потому что(26400t)20+потому что(27200t)4+потому что(28000t)20+потому что(40800t)24+29100

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'