我想要在8Hz
秒内逐渐从2Hz
变为5
正弦波:
此波形在 Cool Edit 中生成。我给它的开始频率为8Hz
,结束频率为2Hz
,持续时间为5
秒。在给定时间内,正弦波从一个频率逐渐变化到另一个频率。
我的问题是,如何使用FOR循环准确找到每个周期的开始时间(用红点突出显示)?
伪代码:
time = 5 //Duration
freq1 = 8 //Start frequency
freq2 = 2 //End frequency
cycles = ( (freq1 + freq2) / 2 ) * time //Total number of cycles
for(i = 0; i < cycles; i++) {
/* Formula to find start time of each cycle */
}
答案 0 :(得分:2)
这是对这个导致程序疯狂的问题的后顾之忧。更不用说单个波不会是一个正弦波,因为频率正在发生变化(它们会稍微失真),这是你用发生器无法实现的,并且结束信号在5秒后停止在零点的可能性非常小。而是做一个频率可变的连续正弦波:
首先计算实际频率
线性插值就足够了(除非你需要不同的改变)
f=f0+(f1-f0)*t/T
其中:
f0=8 [Hz] start frequency
f1=2 [Hz] stop frequency
T =5 [s] change time
t =<0,T> is actual time in [s]
计算正弦波数据
for (t=0.0,angle=0.0;t<=T;t+=dt)
{
f=f0+((f1-f0)*t/T); // actual frequency
signal=Amplitude*sin(angle); // your signal put it in a array or output somewhere ...
angle+=6.283185307179586476925286766559*dt*f; // update phase
while (angle>6.283185307179586476925286766559) // cut just to avoid floating rounding problems
angle-=6.283185307179586476925286766559;
}
dt [s]
是时间步,您希望用信号对信号进行采样。如果您在实时中生成并输出到真实硬件,则可以使用timer
或直接测量时间(使用performance counters
< strong> Windows 或RDTSC
或您拥有的任何内容)
如果你有预定数量的样本n
,那么
dt=T/double(n-1);
此处示例输出(n=image width
):
如果你还需要周期数,那么在angle
切割while
循环内添加计数器增量也是你的零点(但如果采样率太小或你需要高精度你需要插入真实的零位置。)