2016-09-02 1 views
1

J'utilise naudio avec le code SineWaveProvider32 directement à http://mark-dot-net.blogspot.com/2009/10/playback-of-sine-wave-in-naudio.html pour générer des signaux sinusoïdaux. Le code correspondant dans la classe SineWaveProvider32:naudio SineWaveProvider32 donne des clics lors du changement d'amplitude

public override int Read(float[] buffer, int offset, int sampleCount) 
     { 
      int sampleRate = WaveFormat.SampleRate; 
      for (int n = 0; n < sampleCount; n++) 
      { 
       buffer[n + offset] = 
        (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency)/sampleRate)); 
       sample++; 
       if (sample >= sampleRate) sample = 0; 
      } 
      return sampleCount; 
     } 

Je recevais des clics/bat chaque seconde, alors j'ai changé

if (sample >= sampleRate) sample = 0; 

à

if (sample >= (int)(sampleRate/Frequency)) sample = 0; 

Ce fixe les clics chaque seconde (si cet "échantillon" était toujours relatif à un passage à zéro, pas le taux d'échantillonnage).

Cependant, chaque fois que je définis la variable Amplitude, j'obtiens un clic. J'ai essayé de le régler seulement quand le tampon [] était à un passage à zéro, pensant qu'un saut soudain d'amplitude pourrait causer le problème. Cela n'a pas résolu le problème. Je suis en train de l'amplitude des valeurs comprises entre 0,25 et 0,0

J'ai essayé adusting la latence et le nombre de tampons comme suggéré dans NAudio change volume in runtime mais n'a eu aucun effet non plus.

Mon code qui change la Amplitude:

public async void play(int durationMS, float amplitude = .25f) 
     { 
     PitchPlayer pPlayer = new PitchPlayer(this.frequency, amplitude); 
      pPlayer.play(); 
      await Task.Delay(durationMS/2); 
      pPlayer.provider.Amplitude = .15f; 
      await Task.Delay(durationMS /2); 
      pPlayer.stop(); 
    } 

Répondre

0

les clics sont causés par une discontinuité dans la forme d'onde. C'est difficile à résoudre dans une classe comme celle-ci, car idéalement, vous augmenteriez lentement le volume d'une valeur à l'autre. Cela peut être fait en modifiant le code pour avoir une amplitude cible, et si l'amplitude du courant n'est pas égale à l'amplitude de la cible, alors vous vous déplacez vers lui d'un petit delta calculé à chaque fois dans la boucle. Donc, sur une période de 10 ms, vous passez de l'ancienne à la nouvelle amplitude. Mais vous auriez besoin de l'écrire vous-même, malheureusement.

Pour un concept similaire où la fréquence est modifiée progressivement plutôt que l'amplitude, jetez un oeil à mon article de blog sur portamento in NAudio.