1

我正在努力实现正弦波逐渐从几秒8Hz变为几秒:2Hz5

图像

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

1 回答 1

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 countersWindows上或通过RDTSC或任何您可以使用的东西)

    如果您n为此获得了预定义数量的样本,那么

    dt=T/double(n-1);
    

    这里示例输出(n=image width):

    例子

    如果您还需要周期数,则在angle剪切while循环内添加计数器增量并且还有您的零点(但如果采样率太小或您需要高精度,则需要插入真正的零位置)。

于 2016-06-02T05:18:08.843 回答