具有可变瞬时频率的正弦信号

时间:2017-06-10 23:55:28

标签: matlab signals

下面是一个简单的Matlab代码,它生成一个正弦信号,用户指定没有周期。如何更改此设置,使每个周期具有不同的瞬时频率?例如,如果我有10个周期,那么总共应该有10个随机频率,每个周期的频率不同。

f1 = 120;
fs = f1/60; % sampling frequency depends on f1
no_of_cycles = 10;
f = no_of_cycles/60; % Frequency of sinusoid
duration = 1; % duration of the sinusoidal signal in minutes
A = 1;
t = 1/fs:1/fs:duration*no_of_cycles*1/f; % time index
y1 = A*sin(2*pi*f*t); % simulated sinusoidal signal

1 个答案:

答案 0 :(得分:1)

假设我们有一个频率向量,例如

frequencies = [1,2,3,4,5];

然后我们希望将length(frequencies)绘图放在彼此的顶部,每个绘图的频率不同。为了使图形相互叠加,您可以在hold on命令之后使用命令plot

此外,我们必须跟踪时间,因为我想您希望下一个正弦曲线继续,前一个曲线停止。为此,我使用变量curTimeendTime来表示信号开始和结束的时间。现在我们有类似的东西:

frequencies = [1,2,3,4,5];
curTime = 0;
for i = 1:length(frequencies)
    endTime = curTime + 2*pi/frequencies(i);
    t = curTime:0.1:endTime;
    plot(t,sin(frequencies(i)*t))
    curTime = endTime;
    hold on
end

然而,当我们偶然发生频率时,结束的正弦曲线的y值与开始的正弦曲线的y值不同。正如我想的那样,你希望它是连续的,我们需要加入它们,通过改变“下一条”正弦曲线,据说通过改变$ s $ $ f($ em> t + s)$。由于你对整个周期感兴趣,我们可以选择$ s $,这样$ f t + s = 0 $。然后我们结束:

frequencies = [1,2,3,4,5];
curTime = 0; 
h = 0.01;
for i = 1:length(frequencies)
    endTime = curTime + 2*pi/frequencies(i);
    t = curTime:h:endTime;
    shift = frequencies(i)*t(1);
    plot(t,sin(frequencies(i)*t-shift))
    curTime = endTime;
    hold on
end