用matlab增加步进频率创建正弦波

时间:2016-09-22 13:31:14

标签: matlab

我是matlab编程的新手,我提前感谢你的帮助。 我想生成非正弦波函数,从0.25 Hz开始,每8次振荡增加0.05 Hz,直到0.7 Hz。幅度是恒定的。

我试试这段代码:

cyc = 8; % number of cycles
for lF= 0.25:0.05:0.7 %% Frequency Increment
    t=1/fE:1/fE:(cyc/lF); % time per freq step
    wave = sin(2*pi*t)
end
plot(wave)

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

1)试试这个:

cyc = 8; % number of cycles
wave = [];
T = [];
for f = 0.25:0.05:0.7 %% Frequency Increment
    t=0.01/f:0.01/f:(cyc/f); % time per freq step
    wave = [wave,sin(2*pi*f*t)];
    if isempty(T)
       T = t;
    else
       T = [T,T(end)+t];
    end
end
plot(T,wave)

2)以下评论,内存预分配的代码:

cyc = 8; % number of cycles
Npoints = 100; % number of points in one cycle
f = 0.25:0.05:0.7; %% Frequency Increment
Nf = length(f);

wave = zeros((cyc*Npoints-1)*Nf+1,1);
T    = zeros((cyc*Npoints-1)*Nf+1,1);
t0   = 0;
t_f  = linspace(0,cyc,cyc*Npoints); % time*frequency per freq step
for nf = 1:length(f)
    ind = (nf-1)*(cyc*Npoints-1)+(1:cyc*Npoints);
    wave(ind) = sin(2*pi*f(nf)*t_f);
    T(ind)    = t0 + t/f(nf);
    t0 = t0+cyc/f(nf);
end
plot(T,wave)

3)矢量化版

t    = cyc*linspace(0,1,cyc*Npoints)';
wave = sin(2*pi*t(:,ones(Nf,1)));
t = bsxfun(@plus,cumsum([0,cyc./f(1:end-1)]),bsxfun(@times,1./f,t))'; % for MATLAB version less than 2016b
[t,ind] = unique(t); wave = wave(ind); % remove duplicate values
plot(t,wave)