当前位置: 首页 > 知识库问答 >
问题:

求正弦波中每个周期的起始点(时间)

鞠自明
2023-03-14

我正在实现正弦波在5秒内从8Hz逐渐变化到2Hz

此波形是在酷编辑中产生的。开始频率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个答案

孟文栋
2023-03-14

这是对这个问题的落后思考,导致了程序的疯狂。更不用说,单个的波不会是正弦波,因为频率在变化(它们会轻微扭曲),这是你用你的发生器无法实现的,而且有很小的机会结束信号会在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=T/double(n-1);
    

    下面是示例输出(n=图像宽度):

    如果还需要周期数,那么在Anglecutwhile循环中添加计数器增量,还有零点(但是如果samplerate太小或者需要高精度,则需要内插实际的零点位置)。

  •  类似资料:
    • 我发现一个类似的问题张贴,但没有一个合适的答案。 我想有正弦波缓冲器,做音频合成,并想为缓冲器设计一个最佳大小,以避免在采样中测量的正弦波周期是非整数的伪影。 例如,正弦频率为4440.0Hz,采样率为44100,每1/440*44100个采样,或每100.22727272727272727272个采样重复一次。如果您简单地创建一个100(或101)个样本的循环缓冲区来包含一个正弦周期,那么回放会

    • 我试图生成一组点,当绘制成一个图表示1个周期的正弦波。要求是: 1个周期的正弦波 下限=29491 上限=36043 点数=100 振幅=3276 零偏移量=32767 代码: 我正在生成并存储一个文件中的点。当这些点被绘制出来时,我得到了下面的图。 但我只需要一个循环。我怎么能这么做?

    • 我试图在y有最高值时显示x位置。在if语句中,我试图将y值与120进行比较,但它似乎从来都不是真的,所以它没有使用文本函数显示我的x位置。我也试着取整y值,但结果仍然不是我想要的。有人能帮我吗?

    • 我正在做一个项目,我想通过组合不同的正弦波来产生(简单的)声音。我使用的是arduino mkrZero,因为它内置了I2S接口,似乎有足够的处理能力来满足我的需求。 教程代码工作得很好,我从扬声器中得到了一个简单的方波音调。 现在我修改了生成正弦波的代码,有一个sin函数的查找表,使其足够快: 如果我稍微修改一下代码,然后写 而不是 一切都破裂了,扬声器发出的声音听起来像是可怕的尖叫 //阻塞

    • 我写了一个小函数,它给出了一个基于正弦波的值,当我在0到1之间放一个浮点数时。我用它在游戏中把东西弄得乱七八糟。 它很好用..但我想知道有没有一种数学方法来改变正弦波,这样我就可以让它在中间变得“陡峭”或“浅”?在下面的图中,蓝色曲线是正弦波,我想知道我是否可以让它更像绿线。

    • 用C/C++编写了一个三维正弦波发生器 代码: