使用正弦形式逼近方波
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,因此第一个正弦分量将被添加两次写两遍的时候。
让我们考虑以下表格
取自维基百科,我试过在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,因此第一个正弦分量将被添加两次写两遍的时候。