在 Matlab 中生成具有时间相关频率的正弦信号

Generating a sine signal with time dependent frequency in Matlab

我想在 Matlab 中生成具有时间相关频率 f(t) 的正弦信号 y(t)

我已经尝试使用 Matlab 的正弦函数来实现这一点:

h = 0.0001;
npoints = 150/h;
for i = 1:1:npoints
   f(i) = 2 - 0.01*i*h;
   y(i) = 0.5*sin(2*3.1415*f(i)*i*h)+0.5;
end

其中频率随时间减小,h 是时间步长。

我的问题:

信号 y(t) 看起来不像我预期的那样。在不同的时间出现了振幅的颠簸(请看下图)。

有谁知道为什么会这样以及如何正确生成这个正弦信号?

看起来实际上并没有 "bump in frequency",但在 x 轴上的 100 值处,整个信号 偏移了 180 度 。请记住,幅度仍然达到 0 并且不会变小(例如从 0.25 到 0.75)

这是因为 i 值变得如此之高以至于 f(i) 的值改变符号

另一个迹象是频率在偏移后再次开始增加,而不是逐渐变得更低。

为什么从 f(i) 的值 2 开始?

很抱歉在这里要求澄清,但我不能post将其作为评论。

怎么样

y(i) = 0.5*real(exp(1i*2*pi*f(i)*i*h))+0.5;

你会得到下面的情节

如果您只需要一个从 2Hz 开始到 0.5Hz 的 chirp 信号,以下应该可以完成工作

f_start = 2; % start frequency
f_end = 0.5; % end frequency
endtime = 150; % seconds
timestep = 0.0001;
times = timestep:timestep:endtime;
y = chirp(times,f_start,endtime,f_end);

如果你绘制它你会得到

figure(2);plot(times,y);

您可以使用下面的方法手动实现相同的效果

f_start = 2; % start frequency
f_end = 0.5; % end frequency
timestep = 0.0001;
T = 150;
rate_of_change = (f_start - f_end)/T;
times = timestep:timestep:T;
y = sin(2*pi*(f_start*times - times.^2*rate_of_change/2));

阅读有关 Chirp 信号的 following 维基百科页面可能会有用。

在 100 处你有 sin(2*pi*N),这是 0。稍微改变 f,比如 2.0123-...,它会到达顶部。

至于一般可能出乎意料的形状,请考虑您最终使用的是什么函数(= 将 f 替换回公式中)。你看到你有一些形式为 y = ...sin(Ai-B*i^2)... 的东西,它的最小值为 100.

这里最简单的解决方案是简单地稍微偏移频率,并使用类似 f(i) = 3.1 - ... 的东西,它的最小值超出了您考虑的范围。