【发布时间】:2013-12-02 05:43:17
【问题描述】:
我有一个代码可以产生类似于所需输出的解决方案,但我不知道如何完善它。
代码如下。
N = 4; % sampling period
for nB = -30:-1;
if rem(nB,N)==0
xnB(abs(nB)) = -(cos(.1*pi*nB)-(4*sin(.2*pi*nB)));
else
xnB(abs(nB)) = 0;
end
end
for nC = 1:30;
if rem(nC,N)==0
xnC(nC) = cos(.1*pi*nC)-(4*sin(.2*pi*nC));
else
xnC(nC) = 0;
end
end
nB = -30:-1;
nC = 1:30;
nD = 0;
xnD = 0;
plot(nA,xnA,nB,xnB,'r--o',nC,xnC,'r--o',nD,xnD,'r--o')
这会产生一些接近但不足以正确恢复数据的东西。
我尝试使用长度相同但仅从 1 开始的索引,但输出比这更糟糕,但如果这是一个可行的选项,请彻底解释应该如何完成。
我尝试在一个 for-loop 和一个 if-statement 中运行它,但是当计数器为零时出现问题。有什么办法可以让我避免使用两个for-loops? (我相当有信心,解决这个问题将提高我输出的准确性,足以成功恢复信号。)
编辑/澄清/添加 - 1
事实上,我确实想评估索引为零的信号。 if-statement 无法处理零索引,这是我不想跳过的索引。
此代码的目标是能够对信号进行采样,然后我将构建一个代码,使其通过恢复过滤器。
编辑/更新 - 2
nA = -30:.1:30; % n values for original function
xnA = cos(.1*pi*nA)-(4*sin(.2*pi*nA)); % original function
N = 4; % sampling period
n = -30:30;
xn = zeros(size(n));
xn(rem(n,N)==0) = -(cos(.1*pi*n)-(4*sin(.2*pi*n)));
plot(nA,xnA,n,xn,'r--o')
title('Original seq. x and Sampled seq. xp')
xlabel('n')
ylabel('x(n) and xp(n)')
legend('original','sampled');
这在xn(rem(n,N)==0) = -(cos(.1*pi*n)-(4*sin(.2*pi*n))); 行引发了一个错误,内容如下:在赋值 A(I) = B 中,B 和 I 中的元素数必须相同。我遇到过这个错误之前,但我以前的遭遇通常是错误循环的结果。有人能指出为什么这次它不起作用吗?
编辑/澄清 - 3
N = 4; % sampling period
for nB = -30:30;
if rem(nB,N)==0
xnB(abs(nB)) = -(cos(.1*pi*nB)-(4*sin(.2*pi*nB)));
else
xnB(abs(nB)) = 0;
end
end
产生的错误信息如下: Attempted to access xnB(0); index 必须是正整数或逻辑整数。
编辑/成功 - 4
再看了一遍贴出来的答案后,我意识到 cos 函数前面的负号不应该在原始编码中。
【问题讨论】:
标签: performance matlab if-statement for-loop sampling