我的项目要求我使用Matlab创建一个内部有方波的符号方程。 我试着这样写,但无济于事:
syms t;
a=square(t);
输入参数必须为“double”。
我该怎么做才能解决这个问题?提前感谢您提供的帮助。
答案 0 :(得分:4)
以下是使用floor
和sign
函数的几个常规选项:
f=@(A,T,x0,x) A*sign(sin((2*pi*(x-x0))/T));
f=@(A,T,x0,x) A*(-1).^(floor(2*(x-x0)/T));
例如,使用floor
函数:
syms x
sqr=2*floor(x)-floor(2*x)+1;
ezplot(sqr, [-2, 2])
答案 1 :(得分:4)
这是让你入门的东西。回想一下,我们可以将方波表示为Fourier Series expansion。我不会打扰你的细节,但你可以将任何周期性函数表示为余弦和正弦的总和(àla@RTL)。在不进行推导的情况下,这是频率为f
的方波的闭合方程,其峰 - 峰幅度为2(即,它从-1变为1)。回想一下,频率是每秒周期的数量。因此,f = 1
意味着我们每秒重复一次方波。
基本上,你要做的就是编写方程式的第一行......但你会怎么做呢?欢迎来到符号数学工具箱的世界。我们需要做的事情就是声明我们的频率。我们现在假设f = 1
。使用符号数学工具箱,您可以在MATLAB中定义被视为数学变量的内容。之后,MATLAB有一整套工具可用于评估依赖这些变量的函数。一个很好的例子是,如果您想使用它来定义函数f(x)
的封闭形式解决方案。然后,您可以使用diff
来区分并查看衍生产品。亲自尝试一下:
syms x;
f = x^4;
df = diff(f);
syms
表示您在声明之后声明任何数学变量。在这种情况下,x
就是这样。 df
现在应该给你4x^3
。很酷吗?无论如何,让我们回到手头的问题。我们发现在周期平方函数中实际上有两个变量需要定义:t
和k
。一旦我们这样做,我们需要创建首先在求和中的函数。我们可以通过以下方式实现:
syms t k;
f = 1; %//Define frequency here
funcSum = (sin(2*pi*(2*k - 1)*f*t) / (2*k - 1));
这解决了这个问题......现在我们如何将其封装成无限的总和!? MATLAB中的sum
命令假定我们有一个有限数组来求和。如果要象征性地对函数求和,我们必须使用symsum
函数。我们通常称之为:
funcOut = symsum(func, v, start, finish);
func
是我们希望总结的功能。 v
是我们希望用于在总和中索引的求和变量。在我们的例子中,那是k
。 start
是总和的开头,在我们的情况下为1,finish
是我们希望完成总和的地方。在我们的例子中,那是无穷大,因此MATLAB有一个特殊的关键字Inf
来表示。因此:
xsquare = (4/pi) * symsum(funcSum, k, 1, Inf);
xquare
现在包含您根据符号数学工具箱定义的方波表示。现在,如果你想绘制方波,看看我们是否正确。我们可以做到以下几点。我们来看-3 <= t <= 3
。因此,你会做这样的事情:
tVector = -3 : 0.01 : 3; %// Choose a step size of 0.01
yout = subs(xsquare, t, tVector);
您会注意到会有一些NaN
的值。之所以是因为正好处于周期的倍数(T = 1,2,3,...),行为是未定义的,因为这些点的导数权是未定义的。因此,我们可以使用1
或-1
填写此内容。我们现在就选择1
。此外,由于傅里叶级数通常是复值函数,而方波是纯粹的,因此该函数的输出实际上会给出一个复值向量。因此,只需切掉复杂的零件即可获得真正的零件:
yout = real(double(yout)); %// To cast back to double.
yout(isnan(yout)) = 1;
plot(tVector, yout);
你会得到类似的东西:
您也可以ezplot
方式执行此操作:ezplot(xsquare)
。但是,您会看到在波重复的点处,我们得到NaN
值,因此高峰和低峰之间存在脱节。
纳坦的解决方案更加优雅。当他把东西拿出来的时候我还在写这篇文章。无论哪种方式,我都希望为如何做到这一点提供更多的信号处理视角。去傅里叶!
答案 2 :(得分:-1)
单位幅度方波的傅立叶级数为:
alpha + 2/Pi*sum(sin( n * Pi*alpha)/n*cos(n*theta),n=1..infinity)
这是一个方便的技巧:
cos(n*theta) = Re( exp( I * n * theta))
和
1/n*exp(I*n*theta) = I*anti-derivative(exp(I*n*theta),theta)
将它们放在一起:将反导数(或积分)算子拉出总和,得到几何系列。然后整合并最终采取真实的部分。
结果:
squarewave=
alpha+ 1/Pi*Re(I*ln((1-exp(I*(theta+Pi*alpha)))/(1-exp(I*(theta-Pi*alpha)))))
我在MAPLE中尝试过,效果很好! (虽然可能不太实用)