最初的问题非常简单:“开发一个评估卷积的程序”
问题在于编程,我们不允许使用CONV function因此我们将利用傅里叶变换将其发送到频域,将两个信号相乘,然后逆傅立叶变换它们。 / p>
从概念上讲,这并不困难,但我们不允许使用任何转换函数。
最后我们留下直接分析。
1)乘以指数函数后对两个信号进行积分。
2)将两个功能相乘。
3)将答案乘以1 /(2 * pi)并进行积分。
4)绘制结果。
(我们的老师基本上说我们必须使用trapz function)
这是我到目前为止的代码:
t = -5:.1:5;
w = pi;
x = zeros(101,1);
h = zeros(101,1);
y = zeros(101,1);
Y = zeros(101,1);
H = zeros(101,1);
X = zeros (101,1);
for i = 1:101;
x(i) = exp((-3*t)+(-1i*w*t));
h(i) = exp((-2*t)+(-1i*w*t));
X(i) = trapz(t,x);
H(i) = trapz(t,h);
Y(i) = X.*H;
y(i) = (1/(2*pi))*trapz(t,Y.*exp(-1i*w*t));
end
disp (length(t))
disp (length(y))
figure(1);
subplot(1,2,1),plot(t,real(y));grid on;
这是我需要帮助的地方。 我知道我需要为y创建一个零向量,但是到目前为止,我正在努力解决语法和大小调整问题,我也无法将其置于for循环之外并进行绘制。 < / p>
我将For循环的索引从1:101放入,因为它不需要 abs()函数,它允许我跳过处理零值。大!这是下一期:
x(i) = exp((-3*t)+(-1i*w*t));
x向量在循环结束时仍然用零填充,并且没有从等式中赋值。为什么是这样? (这也是h的情况)这两个问题在其余的代码中滚雪球。 附带问题:有没有办法考虑零指数,如 abs()适用于否定数据?
我需要超过10个声誉才能发布超过两个链接...所以我无法链接我经历过的页面,但基本上是零矩阵,绘图,卷积,绘制For循环数据和零矩阵最大可变大小。
如果有任何其他信息我可以提出,请问如果有更好的方法来实现这一目标,请说明,并提供深入的解释。
感谢您的帮助。
答案 0 :(得分:2)
您可以使用命令
生成零向量/矩阵并将其存储在 yt 中yt = zeros(r,c)
其中 r 和 c 分别是矩阵的行和列。
另一个问题似乎是存储结果。您可以将结果保存到矢量中,比如说,按
y(idx) = [your calculations]
其中 idx 是循环索引。这样,来自循环的每个评估的每个结果被单独存储以供稍后访问。您可以通过矢量中的索引访问(读取和写入)元素,例如
y(1)
y(3)
将在Matlab的命令窗口中返回 y 的第一个和第三个元素。
当然,您应该预先分配y - 例如通过填充适当大小的零向量 - 然后再开始循环以使程序更快:
y = zeros(100,1);
其中100是您要存储的元素数。没有预先分配,它现在可以正常工作。 Matlab将为您完成工作。
[edit / add] 首先:使用循环索引来引用元素的好选择。但是,强烈建议不要使用 i ,因为它也指虚构单位。一般情况下,避免使用 i 和 j 作为变量名,无论您使用哪种语言进行编程。请改用 ii 或 jj 。有些人甚至使用双字母名称作为循环变量,例如aa,bb,ii,..
我立即看到的第二个问题如下。这里有两件事情混淆:vector-typed t 和元素x(ii)的标量值:
x(i) = exp((-3*t)+(-1i*w*t));
修复i-issue(循环变量名称)后,Matlab可能会发出数组维度不匹配错误。要存储值的结果和变量必须在类型和大小上相等。您还需要在t中添加元素,例如
x(ii) = exp((-3*t(ii))+(-1i*w*t(ii)))
或者,Matlab允许您完全绕过循环结构:
x = exp((-3*t)+(-1i*w*t));
我从
看到了Y = X.*H
您已经发现了对向量的元素操作。这些有助于在没有循环的情况下进行所有计算。
PS:如果这些建议对你有帮助,那么答案的作者(我看到你发布了另一个问题并接受了答案作为解决方案)很高兴收到一个投票。 ; - )