Как я могу пересмотреть WAV-файл - PullRequest
0 голосов
/ 03 ноября 2011

В настоящее время я записываю аудиосигнал со следующими характеристиками:

  • Каналы: 1
  • SamplesPerSecond: 8000
  • BitsPerSample: 16

Как я могу преобразовать этот .wav-файл, например, в следующие спецификации (предпочтителен чистый c #):

  • Каналы: 1
  • SamplesPerSecond: 22050
  • BitsPerSample: 16

Ответы [ 4 ]

4 голосов
/ 03 ноября 2011

Windows API (один из) для повторной выборки аудио - Audio Resampler DSP .Этот класс преобразования довольно прост для настройки типов ввода и вывода, а затем для загрузки входных данных и извлечения выходных данных.

Еще одна задача, с которой вы могли бы дополнительно иметь дело, - это чтение из файла и запись в новый файл (вы этого не сделалиУкажите, действительно ли это необходимо в вашем первоначальном описании.

Возможно, вы также захотите использовать сторонние библиотеки, такие как NAudio .

См. Также:

3 голосов
/ 21 августа 2012

AS3 функция для повторной выборки.Вы можете легко изменить, чтобы преобразовать этот код в 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;
    }
3 голосов
/ 03 ноября 2011

try Naudio - это бесплатная + библиотека с открытым исходным кодом .NET, предлагающая несколько вещей, включая возможность повторной выборки AFAIK.

Как запрашиваемый источник выборки для повторной выборки

0 голосов
/ 31 января 2014

Попробуйте код ниже от C # ресэмплируйте аудио с 8 кГц до 44,1 / 48 кГц

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();
}
...