用正弦形式近似方波

时间:2015-03-09 05:44:16

标签: matlab signal-processing

让我们考虑以下表格     enter image description here

它来自维基百科源代码,我试图在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

获取图片

enter image description here

1 个答案:

答案 0 :(得分:2)

基本上,你的问题减少到忽略矩阵乘法的基本规则(例如:A:1xM * B:Mx1 = C:1x1,即标量,而B:Mx1 * A:1xN = C:MxN,即a尺寸为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,所以第一个正弦曲线成分在写入时会加两次它下来了两次。