我有一个代码可以产生类似于所需输出的解决方案,我不知道如何完善它。
代码如下。
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
开始,但输出甚至比这更差,但如果这是一个可行的选项,请详细解释,应该如何完成。< / p>
我已经尝试在一个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
产生的错误消息如下:尝试访问xnB(0); index必须是正整数或逻辑。
编辑/成功 - 4
再看看发布的答案后,我意识到cos函数前面的负号不应该是原始编码。
答案 0 :(得分:3)
根据我的理解,您希望使用单个[-30, 30]
循环迭代0
中除for
之外的所有整数值。这可以很容易地完成:
for ii = [-30:-1,1:30]
%Your code
end
根据您更新的代码,尝试替换
xn(rem(n,N)==0) = -(cos(.1*pi*n)-(4*sin(.2*pi*n)));
与
xn(rem(n,N)==0) = -(cos(.1*pi*n(rem(n,N)==0))-(4*sin(.2*pi*n(rem(n,N)==0))));
这应该可以解决尺寸不匹配问题。
尝试:
N = 4; % sampling period
for nB = -30:30;
if rem(nB,N)==0
xnB(nB-(-30)+1) = -(cos(.1*pi*nB)-(4*sin(.2*pi*nB)));
else
xnB(nB-(-30)+1) = 0;
end
end
答案 1 :(得分:3)
您可以执行以下操作:
nB = -30:1
nC = 1:30
xnB = zeros(size(nB));
remB = rem(nB,N)==0;
xnB(remB) = -cos(.1*pi*nB(remB))-(4*sin(.2*pi*nB(remB));
xnC = zeros(size(nC));
remC = rem(nC,N)==0;
xnC(remC) = cos(.1*pi*nC(remC))-(4*sin(.2*pi*nC(remC)));
这避免了完全具有for循环的问题。但是,这会产生与之前完全相同的输出,因此我不确定它是否会解决您的初始问题...
编辑您最近添加的内容:
nB = -30:30;
xnB = zeros(size(nB));
remB = rem(nB,N)==0;
xnB(remB) = -(cos(.1*pi*nB(remB))-(4*sin(.2*pi*nB(remB)));
在您的原始帖子中,您的标志取决于nB的标志 - 如果您想维护此功能,则可以执行以下操作:
xnB(remB) = sign(nB(remB).*(cos(.1*pi*nB(remB))-(4*sin(.2*pi*nB(remB)));