2014-04-22 91 views
0

我想修改產生方波的方法用脈衝產生方波

它可以產生8個不同脈衝寬度,每個週期0.3ms延遲。我已經看到,sampleBuffer負責生成脈衝信號,但我不確定如何爲這種特定模式創建脈衝函數。請您告訴我AudioTrack.h中是否有庫函數用於生成脈衝?下面

的是我

碼產生方波

void generateSquare(SInt16 *sampleBuffer, int numFrames, float sampleRate, float frequency, float amp) { 
    if(amp>1) amp=1; 
    if(amp<0) amp=0; 
    amp = amp*SHRT_MAX; 
    float samplesPerCycle = sampleRate/frequency; 
    for(int i = 0; i < numFrames; i++) { 

     if(fmodf(squareIndex, samplesPerCycle)/samplesPerCycle > 0.5) { 
      sampleBuffer[i] = amp; 
     } else { 
      sampleBuffer[i] = -1*amp; 
     } 

     squareIndex = squareIndex+1; 

     if(squareIndex >= samplesPerCycle) squareIndex-=samplesPerCycle; 
    } 
} 
+0

沒有正文答案? –

+0

沒有身體? ? ? ? –

回答

1

這裏是我的幾乎同樣的問題的解決方案。
在我的情況下,我創建了1ms寬度的脈衝,我使用填充值修改了+/- 0.5ms。 所以根據fillValue我產生一個0.5-1.5ms脈衝寬度的方波。

int squareIndex = 0; 
void generateSquare(SInt16 *sampleBuffer, int numFrames, float sampleRate, float fillValue, float amp) { 
    // Fill value = pulse width value in frames 
    // fillValue = [-20, 20]; 

    if(amp>1) amp=1; 
    if(amp<0) amp=0; 

    if(fillValue > 20) fillValue = 20; 
    if(fillValue < -20) fillValue = -20; 

    amp = amp*SHRT_MAX; 
    float samplesPerCycle = sampleRate/50; 

    //Sample/Cycle = 882 
    //1ms = 41 frame -> 0.5ms = 20(.5)frame 
    //In your case 0.3ms = 12(.3) frame 

    #pragma mark - PWM 
    for(int i = 0; i < numFrames; i++) { 

     //if(fmodf(squareIndex, samplesPerCycle)/samplesPerCycle < 0.05) { 
     if(squareIndex < 41 + fillValue) { 

      sampleBuffer[i] = 1*SHRT_MAX; 
     } else { 
      sampleBuffer[i] = 0; 
     } 

     squareIndex = squareIndex+1; 

     if(squareIndex >= samplesPerCycle) squareIndex-=samplesPerCycle; 
    } 
} 
+0

如果我必須產生N個短暫的衝動,該怎麼辦?重新寫入緩衝區? –

+0

????我必須重新緩衝一下緩衝區還是寫入函數? –

+0

你只需要設置適當的值到'sampleBuffer [i]'。 – danieltmbr