2014-02-11 5 views
0

Я пытаюсь смоделировать эффект различных «строительных блоков» фильтра в системе, которая представляет собой конструкцию, основанную на этих фильтрах. Я бы хотел, чтобы основные фильтры были «модульными», т. Е. Они должны быть «заменяемыми», без перезаписи конструкции, основанной на базовых фильтрах.Могу ли я расширить «вложенные» символические функции в Matlab?

Например, у меня есть система фильтров G_0, G_1, которая определяется в терминах некоторых базовых фильтров, называемых H_0 и H_1.

Я пытаюсь сделать следующее:

syms z 
    syms H_0(z) H_1(z) 
    G_0(z)=H_0(z^(4))*H_0(z^(2))*H_0(z) 
    G_1(z)=H_1(z^(4))*H_0(z^(2))*H_0(z) 

Это объявляет г-домен я хотел бы работать, и конструкция из двух фильтров G_0, G_1, на основе H_0 основных фильтров , H_1.

Теперь я пытаюсь оценить конструкцию с точкой зрения некоторых основных фильтров:

H_1(z) = 1+z^-1 
    H_0(z) = 1+0*z^-1 

То, что я хотел бы получить в данный момент является расширенным многочленом г. . для вышеприведенных объявлений я хотел бы видеть, что G_0 (z) = 1, а G_1 (z) = 1 + z^(- 4).

Я пробовал такие вещи, как «subs (G_0 (z))», «формула (G_0 (z))», «формула (subs (subs (G_0 (z))))», но я продолжаю получать приводят к терминам H_0 и H_1.

Любые советы? Спасибо заранее.

Edit - некоторые уточнения:

  • На самом деле, у меня есть 10-20 передаточные функции, как G_0 и G_1, поэтому я стараюсь, чтобы избежать повторного объявляющий все из них каждый раз, когда я изменить основные блоки H_0 и H_1. Базовые блоки H_0 и H_1 будут на самом деле намного выше, чем в приведенном здесь примере.
  • G_0 и G_1 не будут изменены после объявления только H_0 и H_1.
  • H_0(z^2) означает использование z^2 в качестве аргумента для H_0(z). Поэтому везде, где z появляется в объявлении H_0, z^2 должно быть вставлено в
  • Желаемый результат - это функция в терминах z, а не H_0 и H_1.
  • Рабочий хак имеет m-файл, содержащий объявления конструкции (G_0 и G_1 в этом примере), которые запускаются каждый раз, когда H_0 и H_1 переопределены. Мне было интересно, есть ли более элегантный способ сделать это в соответствии с приведенным выше (нерабочим) кодом.
+0

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

+0

Я бы сделал это без линии syms H_0 (z) H_1 (z) не нужно, так как вам нужен выход в терминах z не H – mhmsa

+0

Также - повторное подчеркивание требования со второй строки моей Вопрос: Я бы хотел, чтобы базовые фильтры были «модульными», т. е. они должны быть «сменными», без перезаписи конструкции, основанной на базовых фильтрах. Так что H_0 и H_1 не должны считаться «известными», когда я объявляю G_0 и G_1. – Sagie

ответ

0

Это, похоже, работает очень красиво и очень легко расширяется. Я пересмотрел H_0 до H_1 только в качестве примера.

syms z 

H_1(z) = 1+z^-1; 
H_0(z) = 1+0*z^-1; 

[email protected](Ha,z) Ha(z^(4))*Ha(z^(2))*Ha(z); 
[email protected](Ha,Hb,z) Hb(z^(4))*Ha(z^(2))*Ha(z); 

G_0(H_0,z) 
G_1(H_0,H_1,z) 

[email protected](z) H_1(z); 

G_0(H_0,z) 
G_1(H_0,H_1,z) 
+0

Таким образом, G_0 и G_1 основаны на объявлении H_0 и H_1 только в момент их объявления. Изменение H_0 и H_1 после объявления G_0 и G_1 не отражают эти изменения. – Sagie

+0

Я вижу. Я думаю, что я понял это, посмотрим, делает ли этот код то, что вы хотите. – David

+0

Спасибо за ваш вклад. Я также подумал, в какой-то момент использовать анонимные функции, но я был уверен, что должен быть какой-то способ сделать это, используя символическую панель инструментов. Я предполагаю, что это единственный способ пойти (либо это, либо просто повторно объявить все это с помощью m-файла после каждого изменения). – Sagie

0

Это похоже на проблему с пространством имен. Вы не можете определить символическое выражение или функцию в терминах произвольных/абстрактных symfun s, а затем определить их явно и можете использовать их для получения формы эксплойта исходного символического выражения или функции (по крайней мере, нелегко).Вот пример того, как символическая функция может быть заменена именем:

syms z y(z) 
x(z) = y(z); 
y(z) = z^2; % Redefines y(z) 
subs(x,'y(z)',y) 

К сожалению, этот метод зависит от определения функции (ы) быть замещено точно - потому что используются строки, Matlab видит произвольные/абстрактные symfun сек с разными аргументами в качестве разных функций. Таким образом, следующий пример не работает, как она возвращается y(z^2):

syms z y(z) 
x(z) = y(z^2); % Function of z^2 instead 
y(z) = z^2; 
subs(x,'y(z)',y) 

Но если последняя строка была изменена на subs(x,'y(z^2)',y) она будет работать.

Таким образом, один вариант может состоять в том, чтобы сформировать строки для случая, но это кажется слишком сложным и неэлегантным. Я думаю, что было бы разумнее просто не явно (re) определять ваши произвольные/абстрактные функции H_0, H_1 и т. Д. И вместо этого использовать другие переменные. В терминах простого примера:

syms z y(z) 
x(z) = y(z^2); 
y_(z) = z^2; % Create new explicit symfun 
subs(x,y,y_) 

который возвращает z^4. Для вашего кода:

syms z H_0(z) H_1(z) 
G_0(z) = H_0(z^4)*H_0(z^2)*H_0(z); 
G_1(z) = H_1(z^4)*H_0(z^2)*H_0(z); 

H_0_(z) = 1+0*z^-1; 
H_1_(z) = 1+z^-1; 
subs(G_0, {H_0, H_1}, {H_0_, H_1_}) 
subs(G_1, {H_0, H_1}, {H_0_, H_1_}) 

который возвращает

ans(z) = 

1 


ans(z) = 

1/z^4 + 1 

Вы можете изменить H_0_ и H_1_ и т.д. по желанию и использовать subs to evaluate G_1 and G_2` снова.

+0

Это было бы неплохое решение проблемы, если бы это сработало. Я получаю здесь: ANS (г) = H_0 (г^2) * H_0 (г^4) анс (г) = h_0 (г^2) * H_1 (г^4) (на Matlab R2012b). Какую версию вы используете? – Sagie

+0

@ user2934229: Я использую 2013b. – horchler

+0

Возможно, это связано с тем, что 'subs' официально не поддерживает' symfun'. Использование обычных функций, таких как шоу @David, возможно, так или иначе. Я бы никогда не написал код, как мой ответ, здесь сам. – horchler

Смежные вопросы