как разбить волновой сигнал на кадры - PullRequest
0 голосов
/ 13 февраля 2012

Я работаю над проектом по распознаванию аккордов. Я использую чей-то журнал в качестве ссылки, но я все еще мало разбираюсь в области DSP. В ее обращении, во-первых, мне нужно разделить сигнал из wav-файла на количество кадров. В моем случае мне нужно разделить на 65 мс каждый кадр, с 2866 выборок на кадр.

Я искал, как разделить сигнал на кадры, но я не нашел их достаточно четкими, чтобы я мог их понять. Пока это некоторые из моих кодов в классе WavProcessing:

 public void SetFileName(String fileNameWithPath) //called first in the form, to get the FileStream
    {
        _fileNameWithPath = fileNameWithPath;
        strm = File.OpenRead(_fileNameWithPath);

    }
 public double getLengthTime(uint wavSize, uint sampleRate, int bitRate, int channels)  
    {
        wavTimeLength = ((strm.Length - 44) / (sampleRate * (bitRate / 8))) / channels;
        return wavTimeLength;
    }

public int getNumberOfFrames() //return number of frames, I just divided total length time with interval time between frames. (in my case, 3000ms / 65 ms = 46 frames)
    { 
        numOfFrames = (int) (wavTimeLength * 1000 / _sampleFrameTime);
        return numOfFrames; 
    }

 public int getSamplePerFrame(UInt32 sampleRate, int sampleFrameTime) // return the sample per frame value (in my case, it's 2866)
    {
        _sampleRate = sampleRate;
        _sampleFrameTime = sampleFrameTime;

        sFr = (int)(sampleRate * (sampleFrameTime / 1000.0 ));

        return sFr; 
    }

Я просто до сих пор не понимаю, как разделить сигнал на 65 мс на кадр в C #. Нужно ли разбивать FileStream, разбивать их на фреймы и сохранять в массив? Или что-нибудь еще?

1 Ответ

0 голосов
/ 13 февраля 2012

с NAudio вы бы сделали это следующим образом:

using (var reader = new AudioFileReader("myfile.wav"))
{
    float[] sampleBuffer = new float[2866];
    int samplesRead = reader.Read(sampleBuffer, 0, sampleBuffer.Length);
}

Как прокомментировали другие, количество прочитанных сэмплов должно быть степенью 2, если вы планируете передать его в БПФ.Кроме того, если файл стереофонический, у вас будет чередование левого и правого семплов, поэтому ваше БПФ должно быть в состоянии справиться с этим.

...