在正弦波中查找每个循环的起点(时间)

时间:2016-06-01 16:53:01

标签: math waveform sine-wave

我想要在8Hz秒内逐渐从2Hz变为5正弦波:

img

此波形在 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 */
}

1 个答案:

答案 0 :(得分:2)

这是对这个导致程序疯狂的问题的后顾之忧。更不用说单个波不会是一个正弦波,因为频率正在发生变化(它们会稍微失真),这是你用发生器无法实现的,并且结束信号在5秒后停止在零点的可能性非常小。而是做一个频率可变的连续正弦波:

  1. 首先计算实际频率

    线性插值就足够了(除非你需要不同的改变)

    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]
    
  2. 计算正弦波数据

    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):

    example

    如果你还需要周期数,那么在angle切割while循环内添加计数器增量也是你的零点(但如果采样率太小或你需要高精度你需要插入真实的零位置。)