【问题标题】:How do I plot the output of a system with an impulse response in matlab?如何在 matlab 中绘制具有脉冲响应的系统的输出?
【发布时间】:2015-01-26 08:15:11
【问题描述】:

我对 matlab 非常陌生,需要绘制 y1[n] = x[n] + y1[n - 1] 其中 x[n] = [1,2,4] 和脉冲响应 h[n ] = [1,1,1,1,1] 并且不确定我是否采取了正确的方式

到目前为止我的代码是

x = [1,2,4];
h = [1,1,1,1,1];
y = [];

for n=1:length(x) 
if (n==1)      

    y(n) = x(n);  
else

    y(n) = (x(n)*h(n)) + (y(n-1)*h(n));  
    end
end
stem(y);

请注意,我不能使用 conv() 函数

【问题讨论】:

  • 我相信您使用的是 STEP 响应,而不是冲动。冲动将是[1 0 0 0 0]。但是,我不明白你的问题。你有一段代码。和?是不是在做你所期望的?应该做什么? 为什么你问一个问题?因为好吧,你已经在绘制输出了! (使用 plot() 而不是 stem() ,但都绘制响应)
  • 我只是不完全确定它是否产生了正确的输出。
  • 你知道你期望什么输出吗?

标签: matlab signals signal-processing


【解决方案1】:

我真的不知道为什么它变得如此复杂,

x = [1,2,4];
h = [1,1,1,1,1];
y = [];
lh = length(h);
lx = length(x);
t = -lh - lx : lh + lx;
x(end + 1 : end + lh + 1) = 0;
h(end + 1 : end + lx + 1) = 0;
x = padarray(x,[0 max(t)],'pre');
h = padarray(h,[0 max(t)],'pre');
xinv = x(end:-1:1);
for n = 1 : length(t)
     xinv = circshift(xinv,[0 1]);
     y(n) = sum(xinv .* h);
end
y = circshift(y,[0 find(t == 0)]);
subplot(311)
stem(t,x);
xlim([-10 10])
subplot(312)
stem(t,h);
xlim([-10 10])
subplot(313)
stem(t,y);
xlim([-10 10])

它工作得很好,但我相信它可以用更简单的方式编码。

【讨论】:

  • 非常不错的卡姆塔尔 - +1。 circshift 很重要,因为这是卷积所需要的。
  • @rayryeng,非常感谢。我期待一个更简单的代码。
【解决方案2】:

你能用fft吗?

lx = numel(x);
lh = numel(h);
m = max(lx, lh);
y = ifft(fft([h zeros(1,max(lx-lh,0)+m)]) .* fft([x zeros(1,max(lh-lx,0)+m)]));
y = y(1:lx+lh-1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多