2016-06-01 3 views
1

に各サイクルの時点(時間)を開始して下さい:この波形は、クール編集で生産されたimg私は徐々に<code>5</code>秒かけ<code>2Hz</code>に<code>8Hz</code>から変化する正弦波を達成するために抱き合わせてい正弦波

。私はそれに開始周波数を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

@DavidTanseyの符号の変更はすべてゼロクロスを検出し、その半分だけが「位相= 0」ですが、問題はゼロクロスを検出しないような信号を生成することだと思います。これには間違った別個のsin波を生成することによって、これに近づくのは新人の試みでした。 – Spektre

答えて

1

プログラムで狂気につながるこの問題の後方の考え方です。言うまでもなく、個々の波はsin波ではありません。なぜなら、周波数が変化している(それらはわずかにゆがんでいる)ため、発電機では達成できず、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. dt [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; 
    } 
    

    を計算します。あなたはリアルタイムでこれを生成し、あなたがtimerを使用するか(Windowsの上またはRDTSCによってperformance countersまたはものは何でも自由に持っていると)直接時間を測定することができます実際のHWに出力している場合は

    あなたの場合ここ次いでサンプルこのためnの所定数

    dt=T/double(n-1); 
    

    を得たサンプル出力(n=image width):

    example

    あなたはまた、期間の数が必要な場合anglewhileループを切断しても、あなたのゼロ点があまりにもあります(ただし、サンプルレートが小さすぎるか、高精度が必要な場合は、補間する必要があるの内側に、カウンタの増分を追加実際のゼロ位置)。

+0

驚くほど詳細な解答と絶対にスポットが当てられます。ブリリアント! – pJay