在 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 - ...
的东西,它的最小值超出了您考虑的范围。
我想在 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 - ...
的东西,它的最小值超出了您考虑的范围。