2014-04-22 3 views
0

Je suis en train de modifier le procédé de génération de l'onde carrée quigénérer l'onde carrée avec des impulsions

il peut générer huit impulsions avec différentes largeurs d'impulsion 0,3 ms avec retardent chacun par un point. J'ai vu que sampleBuffer est responsable de la génération des signaux d'impulsion, mais je ne suis pas sûr de savoir comment créer une fonction de l'impulsion pour un tel motif spécifique. Pourriez-vous s'il vous plaît me dire s'il existe une fonction de bibliothèque sur AudioTrack.h pour générer le pouls?

Ce qui suit est mon code pour

générant l'onde carrée

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

pas de réponse du corps? –

+0

pas de corps? ? ? ? –

Répondre

1

Voici ma solution pour à peu près le même problème.
Dans mon cas, je crée une impulsion de 1ms de largeur, que je modifie avec la valeur de remplissage de +/- 0.5ms. Donc, selon fillValue, je génère une onde carrée avec une largeur d'impulsion de 0,5 à 1,5 ms.

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

Et si je devais générer N impulsions courtes? réécrire le tampon à nouveau? –

+0

???? dois-je rewirte ll buffer à nouveau ou écrire la fonction? –

+0

Il vous suffit de définir les valeurs appropriées pour le 'sampleBuffer [i]'. – danieltmbr