2011-11-03 5 views
0

Actuellement j'enregistre un signal audio avec les spécifications suivantes:Comment puis-je rééchantillonner fichier wav

  • Canaux: 1
  • SamplesPerSecond: 8000
  • BitsPerSample: 16

Comment Je convertis ce fichier .wav en suivant les spécifications suivantes (C# pur est préférable):

  • Canaux: 1
  • SamplesPerSecond: 22050
  • bitspersample: 16

Répondre

4

API Windows (un des) rééchantillonner audio est Audio Resampler DSP. Cette classe de transformation est assez simple pour configurer les types d'entrée et de sortie, puis pousser les données d'entrée et tirer la sortie.

Une autre tâche que vous pourriez traiter est de lire à partir du fichier et d'écrire dans un nouveau fichier (vous n'avez pas précisé si cela est réellement nécessaire dans votre description originale).

Vous pouvez également utiliser des bibliothèques tierces telles que NAudio.

Voir aussi:

+0

la démo @http: //stackoverflow.com/questions/3194184/c-sharp-resample-audio-from-8khz-to-44-1-48khz/4653746# 4653746 semble vraiment prometteur! –

+0

trop drôle ... Alvas.Audio travaille avec MsgBox ... échouer sur une page Web (même avec leur propre exemple @http: //alvas.net/alvas.audio,tips.aspx#tip24) –

+0

ha. .. encore plus drôle ... typeInitializer d'Alvas.Audio utilise un MsgBox ... donc ... non - mais merci! –

3

essaient Naudio - il est une bibliothèque .NET opensource libre + offrant plusieurs choses, y compris la possibilité de ré-échantillonner. AFAIK

As requested sample source for resampling

+0

pouvez-vous me donner un exemple de code? –

+0

@AndreasNiedermair a ajouté un lien vers un échantillon qui rééchantillonne – Yahia

3

fonction AS3 pour ré-échantillonnage. Vous pouvez changer facilement de convertir ce code en C#:

private function resampling(fromSampleRate:int, toSampleRate:int, quality:int = 10):void 
    { 
     var samples:Vector.<Number> = new Vector.<Number>; 

     var srcLength:uint = this._samples.length; 
     var destLength:uint = this._samples.length*toSampleRate/fromSampleRate; 
     var dx:Number = srcLength/destLength; 

     // fmax : nyqist half of destination sampleRate 
     // fmax/fsr = 0.5; 
     var fmaxDivSR:Number = 0.5; 
     var r_g:Number = 2 * fmaxDivSR; 

     // Quality is half the window width 
     var wndWidth2:int = quality; 
     var wndWidth:int = quality*2; 

     var x:Number = 0; 
     var i:uint, j:uint; 
     var r_y:Number; 
     var tau:int; 
     var r_w:Number; 
     var r_a:Number; 
     var r_snc:Number; 
     for (i=0;i<destLength;++i) 
     { 
      r_y = 0.0; 
      for (tau=-wndWidth2;tau < wndWidth2;++tau) 
      { 
       // input sample index 
       j = (int)(x+tau); 

       // Hann Window. Scale and calculate sinc 
       r_w = 0.5 - 0.5 * Math.cos(2*Math.PI*(0.5 + (j-x)/wndWidth)); 
       r_a = 2*Math.PI*(j-x)*fmaxDivSR; 
       r_snc = 1.0; 
       if (r_a != 0) 
        r_snc = Math.sin(r_a)/r_a; 

       if ((j >= 0) && (j < srcLength)) 
       { 
        r_y += r_g * r_w * r_snc * this._samples[j]; 
       } 
      } 
      samples[i] = r_y; 
      x += dx; 
     } 

     this._samples = samples.concat(); 
     samples.length = 0; 
    } 
+0

choses intéressantes! juste pour être sûr: 'Vector. 'est équivalent à' int [2] '? –

+0

Non, "Vecteur " est un vecteur de nombres à virgule flottante de 32 bits – Sasha

1

code ci-dessous Essayez de C# resample audio from 8khz to 44.1/48khz

static void Resample(string fileName) 
{ 
    IntPtr formatNew = AudioCompressionManager.GetPcmFormat(2, 16, 44100); 
    WaveReader wr = new WaveReader(File.OpenRead(fileName)); 
    IntPtr format = wr.ReadFormat(); 
    byte[] data = wr.ReadData(); 
    wr.Close(); 
    //PCM 8000 Hz -> PCM 44100 
    byte[] dataNew = AudioCompressionManager.Resample(format, data, formatNew); 
    WaveWriter ww = new WaveWriter(File.Create(fileName + ".wav"), 
     AudioCompressionManager.FormatBytes(formatNew)); 
    ww.WriteData(dataNew); 
    ww.Close(); 
}