Написал такой код, создающий массив byte[]:
using System;
using System.Diagnostics;
using System.IO;
namespace fft
{
class Program
{
static void Main(string[] args)
{
string filename= @"d:\source.wav";
ReadWav(filename, out float[] L, out float[] R);
Console.Write(L.Length + " - L.Length\n");
Console.Write(R.Length + " - R.Length\n");
Console.ReadLine();
}
static bool ReadWav(string filename, out float[] L, out float[] R)
{
L = R = null;
try
{
using (FileStream fs = File.Open(filename, FileMode.Open))
{
BinaryReader reader = new BinaryReader(fs);
// chunk 0
int chunkID = reader.ReadInt32();
int fileSize = reader.ReadInt32();
int riffType = reader.ReadInt32();
// chunk 1
int fmtID = reader.ReadInt32();
int fmtSize = reader.ReadInt32(); // bytes for this chunk (expect 16 or 18)
// 16 bytes coming...
int fmtCode = reader.ReadInt16();
int channels = reader.ReadInt16();
int sampleRate = reader.ReadInt32();
int byteRate = reader.ReadInt32();
int fmtBlockAlign = reader.ReadInt16();
int bitDepth = reader.ReadInt16();
if (fmtSize == 18)
{
// Read any extra values
int fmtExtraSize = reader.ReadInt16();
reader.ReadBytes(fmtExtraSize);
}
// chunk 2
int dataID = reader.ReadInt32();
int bytes = reader.ReadInt32();
// DATA!
byte[] byteArray = reader.ReadBytes(bytes);
int bytesForSamp = bitDepth / 8;
int nValues = bytes / bytesForSamp;
Console.Write(bytesForSamp + " - bytesForSamp\n");
Console.Write(nValues + " - nValues\n");
float[] asFloat = null;
switch (bitDepth)
{
case 64:
double[]
asDouble = new double[nValues];
Buffer.BlockCopy(byteArray, 0, asDouble, 0, bytes);
asFloat = Array.ConvertAll(asDouble, e => (float)e);
break;
case 32:
asFloat = new float[nValues];
Buffer.BlockCopy(byteArray, 0, asFloat, 0, bytes);
break;
case 16:
Int16[]
asInt16 = new Int16[nValues];
Buffer.BlockCopy(byteArray, 0, asInt16, 0, bytes);
asFloat = Array.ConvertAll(asInt16, e => e / (float)(Int16.MaxValue + 1));
break;
default:
return false;
}
switch (channels)
{
case 1:
L = asFloat;
R = null;
return true;
case 2:
// de-interleave
int nSamps = nValues / 2;
L = new float[nSamps];
R = new float[nSamps];
for (int s = 0, v = 0; s < nSamps; s++)
{
L[s] = asFloat[v++];
R[s] = asFloat[v++];
}
return true;
default:
return false;
}
}
}
catch
{
Debug.Print("...Failed to load: " + filename);
return false;
}
}
}
}
Как из byte[] звукового файла получить спектр с помощью FFT?