Дискретизирующие функции в Matlab - PullRequest
1 голос
/ 03 марта 2011

У меня есть следующая функция и набор значений:

z(t):   {R → [-2,3] | z(t) = sin(0.5×π×t) + cos(2×π×t) + 1

t = [-1 : 0.001 : 1]

Мне нужно определить z(n×Ts) = z(n), используя период выборки Ts=0.01, поэтому дискретизируя функцию.

Я пытался использовать d2d, но то, что я понял, может быть применено только к функциям zpk.

Есть ли другой способ сделать это?

1 Ответ

2 голосов
/ 04 марта 2011

Если вы хотите аппроксимировать сигнал нулевым порядком, это можно сделать с помощью следующего кода:

Ts = 0.01;
t = -1:0.001:1;
n = t./Ts;

nSampled = nan(size(t));
nSampled(1:10:end) = n(1:10:end);

zCont = @(t)(sin(pi*t/2)+cos(2*pi*t)+1);
zZOH  = @(n,Ts)(zCont(floor(n).*Ts));
zDisc = @(n,Ts)(zCont(n.*Ts));

figure;
plot(t,zCont(t),'b','DisplayName','Continuous'); hold on;
plot(t,zZOH(n,Ts),'r','DisplayName','ZOH'); 
stem(t,zDisc(nSampled,Ts),'k','DisplayName','Discrete'); 
legend('show');

Это даст вам вывод, как на прилагаемом рисунке. enter image description here

Вы можете попытаться играть с ceil () или round () вместо floor (), чтобы получить немного другое поведение. Если вам нужны сэмплы только при целочисленных значениях n, это вообще что-то другое и совсем другое для общего случая (из-за ошибки округления в числах с плавающей запятой). Тем не менее: для вашего случая это будет работать путем простой подвыборки индекса, как это делается в nSampled, так как коэффициент подвыборки равен 10. Для нецелочисленного коэффициента подвыборки это не будет работать должным образом.

...