使用正弦形式逼近方波

approximation of square wave using sinusoidal form

让我们考虑以下表格

取自维基百科,我试过在matlab中实现

function x_square=square_wave(f);
%f-given frequency
% let time interval be too big
x_square=0;
t=0:0.001:10;
 k=1:length(t);
 x_square=(sin(2*pi*f*t)+sum(sin(2*pi*(2*k-1)*f*t)./(2*k-1)))*4/pi;
end

第一次看起来完全按照公式给出的那样做,但它给我错误

>> f=1;
>> y=square_wave(f);
Error using  * 
Inner matrix dimensions must agree.

Error in square_wave (line 7)
 x_square=(sin(2*pi*f*t)+sum(sin(2*pi*(2*k-1)*f*t)./(2*k-1)))*4/pi;

它应该是什么错误?我可能需要 .* 乘法,但它是正确的形式吗?提前致谢

已编辑:

我已经将我的代码更改为这个

function x_square=square_wave(f);
%f-given frequency
% let time interval be too big
x_square=0;
t=0:0.001:10;
 k=1:length(t);
 x_square=(sin(2*pi*f*t)+sum(sin(2*pi*(2*k-1)*f.*t)./(2*k-1)))*4/pi;
end

并获取图片

基本上,您的问题减少到忽略矩阵乘法的基本规则(例如:A:1xM * B:Mx1 = C:1x1,即标量,而不是 B:Mx1 * A:1xN = C:MxN,即维度为 MxN 的完整矩阵,相对于 A:1xM 元素乘以 B:1xM 是 C:1xM).

您生成的图片由一个正弦函数(来自第一个 sin() 项)和一个常量偏移量组成,该偏移量是向量 sum() 的结果。您使用逐元素乘法 .* 但应改用矩阵乘法:

sum(sin(2*pi*(2*k'-1)*f*t)./((2*k'-1)*ones(1,length(t))))

所以,正确的程序是:

x_square=0;
t=0:0.001:10;
k=1:length(t);
x_square=sum(sin(2*pi*(2*k'-1)*f*t)./((2*k'-1)*ones(1,length(t))))*4/pi

关键是 k' 将向量 k 从 1xM 转置为 Mx1。

第二个小错误是第一个 sin() 项已经包含在公式中,因为 (2*k-1) 对于 k=1 为 1,因此第一个正弦分量将被添加两次写两遍的时候。