|
发表于 2022-8-26 12:57:56
|
显示全部楼层
private void CreatWav(string path, byte[] data, int DataCount)
{
int[] BinData = new int[DataCount * 8];
int LastBit = 1;
int Binary_Index = 0;
for (int i = 0; i < data.Length; i++)
{
for (int j = 0; j < 8; j++)
{
if (((data[i] >> (7 - j)) & 0x01) == LastBit)
BinData[Binary_Index]++;
else
{
if (LastBit == 1)
LastBit = 0;
else
LastBit = 1;
Binary_Index++;
BinData[Binary_Index] = 1;
}
}
}
int BitLen = SampleRate / BitRate;//每一位的样本数44100/16=2756
FileStream FS = new FileStream(path, FileMode.Create);
byte[] Head1 = { 0x52, 0x49, 0x46, 0x46 };
FS.Write(Head1, 0, 4);
int len = (int)(SampleRate * 2 * 1 / BitRate * 8) * DataCount;//8是1byte对应8bits
len += 46;
byte[] Bytelen = { 0x52, 0x49, 0x46, 0x46 };
Bytelen[0] = (byte)(len % 256);
Bytelen[1] = (byte)(len % 65535 / 256);
Bytelen[2] = (byte)(len % 16777215 / 65535);
Bytelen[3] = (byte)(len / 16777215);
FS.Write(Bytelen, 0, 4);
byte[] HeadData = {
0x57,0x41,0x56,0x45,//“WAVA”
0x66,0x6d,0x74,0x20,//“fmt ”
0x12,0x00,0x00,0x00,//过滤字节,一般为10H
0x01,0x00,//格式种类,1为PCM
0x01,0x00,//通道,单声道
0x44,0xac,0x00,0x00,//采样率,22050 8K:401f 44100:44ac
0x88,0x58,0x01,0x00,//每秒数据量(单位bytes),44100 16k
0x02,0x00,//Data的数据块长度
0x10,0x00,//数据位数:16bit
0x00,0x00,
0x66,0x61,0x63,0x74,//"fact"
0x04,0x00,0x00,0x00,0xf8,0x2f,0x14,0x00,//这个加了才行,跟网站说明不一样
0x64,0x61,0x74,0x61//Data
};
FS.Write(HeadData, 0, HeadData.Length);
len -= 46;
Bytelen[0] = (byte)(len % 256);
Bytelen[1] = (byte)(len % 65535 / 256);
Bytelen[2] = (byte)(len % 16777215 / 65535);
Bytelen[3] = (byte)(len / 16777215);
FS.Write(Bytelen, 0, 4);
byte[] SinBit1;
byte[] SinBit0;
Int16 Value;
for (int count = 0; count < BinData.Length; count++)
{
if (count % 2 == 0)
{
SinBit1 = new byte[BinData[count] * BitLen * 2];
for (int i = 0; i < SinBit1.Length / 2; i++)
{
if (i < Changing_Value)
Value = (short)(32767 * i / Changing_Value * Math.Sin(FREQ1 * 2 * Math.PI * i / SampleRate));
else if (i > SinBit1.Length / 2 - ZeroBitWidth)
Value = 0;
else if (i > SinBit1.Length / 2 - Changing_Value - ZeroBitWidth)
Value = (short)(32767 * (SinBit1.Length / 2 - i - ZeroBitWidth) / Changing_Value * Math.Sin(FREQ1 * 2 * Math.PI * i / SampleRate));
else
Value = (short)(32767 * Math.Sin(FREQ1 * 2 * Math.PI * i / SampleRate));
SinBit1[2 * i] = (byte)Value;
SinBit1[2 * i + 1] = (byte)(Value >> 8);
}
FS.Write(SinBit1, 0, SinBit1.Length);
}
else
{
SinBit0 = new byte[BinData[count] * BitLen * 2];
for (int i = 0; i < SinBit0.Length / 2; i++)
{
if (i < Changing_Value)
Value = (short)(32767 * i / Changing_Value * Math.Sin(FREQ0 * 2 * Math.PI * i / SampleRate));
else if (i > SinBit0.Length / 2 - ZeroBitWidth)
Value = 0;
else if(i > SinBit0.Length / 2 - Changing_Value - ZeroBitWidth)
Value = (short)(32767 * (SinBit0.Length / 2 - i - ZeroBitWidth) / Changing_Value * Math.Sin(FREQ0 * 2 * Math.PI * i / SampleRate));
else
Value = (short)(32767 * Math.Sin(FREQ0 * 2 * Math.PI * i / SampleRate));
SinBit0[2 * i] = (byte)Value;
SinBit0[2 * i + 1] = (byte)(Value >> 8);
}
FS.Write(SinBit0, 0, SinBit0.Length);
}
}
FS.Close();
}
中间那部分的数据你要自己改,我这里是做了fsk信号调制的。你主要看文件头,然后写你的内容,保存文件就好了 |
|