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または測定できます ( Windows 上performance countersまたは自由に使用できるものは何でも)。RDTSC

    nこのための事前定義された数のサンプルを取得した場合

    dt=T/double(n-1);
    

    出力例 ( n=image width):

    例

    期間の数も必要な場合は、angleカットwhileループ内にカウンターのインクリメントを追加します。また、ゼロ点もあります (ただし、サンプルレートが小さすぎる場合、または高精度が必要な場合は、実際のゼロ位置を補間する必要があります)。

于 2016-06-02T05:18:08.843 に答える