我想了解一件事并请帮助我澄清一下,有时需要用加性白噪声的复指数之和来表示给定数据,让我们考虑使用正弦模型的跟随模型
clear all;
A1=24;
A2=23;
A3=23;
A4=23;
A5=10;
f1=11.01;
f2=11.005;
f3= 10;
f4=10.9
phi=2*pi*(rand(1,4)-0.5);
t=0:0.01:2.93;
k=1:1:294;
x=rand([1,length(t)]);
y(k)=A1.*sin(2*pi*f1*t+phi(1))+A2.*cos(2*pi*f2*t+phi(2))+A3.*sin(2*pi*f3*t+phi(3))+A4.*cos(2*pi*f4*t+phi(4))+A5.*x;
[pxx,f]=periodogram(y,[],[],100);
plot(f,pxx)
相位在[-pi pi]范围内均匀分布,但我的主要问题是以下事实。将数据表示为复数指数的线性组合,相位均匀分布在[-pi pi]区间内,我们是否应该生成这些阶段在抽样之外或在每个抽样过程中我们应该生成新的阶段列表?请帮我澄清这些事情
答案 0 :(得分:2)
正如我在评论中所述,我并不真正理解你所提出的问题。 但是,我会回答这个问题,好像你是在codereview上提出的那样。
以下不是MATLAB的好习惯:
A1=24;
A2=23;
A3=23;
A4=23;
A5=10;
很少有案例(如果有的话),你实际上需要这样的变量名称。相反,以下情况会好得多:
A = [24 23 23 23 10];
现在,如果您想使用A1
,请改为A(1)
。
这两行:
t=0:0.01:2.93;
k=1:1:294;
它们当然具有相同的尺寸(1x294),但是当你这样做时,它很容易弄错。如果它们的大小不同,你当然会在以后遇到错误,所以在第一次尝试时确保你的错误是很好的,因此使用linspace可能是一个好主意。以下行将为您提供与上面一行相同的t
。这样就可以更容易地确定你有294个元素,而不是293,295或2940(有时很容易错过)。
t = linspace(0,2.93,294);
不是很重要,但k = 1:1:294
可以简化为k = 1:294
,因为默认步长为1。
语法.*
用于逐元素操作。也就是说,如果要将向量(或矩阵)的每个元素与另一个元素中的对应元素相乘。因此,在将向量与标量相乘时使用它是不必要的,*
就足够了。
同样,这不是重点,但x=rand([1,length(t)]);
更简单,x=rand(1, length(t));
(无括号)。
您不需要k
中的索引y(k) = ...
,因为k是连续的,从1开始,增量为1.这是MATLAB中的默认行为,因此{{1 }} 足够。但是,如果您只想填写1到100之间的所有其他数字,则可以执行y = ...
。
这远非完美,但在我看来,朝着正确方向迈出了重要一步:
y(1:2:100)
另一种选择是:
A = [24 23 23 23 10];
f = [11.01 11.005 10 10.9]; % You might want to use , as a separator here
phi = 2*pi*(rand(1,4)-0.5);
t = linspace(0,2.93,294);
x = rand(1, length(t));
w = 2*pi*f; % For simplicity
y = A(1)*sin(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + ...
A(3)*sin(w(3)*t+phi(3)) + A(4)*cos(w(4)*t+phi(4))+A(5)*x;
这将为您提供与第一个相同的z = [sin(w(1)*t+phi(1)); cos(w(2)*t+phi(2)); sin(w(3)*t+phi(3)); ...
cos(w(4)*t+phi(4)); x];
y = A.*z;
。如上所述y
,w
和t
相同,以下内容也会给您相同的结果:
phi
我希望这里的某些内容可以帮助你进一步开展工作。也许我真的回答了你的问题。 =)