我正在开展一个关于和弦识别的项目。我正在使用某人的期刊作为参考,但我仍然没有掌握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;
}
我还是不知道如何在C#中将信号分成每帧65 ms。 我是否需要拆分FileStream并将它们分成帧并将它们保存到数组中?还是其他什么?
答案 0 :(得分:0)
与NAudio你会这样做:
using (var reader = new AudioFileReader("myfile.wav"))
{
float[] sampleBuffer = new float[2866];
int samplesRead = reader.Read(sampleBuffer, 0, sampleBuffer.Length);
}
正如其他人所评论的那样,如果您计划将其传递到FFT,则您读取的样本数应该是2的幂。此外,如果文件是立体声,您将左右样本交错,因此您的FFT需要能够应对此问题。