C# WAV文件到字节数组

C# WAV文件到字节数组,c#,naudio,spectrogram,C#,Naudio,Spectrogram,我目前正在使用Naudio记录用户的语音,并将其转换为字节数组,以便我可以对其应用FFT,并将其转换为双数组,然后转换为频谱图。目前,我无法将WAV文件转换为字节数组。谢谢 private void mic_Click(object sender, EventArgs e) { if (MicB.Text.Equals("Start")) { int deviceNumber = 0; sourceSt

我目前正在使用Naudio记录用户的语音,并将其转换为字节数组,以便我可以对其应用FFT,并将其转换为双数组,然后转换为频谱图。目前,我无法将WAV文件转换为字节数组。谢谢

  private void mic_Click(object sender, EventArgs e)
    {

        if (MicB.Text.Equals("Start"))
        {
            int deviceNumber = 0;
            sourceStream = new NAudio.Wave.WaveIn();
            sourceStream.DeviceNumber = deviceNumber;
            sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);
            sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable);             
            waveWriter = new NAudio.Wave.WaveFileWriter(test.wav, sourceStream.WaveFormat);

            sourceStream.StartRecording();
            MicB.Text = "Stop";
        }

        else if (MicB.Text.Equals("Stop"))
        {               
            if (waveOut != null)
            {
                waveOut.Stop();
                waveOut.Dispose();
                waveOut = null;
            }
            if (sourceStream != null)
            {
                sourceStream.StopRecording();
                sourceStream.Dispose();
                sourceStream = null;
            }
            if (waveWriter != null)
            {
                waveWriter.Dispose();
                waveWriter = null;
            }
            MicB.Text = "Start";
        }
    }

    private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        if (waveWriter == null) return;
        waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
        waveWriter.Flush();                    
    }
private void mic\u单击(对象发送方,事件参数e)
{
if(MicB.Text.Equals(“开始”))
{
int deviceNumber=0;
sourceStream=new NAudio.Wave.WaveIn();
sourceStream.DeviceNumber=设备编号;
sourceStream.WaveFormat=新的NAudio.Wave.WaveFormat(44100,NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);
sourceStream.DataAvailable+=新的事件处理程序(sourceStream\u DataAvailable);
waveWriter=新的NAudio.Wave.waveilewriter(test.wav,sourceStream.WaveFormat);
sourceStream.StartRecording();
MicB.Text=“停止”;
}
else if(MicB.Text.Equals(“停止”))
{               
如果(waveOut!=null)
{
waveOut.Stop();
waveOut.Dispose();
waveOut=null;
}
if(sourceStream!=null)
{
sourceStream.StopRecording();
Dispose();
sourceStream=null;
}
if(waveWriter!=null)
{
waveWriter.Dispose();
waveWriter=null;
}
MicB.Text=“开始”;
}
}
私有void sourceStream_DataAvailable(对象发送方,NAudio.Wave.WaveInEventArgs e)
{
if(waveWriter==null)返回;
waveWriter.Write(e.Buffer,0,e.bytes记录);
waveWriter.Flush();
}
编辑:我从Coding4Fun获得了这段代码,并对其进行了少量编辑,但我不确定这是否就是我要寻找的将其转换为浮点并应用FFT的代码。对不起,我对音频信号完全陌生

 private void spectro_Click(object sender, EventArgs e)
    {
        //convert to float
        using (WaveFileReader reader = new WaveFileReader(test.wav))
        {

            IWaveProvider stream32 = new Wave16ToFloatProvider(reader);

            using (WaveFileWriter converted = new WaveFileWriter(temp.wav, stream32.WaveFormat))
            {
                byte[] buffer = new byte[8192];
                int bytesRead;
                do
                {
                    bytesRead = stream32.Read(buffer, 0, buffer.Length);
                    converted.Write(buffer, 0, bytesRead);
                } while (bytesRead != 0 && converted.Length < reader.Length);
            }
        }
    }
private void spectro_单击(对象发送方,事件参数e)
{
//转换为浮点数
使用(WaveFileReader=新的WaveFileReader(test.wav))
{
IWaveProvider stream32=新的Wave16ToFloatProvider(读卡器);
使用(WaveFileWriter转换=新的WaveFileWriter(temp.wav、stream32.WaveFormat))
{
字节[]缓冲区=新字节[8192];
int字节读取;
做
{
bytesRead=stream32.Read(buffer,0,buffer.Length);
转换。写入(缓冲区,0,字节读取);
}while(bytesRead!=0&&converted.Length

问题:在将FFT转换为浮点后,我如何应用FFT?

这很难回答,但我可以大胆猜测。您使用的是
波形编写器
。库中是否存在
WaveStreamWriter
?在这种情况下,您可以提供一个
MemoryStream
作为参数,并使用流上的
ToArray
来获取字节。

不,不太可能,因为我不知道库。也许你可以尝试我描述的步骤,看看它们是否有效。你能改变
sourceStream\u DataAvailable
事件处理程序,将
e.Buffer
写入一个MemoryStream,然后在停止录制时在流上使用
.ToByteArray()
?录制的音频已经以字节数组的形式出现。此外,您还需要对浮点采样执行FFT,因此任务是将每个16位采样转换为32位浮点,然后再将其传递给FFT。感谢Graham尝试。使用Wave16toFloatProvider类正确吗?如何实现将每个16位样本转换为浮点?